[C1] Shortcuts QoL - AHK Scripts

Cagucm

Stone Golem
Messages
253
Reaction score
313
giphy.gif

[C1] Shortcuts Quality of Life - Auto Hot Key Scripts​

Привет мамкиным нагибаторам, киберкотлетам и прочему автокликерному шлаку. Сегодня я научу вас использовать макро-инструменты не нарушая правил сервера, хотя вам врядли это как-то поможет. Всем остальным, кто не планирует в ближайшее время отлетать в бан, данная статья будет вдвойне полезна, так как даст избежать некоторых технических неприятностей С1 клиента и поможет в управлении персонажем высокого уровня, имеющего что-то кроме действий /assist и /attack.

Какие проблемы C1 клиента здесь затрагиваются​

  1. Одна активная панель на 10 кнопок.
  2. Отсутствие циклического использования soul/spirit shots.
  3. Ошибочный переход персонажа в боевой режим при переключении окна.
  4. Автоматическая фокусировка на чате при переключении окна.

Инструменты решения​

Только-только зайдя на ОБТ я сделал себе несколько макрос-биндов для моей клавиатуры с использованием ПО для моей клавиатуры. Как и всегда, это оказалось лишь временным решением, так как абсолютное большинство макро-клавиатур и макро-мышей совершенно не приспособлены для качественного и надежного решения проблем автоматизации процессов ввода, и ни на что сложнее бота-автокликера они не способны. Любые попытки сделать нечто более сложное и практичное натыкаются на отсутсвие документации, неявные ограничения и проблемы синхронизации.
Но есть другой, намного более продвинутый, бесплатный, и не зависящий от вашей периферии программный инструмент - AHK.

giphy.gif

AHK Script #1 - l2-on-window-active-fix-c1​

Не один раз наблюдал, как невезучие игроки подбегают к страже для взятия квеста, но вместо этого наносят удар и моментально отлетают... Упси...
"Какого хуя?" - спросите вы, и будете правы. "Вас это ебать не должно" - отвечу я, потому что сам до конца не знаю.

Вот что мне удалось выяснить:
С1 клиент не адекватно воспринимает нажатия кнопки ALT. Иногда он начинает считать, что нажатие ALT это то же самое, что нажатие CTRL. Но вот поднятие кпоки Alt не воспринимается как поднятие кнопки CTRL... Почему это так работает - черт его знает, но вот здесь можно что-то прочитать по этой теме AHK v2.0 Docs - Hotkeys. В любом случае, поведение примерно понятно, и его можно попытаться исправить отправкой сигнала о поднятии кнопки Ctrl при каждой активации окна Lineage II.​
Еще одна раздражающая особенность C1 клиента - автоматическая фокусировка на чате после alt+tab, приводящая к тому, что окно ввода сообщения захламляется цифрами, а ваш персонаж пытается рассказать как будет бить врагов вместо того чтобы это реально сделать... Решается открытием/закрытием системного меню двойным нажатием ALT+X при открытии окна игры.

Что же умеет этот скрипт?​

  1. Останавливать вашего персонажа от ничем не мотивированной избыточной агрессии в сторону NPC.
  2. Убирать фокус с окна чата при активации окна игры.
Code:
#Requires AutoHotkey v2.0
#SingleInstance Force

;-------------------------------------------------------------------------------

initialize() {
  global g_s_window_name := "Lineage II"

  settimer(() => f_on_window_active(), -1)
} initialize()

;-------------------------------------------------------------------------------

f_on_window_active()
{
  global g_s_window_name

  while(true)
  {
    winwaitactive g_s_window_name

    ;---------------------------------------
    ; FIX CHAT AUTO-ENTER ON ALT+TAB
    ;---------------------------------------
    sendevent("!{X}!{X}")

    ;---------------------------------------
    ; FIX STICKY CTRL ON ALT+TAB
    ;---------------------------------------
    controlsend("{ctrl up}", , g_s_window_name)

    winwaitnotactive g_s_window_name
  }
}

AHK Script #2 - l2-shortcuts-swap-c1​

