Активирован ли прицел

Содержание:
кратко: иногда необходимо узнать активирован ли у вас прицел. У нас в варкрафте есть возможно отслеживать нажатия ЛКМ, так ПКМ. ПКМ можно легко отслеживать приказом smart. А вот левая кнопка имеет сложности, таргет-абилы используются только при включенном прицеле. Когда прицел включен, вы можете прицелиться и ЛКМ запустить работу. С левой кнопкой есть некоторые сложности, если ваш триггер будет запускаться даже по щелчку ЛКМ.
Долго думал как отслеживать прицел, было очень много вариантов, но они подразумевают очень много кода, и проблем. Какие проблемы остались нерешенными:
  • надо отследить активацию кнопки (события фреймов на консольные системные кнопки не повесишь, тк они не работают. Почему то только у родительских фреймов кнопок работает одно событие (событие клика click работает, и все). Вам будет так не отследить нажатие. Был вариант отслеживать положение курсора на кнопках, и затем отслеживаем нажатие ЛКМ на кнопку событием мыши. Такой вариант сложный, но более менее приемлемый, однако, он не отслеживает горячие клавиши. Если игрок нажмет горячую клавишу, вы не сможете отследить нажатие. Нужно тогда чекать и кнопки клавиатуры. Нужна будет бд, и все продумывать. Я отказался от этого способа, ища более универсальный способ )
  • надо отследить и закрытие прицела. Вроде этот вариант полегче первого. Что там уж. Отслеживаем нажатие на кнопку отмены клавишей ESC, нажатие на кнопку отмены курсором мыши с помощью ЛКМ, и сброс прицела ПКМ, и сброс всего переключением юнита. Короче очень много кода, и они решаемы. тк активацию кнопки я не мог отследить, поэтому и закрытие прицела пришлось отложить
найден костыль. Когда нажимают на кнопку, станд курсор сменяется на прицел с крестиком, у вас 11 кнопок скрываются и остается одна кнопка - кнопка “отмена”.
» lua код
--активация прицела
local sight_activation = false
TimerStart(CreateTimer(), 1/32, true, function()
                
    if GetLocalPlayer()~=nil then
            
        local count = 0
                        
        for a = 0, 11 do
            local frame = BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, a)
            if BlzFrameIsVisible(frame) then
                count = count+1
            end
        end
                    
        if count==1 then
            if BlzFrameIsVisible(BlzGetOriginFrame(ORIGIN_FRAME_COMMAND_BUTTON, 11)) then
                print("прицел активирован")
                sight_activation=true
            else
                print("прицел не активирован")
                sight_activation=false
            end
        else    
            print("прицел не активирован")
            sight_activation=false
        end
    end    
end)
Конечно, тут проверяют кол-во видимых кнопок. Если останется одна - та самая 12-ая кнопка “отмена”. Мы не может точно определить что за кнопка. Но по логике, никто не будет строить в правом нижнем углу одну кнопку, иначе, у вас все поломается. Советую исключать такое.
Это хорошо работает не только у способностей, но и у предметов


Views: 53

biridius #1 - 1 week ago (изм. ) 0
Голосов: +0 / -0
Круто, чего только ни сделаешь на рефорже.
Только одно но. Это тип скрины? Мб хостинг поехал или это реклама на хгм так вписывается.
Прикрепленные файлы
rsfghd #2 - 1 week ago 1
Голосов: +1 / -0
biridius, это реклама
Bergi_Bear #3 - 1 week ago 0
Голосов: +0 / -0
Судить по курсору по наличию кнопки отмены? капец, это ерунда какая-то по факту когда курсор в режиме прицела это никак не мешает отслеживать событие левого клика, ты наверное что-то перепутал для чего это действительно нужно.
Жаль нельзя обратно, превращать курсор в прицел или вообще менять модель на лету, хотя сам фрейм курсора известен и его можно например скрыть или поменять альфу
МрачныйВорон #4 - 1 week ago (изм. ) 0
Голосов: +0 / -0
Bergi_Bear:
менять модель курсора никак, потом отследить координаты мыши никак (корявые костыли не в счет - они проигрывают в скорости), нацепить на мышь никак. что остается? при нажатии на фрейм-пустышку вызывать прицел через forcekey. А вот эта штука выше, помогает проверять закрытие. Удобно же.
можно отслеживать закрытие курсора. нажатие ESC, ЛКМ в игровой карте, переключение юнитов и пр. больше действии
и еще даже, если прицел можно было изменять. игра то считает, что эта обычный курсор. кликнешь по цели, переключишься на нее. тут еще надо чекать какие цели выделены. А в рефордже только юнитов можно проверять через BlzGetMouseFocusUnit(). декорации и итемы не отслеживаются 😝