Проявление

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

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
33
ScorpioT1000, я ещё не проверял, щас проверю, поправлю и переизложу более простыми словами, чтобы переводилось нормально

ScorpioT1000, у меня это не работает к сожалению, вызываю сразу при каждом событии
		if BlzGetTriggerPlayerMouseButton() == MOUSE_BUTTON_TYPE_LEFT then

			if GetLocalPlayer() == GetTriggerPlayer() then
				EnableUserControl(true)
				print("клик левой")
			end
38
У меня и на хайве всё работает

возможно, print нельзя вызывать локально, вынеси его за проверку
33
ScorpioT1000, работает понял как, надо в событие без проверки условия что нажата левая... весьма странно, кароче после mouse_down сразу вызываем и всё норм
22
все верно print сихронно так как он каждого клиента определяет тайм времени жизни. Тем больше текста тем он дольше показывает
33
ScorpioT1000, и то есть косяки... иногда всё таки залипает.. но не могу понять почему, не идеально работает

pro100master, принт вообще не причем и я в соло проверял, ясно его там не будет, я принт засунул для того чтобы проверить "а вызывается ли оно вообще"

ScorpioT1000, ахах плохой способ.. если очень быстро нажать например W+LMB с минимально задержкой, тогда всё равно залипает
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, допиши плиз как один из вариантов хотя бы внизу, не хочется ещё один ресурс создавать, а в комментах потеряется
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.