В попытках сделать клавиатурный макрос для переключения панелей я наткнулся на очень печальную вещь - симулируемые клавиатурой нажатия последовательности "{ALT DOWN}{2 DOWN}{2 UP}{ALT UP}" посылаются достаточно долго, чтобы любое другое неосторожное нажатие выкинуло тебе какую-нибудь пустую панель, например номер восемь, а хули бы и нет собственно.
С решением этой проблемы AHK отлично справляется, так как у него имеется отдельная настройка, ограничивающая количество одновременно исполняемых скриптов, а также возможность послать нужное нам сочетание клавиш в несколько ином, более подходящем нам формате.

Что же умеет этот скрипт?​

  1. Работать исключительно при открытом окне Lineage и не влиять на ввод в других программах.
  2. Переключать активную панель дейтсвий при нажатии F1-F10.
  3. Использовать действия активной панели при нажатии 0-9 не конфликтуя с переключением панелей.
  4. Останавливать вашего персонажа от ничем не мотивированной избыточной агрессии в сторону NPC.
  5. Убирать фокус с окна чата при активации окна игры.
Code:
#Requires AutoHotkey v2.0
#SingleInstance Force
#MaxThreadsPerHotkey 1

;-------------------------------------------------------------------------------

initialize() {
  global g_s_window_name := "Lineage II"

  settimer(() => f_on_window_active(), -1)
} initialize()

;-------------------------------------------------------------------------------

f_on_window_active()
{
  global g_s_window_name

  while(true)
  {
    winwaitactive g_s_window_name

    ;---------------------------------------
    ; FIX CHAT AUTO-ENTER ON ALT+TAB
    ;---------------------------------------
    sendevent("!{X}!{X}")

    ;---------------------------------------
    ; FIX STICKY CTRL ON ALT+TAB
    ;---------------------------------------
    controlsend("{ctrl up}", , g_s_window_name)

    winwaitnotactive g_s_window_name
  }
}


;-------------------------------------------------------------------------------

#HotIf WinActive(g_s_window_name)

;-------------------------------------------------------------------------------
; SWITCH SHORTCUT PANELS
;-------------------------------------------------------------------------------
*F1::  sendevent "!{F1}"
*F2::  sendevent "!{F2}"
*F3::  sendevent "!{F3}"
*F4::  sendevent "!{F4}"
*F5::  sendevent "!{F5}"
*F6::  sendevent "!{F6}"
*F7::  sendevent "!{F7}"
*F8::  sendevent "!{F8}"
*F9::  sendevent "!{F9}"
*F10:: sendevent "!{F10}"

;-------------------------------------------------------------------------------
; SYNC WITH SHORTCUT KEYS: HOT KEYS ARE SINGLE-THREADED
;-------------------------------------------------------------------------------
*1:: controlsend "1"
*2:: controlsend "2"
*3:: controlsend "3"
*4:: controlsend "4"
*5:: controlsend "5"
*6:: controlsend "6"
*7:: controlsend "7"
*8:: controlsend "8"
*9:: controlsend "9"
*0:: controlsend "0"

AHK Script #3 - l2-shortcuts-bind-c1​

Следующий скрипт чинит все 4 указанные выше проблемы клиента C1 касательно удобства управления действиями персонажа и максимально приближает опыт использования этой версии клиента к более продвинутым и удобным версиям.

Что же умеет этот скрипт?​

  1. Работать исключительно при открытом окне Lineage и не влиять на ввод в других программах.
  2. Использовать умения с панели номер 1 при зажатии 0-9.
  3. Использовать умения с панели номер 2 при зажатии F1-F10.
  4. Использовать умения с панели, выбранной пользователем:
    1. Текущую панель можно выбрать нажатием ALT+<F1-F10>
    2. Умения текущей панели можно использовать нажатием ALT+<0-9>
    3. После использования фиксированных хоткеев <0-9> и <F1-F10> панель автоматически переключается обратно на "текущую"
  5. Повторять нажатия с регулируемой скоростью g_i_shortcut_resend_ms, пока зажата клавиша.
  6. Обрабатывать нажатия разных клавиш в порядке обратной очереди:
    1. Нажатия проходят без задержки.
    2. Исключена возможность случайного переключения на другую панель.
    3. Примеры последовательностей ввода пользователя:
      {F2 DOWN} - исполнение слота 2 панели 2.
      {F2 DOWN} {1 DOWN} - исполнение слота 1 панели 1.
      {F2 DOWN} {1 DOWN} {1 UP} - исполнение слота 2 панели 2.
      {F2 DOWN} {1 DOWN} {F2 UP} - исполнение слота 1 панели 1.
      {F2 DOWN} {1 DOWN} {1 UP} {F2 UP} - отсутсвтие действий.
  7. Останавливать вашего персонажа от ничем не мотивированной избыточной агрессии в сторону NPC.
  8. Убирать фокус с окна чата при активации окна игры.
  9. Использовать соулшоты из слотов 9/0 циклически с равным интервалом при нажатии F11/F12.
    Напоминание:
    • Автоматическое использование соулшотов формально противоречит п.2.1., а средства ручного выявления их использования технически могут быть имплементированы на стороне сервера. На момент написания статьи администрация не дала четкого ответа, является ли это нарушением, и будет ли имплементирована соответствующая проверка.​
    • С точки зрения уравнивания технических возможностей для игроков сервера, считаю необходимым присутствие и этого функционала скрипта.​
    • Если не хотите в какой-то момент увидеть себя синим светлячком, летящим в бан, то лучше не трогать эти кнопки. Я предупредил :)
      giphy.gif
