Добавлен , опубликован

Основы Интерфейса

Содержание:
кратко: иногда необходимо узнать активирован ли у вас прицел. У нас в варкрафте есть возможно отслеживать нажатия ЛКМ, так ПКМ. ПКМ можно легко отслеживать приказом 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-ая кнопка “отмена”. Мы не может точно определить что за кнопка. Но по логике, никто не будет строить в правом нижнем углу одну кнопку, иначе, у вас все поломается. Советую исключать такое.
Это хорошо работает не только у способностей, но и у предметов
Важно: необходимо, чтобы командная панель была видима и кнопки не скрыты. В противном случае, это бесполезно.

Второй способ

Если выше вариант не подошел. Есть еще один вариант, это проверять CastRange абилок и итемов. Как правило, у таргетных способностей указан радиус действия, и он не может быть равен 0. Если идет активация по кнопке, это можно проверить. В рефордже завели кучу читаемых филдов, где можно достать информацию об указанных объектах
--id - равкод абилки, level - уровень абидки (нумерация от нуля) 
function GetCastRangeAbility(un,id,level)
    local ability = BlzGetUnitAbility(un,id)
    return BlzGetAbilityRealLevelField(ability, ABILITY_RLF_CAST_RANGE, level)
end

--index это номер абилки в итеме (нумеруют от нуля)
--как правило, в первом слоте занимают активные абилки, а следом идут пассивки
function GetCastRangeItem(item,index,level)
    local ability = BlzGetItemAbilityByIndex(item, index) 
    return BlzGetAbilityRealLevelField(ability, ABILITY_RLF_CAST_RANGE, level)
end

--id это указанный равкод абилки в итеме (нумеруют от нуля)
function GetCastRangeItemId(item,id,level)
    local ability = BlzGetItemAbility(item,id)
    return BlzGetAbilityRealLevelField(ability, ABILITY_RLF_CAST_RANGE, level)
end
Конечно, это не поможет отследить нажатие по дефолтным кнопкам, и вызов прицела. Но может отсеять лишнюю работу. Плюс, в некоторых не-таргетных абилках может быть этот рендж забил под какие то другие параметры для ее работы. Это редко происходит, но такое бывает
Уже есть пример как отслеживать какой слоте инвентаря/ или какая кнопка выделена курсором ссылка
Можно отслеживать активацию с помощью событии мыши - нажатие/отпускание ПКМ или ЛКМ.
Однако, в случае со слотами инвентаря все понятно, там есть спец нативки обращения ко слотам UnitItemInSlotBJ. А вот с командной панелью все будет сложнее, возможно стоит картоделу продумать. Но эта система рассчитана только для итемов

Содержание
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
20
2 года назад
Отредактирован biridius
0
Круто, чего только ни сделаешь на рефорже.
Только одно но. Это тип скрины? Мб хостинг поехал или это реклама на хгм так вписывается.
Загруженные файлы
1
27
2 года назад
1
biridius, это реклама
0
32
2 года назад
0
Судить по курсору по наличию кнопки отмены? капец, это ерунда какая-то по факту когда курсор в режиме прицела это никак не мешает отслеживать событие левого клика, ты наверное что-то перепутал для чего это действительно нужно.
Жаль нельзя обратно, превращать курсор в прицел или вообще менять модель на лету, хотя сам фрейм курсора известен и его можно например скрыть или поменять альфу
0
27
2 года назад
Отредактирован MpW
0
Bergi_Bear:
менять модель курсора никак, потом отследить координаты мыши никак (корявые костыли не в счет - они проигрывают в скорости), нацепить на мышь никак. что остается? при нажатии на фрейм-пустышку вызывать прицел через forcekey. А вот эта штука выше, помогает проверять закрытие. Удобно же.
можно отслеживать закрытие курсора. нажатие ESC, ЛКМ в игровой карте, переключение юнитов и пр. больше действии
и еще даже, если прицел можно было изменять. игра то считает, что эта обычный курсор. кликнешь по цели, переключишься на нее. тут еще надо чекать какие цели выделены. А в рефордже только юнитов можно проверять через BlzGetMouseFocusUnit(). декорации и итемы не отслеживаются 😝
Чтобы оставить комментарий, пожалуйста, войдите на сайт.