Проявление

Баг проявляется в любом патче и на 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)
Всем спасибо кто дочитал, не тратье своё время на решение багов, пользуйтесь опытом других людей.
Если есть ещё другие решения, обязательно напишите об этом.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
22
ScorpioT1000,
а я планирую сделать маленкую библиотеку типо
war3.module('game').reduires('game.input').defines(function() {
war3['game.input'].on()
})
defines срабатывает если init сработал и они поочереди из requires берет пути который можно реализовать require через VSCode и прочего!

точнее схожесть с либа js impact
33
У
BlzFrameSetEnable(FrameName, false)
BlzFrameSetEnable(FrameName,true)
тоже самое, если быстро кликать то всё равно залипает, для динамических карт не годится, будь то стрелялка Брилока или пеонрпгп
22
Bergi_Bear, для этого надо блокировать триггер для игрока пока не истекает время где то 0.4-6 сек и разблокировать хотя как реализовать триггер блокировку еше не придумал

а то тут двойной клик в потоке при этом события завершения отпушено опаздывает итог успеваете отлипать

Bergi_Bear, и кстати да зачем вам быстрая тыкалка в мышку? Хотите сломать мышку? Когда можно просто нажать и не отпускать и как раз шутер и будет в автоматическом стрельбе хоть махание мечами главное игра должен понять что у него свой интервал
33
pro100master, я пользуюсь решением №1 и меня всё устраивает, хоть быстро хоть медленно жми
и у меня да можно в карте вначале игры мышку зажать и отпустить в конце
38
Bergi_Bear, допиши плиз как один из вариантов хотя бы внизу, не хочется ещё один ресурс создавать, а в комментах потеряется
25
Хз как было раньше, но сейчас на 1.36 второй и третий способы вообще не дают никакого положительного эффекта. Первый не пробовал, но верю, что будет работать. Сюда бы вариант с текст фреймом дописать
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.