Code:
#Requires AutoHotkey v2.0
#SingleInstance Force
#MaxThreadsPerHotkey 1
#MaxThreads 32

; https://www.autohotkey.com/docs/v2/lib/A_MenuMaskKey.htm
; https://www.autohotkey.com/board/topic/20619-extraneous-control-key-presses-generated-by-or-hotkeys/
A_MenuMaskKey := "vkE8"

;-------------------------------------------------------------------------------

class c_shortcut_info
{
  static s_i_shortcut_id        := 0
  static s_c_shortcut_info_arr  := array()

  static s_i_shortcut_actv_map  := map()
  static s_s_shortcut_panel_cur := "!{F1}"
  static s_s_shortcut_panel_arr := array()

  __New(shortcut_panel_key, shortcut_key)
  {
    this.l_s_shortcut_panel_key := shortcut_panel_key
    this.l_s_shortcut_key       := shortcut_key
    this.l_i_shortcut_id        := ++c_shortcut_info.s_i_shortcut_id
    this.l_f_shortcut_func      := () => f_shortcutsend(&this)

    c_shortcut_info.s_c_shortcut_info_arr.length := this.l_i_shortcut_id
    c_shortcut_info.s_c_shortcut_info_arr[this.l_i_shortcut_id] := &this
  }
}

;-------------------------------------------------------------------------------

initialize() {
  global g_s_window_name := "Lineage II"

  global g_i_shortcut_resend_ms := 200
  global g_i_shortcut_cyclic_ms := 50

  global g_c_shortcut_info_1_1 := c_shortcut_info("!{F1}", "{1}" )
  global g_c_shortcut_info_1_2 := c_shortcut_info("!{F1}", "{2}" )
  global g_c_shortcut_info_1_3 := c_shortcut_info("!{F1}", "{3}" )
  global g_c_shortcut_info_1_4 := c_shortcut_info("!{F1}", "{4}" )
  global g_c_shortcut_info_1_5 := c_shortcut_info("!{F1}", "{5}" )
  global g_c_shortcut_info_1_6 := c_shortcut_info("!{F1}", "{6}" )
  global g_c_shortcut_info_1_7 := c_shortcut_info("!{F1}", "{7}" )
  global g_c_shortcut_info_1_8 := c_shortcut_info("!{F1}", "{8}" )
  global g_c_shortcut_info_1_9 := c_shortcut_info("!{F1}", "{9}" )
  global g_c_shortcut_info_1_0 := c_shortcut_info("!{F1}", "{0}" )

  global g_c_shortcut_info_2_1 := c_shortcut_info("!{F2}", "{F1}"  )
  global g_c_shortcut_info_2_2 := c_shortcut_info("!{F2}", "{F2}"  )
  global g_c_shortcut_info_2_3 := c_shortcut_info("!{F2}", "{F3}"  )
  global g_c_shortcut_info_2_4 := c_shortcut_info("!{F2}", "{F4}"  )
  global g_c_shortcut_info_2_5 := c_shortcut_info("!{F2}", "{F5}"  )
  global g_c_shortcut_info_2_6 := c_shortcut_info("!{F2}", "{F6}"  )
  global g_c_shortcut_info_2_7 := c_shortcut_info("!{F2}", "{F7}"  )
  global g_c_shortcut_info_2_8 := c_shortcut_info("!{F2}", "{F8}"  )
  global g_c_shortcut_info_2_9 := c_shortcut_info("!{F2}", "{F9}"  )
  global g_c_shortcut_info_2_0 := c_shortcut_info("!{F2}", "{F10}" )

  settimer(() => f_on_window_active(), -1)
} initialize()

