Проявление

Баг проявляется в любом патче и на 126 и на рефордже
Выглядит он так:
Если во время нажатия любой кнопки с клавиатуры, нажать левую кнопку мыши (в любом месте экрана), а потом отпустить нажатую клавишу, то события, что кнопка отжата не произойдёт, потребуется нажать кнопку ещё раз (эффект залипания)
Если совсем проще, то персонаж идёт туда куда и шёл до клика, несмотря на то что вы уже отпустили кнопку
Это касается как дефолтных гуи событий на стрелочках в 126 патче
Так и нового события
BlzTriggerRegisterPlayerKeyEvent(TriggerName,Player(i),OSKEY_D,0,true)
---@param whichTrigger trigger
---@param whichPlayer player
---@param key oskeytype
---@param metaKey integer
---@param keyDown boolean
---@return event
function BlzTriggerRegisterPlayerKeyEvent(whichTrigger, whichPlayer, key, metaKey, keyDown)
Этот баг в своё время сделал не играбельным огромную кучу карт на стрелочном управлении, и возможно бы сделал не играбельными и новые карты на рефорджевом патче, но есть решения:
И эти решения уже найдены давно.. многие картоделы сами до этого дошли, но я лишь тут для того, чтобы собрать всё до кучи, и подытожить материал:

Способ №1 принудительный поиск цели

Если курсор находиться в режиме поиска цели для приказа или способности, то клик левой кнопкой не вызывает этого бага.
И сделать это очень просто, достаточно отдать приказ ForceUIKeyBJ
ForceUIKeyBJ(Player(0),"M")
Где М - Горячая клавиша приказа без на точку или юнита, можно использовать как стандартные приказы так и пустышку, но пустышка должна быть неограниченной дальности
Минусы:
  • Полный отказ от системы движения
  • Полная потеря панели приказов и инвентаря героя
  • CustomKey, ломают данную систему
Плюсы:
  • Нет больше залипания левой кнопки
  • Работает на любом патче
Чтобы больше узнать у плюсах, надо узнать о минусах другой системы

Способ №2 Отмена после клика

Если после приказа левой кнопки
TriggerRegisterPlayerEvent(TrigPressRMB, Player(i), EVENT_PLAYER_MOUSE_DOWN)
if BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_LEFT then
--огрызок кода
Выполнить ForceUICancelBJ(Player(0)), то бага залипания левой кнопки мыши не произойдёт
Минусы:
  • Не возможно выйти из игры и манипулировать меню
  • Полная потери панель приказов и инвентаря, но**
  • Событие отслеживания левого клика, есть только на новых патчах
Плюсы:
  • Нет визуальной потери панели приказов, только лишь клики
  • Меньше нагружает систему.. так как срабатывает только после факта клика

Способ №3 Переактивация интерфейса

После события нажатия мыши, вызываем EnableUserControl(true) под локальным игроком
    trigger = CreateTrigger()
    TriggerRegisterPlayerEvent(trigger, Player(0), EVENT_PLAYER_MOUSE_DOWN)
    TriggerAddAction(trigger, function()
        print("Mouse")
        if(GetLocalPlayer() == GetTriggerPlayer()) then
            EnableUserControl(true)
        end
    end)
Плюсы:
  • самый не кастыльный способ
  • инвентарь на месте
Минусы:
  • Если быстро нажать левая+другая кнопка, то всё равно произойдёт залипание, плохо для динамических игр
  • Не тестировал
  • Требуется проверка перетягивания предметов с инвентаря

Событие клика по Frame

Можно всё вылечить любым из способов перечисленных выше, но если в карте существуют клики про фреймам, то происходит действие ещё более ужасное, происходит полная потеря фокуса и контроля над игрой, необходимо вернуть фокус, кликнув в пустом месте экрана.. Но и это лечится =), код внизу надо вызывать сразу после совершения клика
BlzFrameSetEnable(FrameName, false)
BlzFrameSetEnable(FrameName, true)
Всем спасибо кто дочитал, не тратье своё время на решение багов, пользуйтесь опытом других людей.
Если есть ещё другие решения, обязательно напишите об этом.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
28
дождаться наконец патча в рефордже, который поправит всё и даст возможность просто сесть и сделать норм мапу, без всякого гемора
да галактика раньше умрёт чем это случится
21
ScorpioT1000:
ну почему же, там есть запасной вывод как раз для этого проекта)
38
С metaKey пробовали химичить? Возможно, нажатие мыши - тоже metakey
33
ScorpioT1000, Если мышь метакей, то почему бага нет, когда курсор в режиме поиска цели?
38
Короче метакей не работает. А вот зарегать клавиши с айди 1 и 2 можно попробовать - в винапи это кнопки мыши

38

!!! решение

при клике
if(GetLocalPlayer() == GetTriggerPlayer()) then
  EnableUserControl(true)
end
обновляй статью)
Этот комментарий удален
9
NanO:
Поясни суть, плиз)
При событие когда плеер нажимает кнопку мыши надо вставить этот код.
38
Поправьте статью, это реально гуглят и не только в рф
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.