;-------------------------------------------------------------------------------

f_on_window_active()
{
  global g_s_window_name

  while(true)
  {
    winwaitactive g_s_window_name

    ;---------------------------------------
    ; RESTORE THE LAST SHORTCUT PANEL
    ;---------------------------------------
    sendevent(c_shortcut_info.s_s_shortcut_panel_cur)

    ;---------------------------------------
    ; FIX CHAT AUTO-ENTER ON ALT+TAB
    ;---------------------------------------
    sendevent("!{X}!{X}")

    ;---------------------------------------
    ; FIX STICKY CTRL ON ALT+TAB
    ;---------------------------------------
    f_controlsend_winactive("{ctrl up}")

    winwaitnotactive g_s_window_name

    ;---------------------------------------
    ; FORCE ALL THE CURRENLTY ACTIVE SHORTCUTS TO STOP
    ;---------------------------------------
    for l_i_shortcut_id in c_shortcut_info.s_i_shortcut_actv_map
      f_hotkey_press_stopped(c_shortcut_info.s_c_shortcut_info_arr[l_i_shortcut_id], false)
  }
}

f_controlsend_winactive(l_s_key)
{
  global g_s_window_name

  l_s_key_mod := getkeystate("ctrl", "p") ? "^" l_s_key : l_s_key
  if (WinActive(g_s_window_name))
    controlsend l_s_key_mod,, g_s_window_name
}

f_shortcutsend(&r_c_shortcut_info)
{
  critical 1
  if (c_shortcut_info.s_i_shortcut_actv_map[r_c_shortcut_info.l_i_shortcut_id] ==
      c_shortcut_info.s_i_shortcut_actv_map.count)
    f_controlsend_winactive(r_c_shortcut_info.l_s_shortcut_key)
}


;-------------------------------------------------------------------------------

f_hotkey_press_started(&r_c_shortcut_info)
{
  global g_s_window_name
  global g_i_shortcut_resend_ms

  critical 1
  if (c_shortcut_info.s_i_shortcut_actv_map.has(r_c_shortcut_info.l_i_shortcut_id))
    return

  c_shortcut_info.s_s_shortcut_panel_arr.push(c_shortcut_info.s_s_shortcut_panel_cur)
  c_shortcut_info.s_s_shortcut_panel_cur := r_c_shortcut_info.l_s_shortcut_panel_key
  c_shortcut_info.s_i_shortcut_actv_map[r_c_shortcut_info.l_i_shortcut_id] := 1 + c_shortcut_info.s_i_shortcut_actv_map.count

  if (WinActive(g_s_window_name))
    sendevent c_shortcut_info.s_s_shortcut_panel_cur

  sleep 1
  r_c_shortcut_info.l_f_shortcut_func.call
  settimer(r_c_shortcut_info.l_f_shortcut_func, g_i_shortcut_resend_ms)
  critical 0
}

f_hotkey_press_stopped(&r_c_shortcut_info, l_b_sendevent_panel_switch := true)
{
  critical 1
  settimer(r_c_shortcut_info.l_f_shortcut_func, 0)

  if (!c_shortcut_info.s_i_shortcut_actv_map.has(r_c_shortcut_info.l_i_shortcut_id))
    return

  l_i_shortcut_priority := c_shortcut_info.s_i_shortcut_actv_map[r_c_shortcut_info.l_i_shortcut_id]

  if (l_i_shortcut_priority == c_shortcut_info.s_s_shortcut_panel_arr.length)
  {
    c_shortcut_info.s_s_shortcut_panel_cur := c_shortcut_info.s_s_shortcut_panel_arr.pop()

    if (WinActive(g_s_window_name) and l_b_sendevent_panel_switch)
      sendevent c_shortcut_info.s_s_shortcut_panel_cur
  }
  else
  {
    c_shortcut_info.s_s_shortcut_panel_arr.removeat(1 + l_i_shortcut_priority)
  }

  c_shortcut_info.s_i_shortcut_actv_map.delete(r_c_shortcut_info.l_i_shortcut_id)
  for s_i_shortcut_id, s_i_shortcut_priority in c_shortcut_info.s_i_shortcut_actv_map
    if (s_i_shortcut_priority > l_i_shortcut_priority)
      c_shortcut_info.s_i_shortcut_actv_map[s_i_shortcut_id] := s_i_shortcut_priority - 1
  critical 0
}

f_hotkey_panel_switch(l_s_shortcut_panel_cur)
{
  critical 1
  for l_i_shortcut_id in c_shortcut_info.s_i_shortcut_actv_map
    f_hotkey_press_stopped(c_shortcut_info.s_c_shortcut_info_arr[l_i_shortcut_id], false)

  c_shortcut_info.s_s_shortcut_panel_cur := l_s_shortcut_panel_cur
  sendevent c_shortcut_info.s_s_shortcut_panel_cur
  critical 0
}

;-------------------------------------------------------------------------------

#HotIf WinActive(g_s_window_name)

;-------------------------------------------------------------------------------
; CYCLIC SOULSHOT TRIGGER
;-------------------------------------------------------------------------------

*F11::
{
  global g_s_window_name
  static t := false

  settimer(() => f_controlsend_winactive("{F9}"),
           g_i_shortcut_cyclic_ms * (t ^= 1))
}

*F12::
{
  global g_s_window_name
  static t := false

  settimer(() => f_controlsend_winactive("{F10}"),
           g_i_shortcut_cyclic_ms * (t ^= 1))
}

;-------------------------------------------------------------------------------
; SHORTCUTS PANEL 1
;-------------------------------------------------------------------------------

*1::
{
  global g_c_shortcut_info_1_1
  f_hotkey_press_started(&g_c_shortcut_info_1_1)
}

*2::
{
  global g_c_shortcut_info_1_2
  f_hotkey_press_started(&g_c_shortcut_info_1_2)
}

*3::
{
  global g_c_shortcut_info_1_3
  f_hotkey_press_started(&g_c_shortcut_info_1_3)
}

*4::
{
  global g_c_shortcut_info_1_4
  f_hotkey_press_started(&g_c_shortcut_info_1_4)
}

*5::
{
  global g_c_shortcut_info_1_5
  f_hotkey_press_started(&g_c_shortcut_info_1_5)
}

*6::
{
  global g_c_shortcut_info_1_6
  f_hotkey_press_started(&g_c_shortcut_info_1_6)
}

*7::
{
  global g_c_shortcut_info_1_7
  f_hotkey_press_started(&g_c_shortcut_info_1_7)
}

*8::
{
  global g_c_shortcut_info_1_8
  f_hotkey_press_started(&g_c_shortcut_info_1_8)
}

*9::
{
  global g_c_shortcut_info_1_9
  f_hotkey_press_started(&g_c_shortcut_info_1_9)
}

*0::
{
  global g_c_shortcut_info_1_0
  f_hotkey_press_started(&g_c_shortcut_info_1_0)
}

*1 up::
{
  global g_c_shortcut_info_1_1
  f_hotkey_press_stopped(&g_c_shortcut_info_1_1)
}

*2 up::
{
  global g_c_shortcut_info_1_2
  f_hotkey_press_stopped(&g_c_shortcut_info_1_2)
}

*3 up::
{
  global g_c_shortcut_info_1_3
  f_hotkey_press_stopped(&g_c_shortcut_info_1_3)
}

*4 up::
{
  global g_c_shortcut_info_1_4
  f_hotkey_press_stopped(&g_c_shortcut_info_1_4)
}

*5 up::
{
  global g_c_shortcut_info_1_5
  f_hotkey_press_stopped(&g_c_shortcut_info_1_5)
}

*6 up::
{
  global g_c_shortcut_info_1_6
  f_hotkey_press_stopped(&g_c_shortcut_info_1_6)
}

*7 up::
{
  global g_c_shortcut_info_1_7
  f_hotkey_press_stopped(&g_c_shortcut_info_1_7)
}

*8 up::
{
  global g_c_shortcut_info_1_8
  f_hotkey_press_stopped(&g_c_shortcut_info_1_8)
}

*9 up::
{
  global g_c_shortcut_info_1_9
  f_hotkey_press_stopped(&g_c_shortcut_info_1_9)
}

*0 up::
{
  global g_c_shortcut_info_1_0
  f_hotkey_press_stopped(&g_c_shortcut_info_1_0)
}

;-------------------------------------------------------------------------------
; SHORTCUTS PANEL 2
;-------------------------------------------------------------------------------

*F1::
{
  global g_c_shortcut_info_2_1
  f_hotkey_press_started(&g_c_shortcut_info_2_1)
}

*F2::
{
  global g_c_shortcut_info_2_2
  f_hotkey_press_started(&g_c_shortcut_info_2_2)
}

*F3::
{
  global g_c_shortcut_info_2_3
  f_hotkey_press_started(&g_c_shortcut_info_2_3)
}

*F4::
{
  global g_c_shortcut_info_2_4
  f_hotkey_press_started(&g_c_shortcut_info_2_4)
}

*F5::
{
  global g_c_shortcut_info_2_5
  f_hotkey_press_started(&g_c_shortcut_info_2_5)
}

*F6::
{
  global g_c_shortcut_info_2_6
  f_hotkey_press_started(&g_c_shortcut_info_2_6)
}

*F7::
{
  global g_c_shortcut_info_2_7
  f_hotkey_press_started(&g_c_shortcut_info_2_7)
}

*F8::
{
  global g_c_shortcut_info_2_8
  f_hotkey_press_started(&g_c_shortcut_info_2_8)
}

*F9::
{
  global g_c_shortcut_info_2_9
  f_hotkey_press_started(&g_c_shortcut_info_2_9)
}

*F10::
{
  global g_c_shortcut_info_2_0
  f_hotkey_press_started(&g_c_shortcut_info_2_0)
}

*F1 up::
{
  global g_c_shortcut_info_2_1
  f_hotkey_press_stopped(&g_c_shortcut_info_2_1)
}

*F2 up::
{
  global g_c_shortcut_info_2_2
  f_hotkey_press_stopped(&g_c_shortcut_info_2_2)
}

*F3 up::
{
  global g_c_shortcut_info_2_3
  f_hotkey_press_stopped(&g_c_shortcut_info_2_3)
}

*F4 up::
{
  global g_c_shortcut_info_2_4
  f_hotkey_press_stopped(&g_c_shortcut_info_2_4)
}

*F5 up::
{
  global g_c_shortcut_info_2_5
  f_hotkey_press_stopped(&g_c_shortcut_info_2_5)
}

*F6 up::
{
  global g_c_shortcut_info_2_6
  f_hotkey_press_stopped(&g_c_shortcut_info_2_6)
}

*F7 up::
{
  global g_c_shortcut_info_2_7
  f_hotkey_press_stopped(&g_c_shortcut_info_2_7)
}

*F8 up::
{
  global g_c_shortcut_info_2_8
  f_hotkey_press_stopped(&g_c_shortcut_info_2_8)
}

*F9 up::
{
  global g_c_shortcut_info_2_9
  f_hotkey_press_stopped(&g_c_shortcut_info_2_9)
}

*F10 up::
{
  global g_c_shortcut_info_2_0
  f_hotkey_press_stopped(&g_c_shortcut_info_2_0)
}

;-------------------------------------------------------------------------------
; SWITCH CURRENT SHORTCUT PANEL: ALT+<F1-F10> WITH OR WITHOUT CTRL
; USE CURRENT SHORTCUT PANEL:    ALT+<0-9>    WITH OR WITHOUT CTRL
;-------------------------------------------------------------------------------

$!F1::   f_hotkey_panel_switch("!{F1}")
$!F2::   f_hotkey_panel_switch("!{F2}")
$!F3::   f_hotkey_panel_switch("!{F3}")
$!F4::   f_hotkey_panel_switch("!{F4}")
$!F5::   f_hotkey_panel_switch("!{F5}")
$!F6::   f_hotkey_panel_switch("!{F6}")
$!F7::   f_hotkey_panel_switch("!{F7}")
$!F8::   f_hotkey_panel_switch("!{F8}")
$!F9::   f_hotkey_panel_switch("!{F9}")
$!F10::  f_hotkey_panel_switch("!{F10}")

$^!F1::  f_hotkey_panel_switch("!{F1}")
$^!F2::  f_hotkey_panel_switch("!{F2}")
$^!F3::  f_hotkey_panel_switch("!{F3}")
$^!F4::  f_hotkey_panel_switch("!{F4}")
$^!F5::  f_hotkey_panel_switch("!{F5}")
$^!F6::  f_hotkey_panel_switch("!{F6}")
$^!F7::  f_hotkey_panel_switch("!{F7}")
$^!F8::  f_hotkey_panel_switch("!{F8}")
$^!F9::  f_hotkey_panel_switch("!{F9}")
$^!F10:: f_hotkey_panel_switch("!{F10}")

!1::  f_controlsend_winactive("{1}")
!2::  f_controlsend_winactive("{2}")
!3::  f_controlsend_winactive("{3}")
!4::  f_controlsend_winactive("{4}")
!5::  f_controlsend_winactive("{5}")
!6::  f_controlsend_winactive("{6}")
!7::  f_controlsend_winactive("{7}")
!8::  f_controlsend_winactive("{8}")
!9::  f_controlsend_winactive("{9}")
!0::  f_controlsend_winactive("{0}")

^!1:: f_controlsend_winactive("{1}")
^!2:: f_controlsend_winactive("{2}")
^!3:: f_controlsend_winactive("{3}")
^!4:: f_controlsend_winactive("{4}")
^!5:: f_controlsend_winactive("{5}")
^!6:: f_controlsend_winactive("{6}")
^!7:: f_controlsend_winactive("{7}")
^!8:: f_controlsend_winactive("{8}")
^!9:: f_controlsend_winactive("{9}")
^!0:: f_controlsend_winactive("{0}")

;-------------------------------------------------------------------------------
; EXTRA SYMBOLS: SHIFT+<0-9>
;-------------------------------------------------------------------------------

+1::  f_controlsend_winactive("+{1}")
+2::  f_controlsend_winactive("+{2}")
+3::  f_controlsend_winactive("+{3}")
+4::  f_controlsend_winactive("+{4}")
+5::  f_controlsend_winactive("+{5}")
+6::  f_controlsend_winactive("+{6}")
+7::  f_controlsend_winactive("+{7}")
+8::  f_controlsend_winactive("+{8}")
+9::  f_controlsend_winactive("+{9}")
+0::  f_controlsend_winactive("+{0}")

;-------------------------------------------------------------------------------
; CUSTOM EXTRA SYMBOLS: SHIFT+<0-9>
; UNCOMMENT THE LINES BELOW AND COMMENT THE CORRESPONDING ONES ABOVE WITH ;
;-------------------------------------------------------------------------------

;+2::  f_controlsend_winactive("`"")
;+3::  f_controlsend_winactive("{#}")

Download:
l2-on-window-active-fix-c1-v1.1.ahk
l2-shortcuts-swap-c1-v1.1.ahk
l2-shortcuts-bind-c1-v1.3.ahk

Archived versions:
l2-on-window-active-fix-c1-v1.0.ahk
l2-shortcuts-swap-c1-v1.0.ahk
l2-shortcuts-bind-c1-v1.2.ahk
l2-shortcuts-bind-c1-v1.1.ahk
l2-shortcuts-bind-c1-v1.0.ahk

Если что-то не работает, залипает, или вылетает с ошибкой, то пишите - попробую исправить.
Добавление нового функционала пока что не планируется из-за отсутствия идей.

Напоминаю, что использование циклических макросов для фарма запрещено п.2.1. правил сервера, что дает вам ненулевую вероятность получить бан, и по закону Мерфи вы обязательно его получите.

Страдайте в игре, а не от игры.
 
Last edited:
Да когда же вы наконец научитесь пользоваться руками, все бы им автоматически было, макро клавы, макро мыши... идите уже на ессенс играть, там для вас как раз все автоматически придумали, только запустить игру осталось....
 
Да когда же вы наконец научитесь пользоваться руками, все бы им автоматически было, макро клавы, макро мыши... идите уже на ессенс играть, там для вас как раз все автоматически придумали, только запустить игру осталось....
Тред прочитан жопой, самовыпились отсюда пж :)
 
Не один раз наблюдал, как невезучие игроки подбегают к страже для взятия квеста, но вместо этого наносят удар и моментально отлетают... Упси...
Как это стражник может убить игрока за взятие квеста? Нормальных игроков не бьют, а макросникам и автокликерам надо еще и бан сразу давать....
 
Для тупорылого еще раз повторяю. Жмешь галки и больше не будешь бить НПС и гвардов. А тему надо закрывать а тебя банить уже за софты.
Улетел в игнор до тех пор, пока не научишься хотя бы читать
 
Как это стражник может убить игрока за взятие квеста? Нормальных игроков не бьют, а макросникам и автокликерам надо еще и бан сразу давать....
Туда же.

Тему прошу почистить от шлака.
 
Сейчас почистят, не волнуйся. Сейчас улетишь.
 
Охренеть идет борьба против кликеров, а тут такая тема, используйте это так, а то так....
 
Не знаю чего тут все развылись. Никто не читал пост полностью походу.

Тут исправления Автоатаки в ПвП режиме, исправление автоматического фокуса окна на Чате после Альт-Таба, переключения панелек на F1-10, и пункт с Предупреждением, что это запрещено - Автокликание на слотах 9 и 0, где соски у людей.

Но скажу честно - я бы удалил автоюз 9 и 0, не дожидаясь ответа админов... Это реально лишнее. Остальное - полезно.
 
Но скажу честно - я бы удалил автоюз 9 и 0, не дожидаясь ответа админов... Это реально лишнее.
Связывался по этому вопросу, описал как ловить, но окончательного ответа ждать видимо придется долго.
Пока что автососки в серой зоне находится и из соображений fair play оставил, считаю что технические возможности у всех должны быть одинаковые.
 
Это фиксится нажатием галки в настройках :автокод:...View attachment 15160
Автокод - автоматически вставляет символы + # @ $ при переключении вкладок чата. каким образом он фиксит залипание контрола?
 
Не обоснованная агрессия НПЦ на моем опыте была только когда я нажал сочетание кнопок Ctrl + Alt (для эксперимента). В остальных случаях, при нажатии кнопки Alt, а нажимаю ее часто для переключения панелек, такой проблемы не обнаружено.
 
На моем опыте была только когда я нажал сочетание кнопок Ctrl + Alt (для эксперимента). В остальных случаях, при нажатии кнопки Alt, а нажимаю ее часто для переключения панелек, такой проблемы не обнаружено.
Я замечаю эту проблему при Alt+Tab. Не всегда воспроизводится, но если уж начинает залипать, то залипает будь здоров :(
 
Автокод - автоматически вставляет символы + # @ $ при переключении вкладок чата. каким образом он фиксит залипание контрола?
Слушай, да. Тут я ошибся. Сейчас пробовал скачать нулевый клиент, сбросить всё. И у меня все равно не срабатывает force attack CTRL при сворачивании. Те. проблем вообще нет. Помню что на старом ноуте была такая проблема. А как сейчас вызвать эту проблему я хз.
 
Для тупорылого еще раз повторяю. Жмешь галки и больше не будешь бить НПС и гвардов. А тему надо закрывать а тебя банить уже за софты.
тогда какого хера с прожатыми галками я бью гвардов, вместо разговора?
такая херня начинается после альттаба. курсор сам превращается в меч, например.
 
тогда какого хера с прожатыми галками я бью гвардов, вместо разговора?
такая херня начинается после альттаба. курсор сам превращается в меч, например.
Понятия не имею теперь. Я ведь выше только что написал..
Полностью перекачал клиент и апдейт. Нет такой проблемы.
 
Для особо одаренных объясните, пожалуйста. Если л2 на одном мониторе, а на втором всякий шлак, скрипты будут работать только на л2?

Если на том же монике, где открыта л2, если открыть другую прогу, там скрипт не будет срабатывать?

Читал пост полностью, но не понял эти нюансики.
 
Для особо одаренных объясните, пожалуйста. Если л2 на одном мониторе, а на втором всякий шлак, скрипты будут работать только на л2?

Если на том же монике, где открыта л2, если открыть другую прогу, там скрипт не будет срабатывать?
Срабатывает только если окно л2 является активным в момент нажатия клавиши. Если окно закрывается/сворачивается/меняется, то кастомные клавиши прекращают работать. То есть во всех остальных приложениях клавиатура работает так, будто скрипта нет. Расположение на одном или разных мониторах никак на это не влияет.

Если нажать цифру или ф-ку и мгновенно сделать Alt+Tab из л2 в другое приложение, то в принципе может вылезти нажатие Alt+F1 или Alt+F2 в новое окно, но для такого нужно очень сильно постараться.
 
Back
Top