мне нужно определить для итемов и декорации? я бы хотел создать порядок очереди приказов для юнитов. Обычно во время Shift определение последующих приказов не работает. Можно отслеживать прожатие кнопок, короче вызов таргета, и клики мыши.
Потом нужно определить находится ли курсор мыши на карте - выполнено.
ps знаю, что она вызывает десихроны
У меня есть своя система строительства, где здания строятся. Там своя очередь. Я бы хотел бы чтобы эта очередь подстраивалась в станд варикковскую. Если нельзя будет, то и хер с ним.
`
ОЖИДАНИЕ РЕКЛАМЫ...
2
27
3 года назад
Отредактирован MpW
2
Я попробовал сделать по-другому, проверять расстояние точки курсора мыши и точки объекта, если оно меньше радиуса коллизиона, то лежит. Работает не идеально.
Проблема вот в чем:
  • у юнитов проверять по коллизион не очень точное решение. Иногда размеры больше, чем должны быть, пример здания. Курсор не успел переместить к зданию, как уже сообщение выпрыгивает, что курсор там. Хотя работает, но не всегда. Пример у хуманского работника очень мелкий радиус коллизион, он то есть, то нет. ВОТ С ЛЕТАЮЩИМИ ТАКОЕ СЛОЖНО ПРОВЕРИШЬ. Пробовал разные характеристики в редакторе посмотреть.
  • у итемов. У итемов такое чувство будто модель съехала от центра. Поэтому сложно.
  • у декора как и у юнитов. Но еще не пробовал.
код
globals
real XXX
real YYY
endglobals

function Trig_MoveMouse_Actions takes nothing returns nothing
set XXX = BlzGetTriggerPlayerMouseX()
set YYY = BlzGetTriggerPlayerMouseY()

endfunction

//===========================================================================
function InitTrig_MoveMouse takes nothing returns nothing
    set gg_trg_MoveMouse = CreateTrigger(  )
    call TriggerRegisterPlayerMouseEventBJ( gg_trg_MoveMouse, Player(0), bj_MOUSEEVENTTYPE_MOVE )
    call TriggerAddAction( gg_trg_MoveMouse, function Trig_MoveMouse_Actions )
endfunction

globals
group GF = CreateGroup()
unit focusunit = null
item focusitem = null
integer countitems = 0
endglobals

function Distance takes real x1, real y1, real x2, real y2 returns real
    local real dx = x2 - x1
    local real dy = y2 - y1
    return SquareRoot(dx * dx + dy * dy)
endfunction

function FindUnit takes nothing returns boolean
    return Distance(XXX,YYY,GetUnitX(GetFilterUnit()),GetUnitY(GetFilterUnit()))< BlzGetUnitCollisionSize(GetFilterUnit()) //*BlzGetUnitRealField(GetFilterUnit(), UNIT_RF_SELECTION_SCALE)
endfunction
function FindItem takes nothing returns boolean
    return Distance(XXX,YYY,GetItemX(GetFilterItem()),GetItemY(GetFilterItem()))< 30.
endfunction

function ActionWithItems takes nothing returns nothing
if focusitem != GetEnumItem() then
set focusitem =GetEnumItem()
    call BJDebugMsg("фокус-итем: "+GetItemName(GetEnumItem()))
    set countitems = countitems + 1
endif
endfunction


function Trig_Period_Actions takes nothing returns nothing

set countitems = 0
call EnumItemsInRect(bj_mapInitialPlayableArea, Condition(function FindItem), function ActionWithItems)
if countitems == 0 and focusitem != null then
set focusitem = null
call BJDebugMsg("фокус-итем: null ")
endif


call GroupEnumUnitsInRange(GF,XXX,YYY,250, Condition(function FindUnit))

if FirstOfGroup(GF)!= null then
    if focusunit != FirstOfGroup(GF) then
        set focusunit = FirstOfGroup(GF)
        call BJDebugMsg("фокус-юнит: "+GetUnitName(FirstOfGroup(GF)))
    endif
    
    
elseif focusunit != null then
    set focusunit = null
    call BJDebugMsg("фокус-юнит: null")
endif
endfunction

//===========================================================================
function InitTrig_Period takes nothing returns nothing
    set gg_trg_Period = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_Period, 0.03 )
    call TriggerAddAction( gg_trg_Period, function Trig_Period_Actions )
endfunction
Короче, курсор подсвечивается если наведен на модель. А как проверить тек функционалом я не знаю. Я размеры модели не знаю. Все что я делал - не думаю, что хорошее решение.
Пробовал станд фреймы дрючить:
курсор
local framehandle GameUI = BlzGetOriginFrame ( ORIGIN_FRAME_GAME_UI , 0 )
local framehandle ParentOfMouseCursor = BlzFrameGetChild(GameUI, 13)
local framehandle MouseCursor = BlzFrameGetChild(ParentOfMouseCursor, 0)
if BlzFrameIsVisible(ParentOfMouseCursor) then
    call BJDebugMsg("фокус")
    call BJDebugMsg(R2S(BlzFrameGetValue(ParentOfMouseCursor)))
endif
Object Hover
BlzFrameGetChild(BlzGetFrameByName("ConsoleUI",0),8)
но они вылетают. Инфу никакую не дают. Только спрятать можно и все.
BlzGetMouseFocusUnit() - идеальное решение для юнитов. Но может к десихрону приводить. Но если уметь можно обойти. На хайве находил записи-решения. А вот с остальными, ну ладно.
0
9
3 года назад
Отредактирован map_maiker
0
Обычно во время Shift определение последующих приказов не работает.
Работает в момент получении очередного приказа.
0
27
3 года назад
Отредактирован MpW
0
map_maiker, так события показывают только получение приказа, а не очередь. просто важно запомнить всю очередь. во время SHIFT нельзя ниче получить. Просмотрел все нативки, которые есть. Смотрел наработки у нас на сайте, пример через GetUnitRallyPoint. или на хайве
Пробовал искусственно отпустить эту клавишу SHIFT, но никакими фреймами, ForceUIKey нельзя отменить. Пробовал использовать баг фреймов, когда залипаем кнопки, короче фокус переключить. Но дело в том, что эта системная кнопка никак не относится к фреймовым, даже работает при переключенном фокусе.
Ну раз ниче не получается с клавиатурой, пробуем с юнитом че-нибудь сделать. Отследить это тоже сложновато. Че то такое придумать бы. Типа приказом перебить очередь, и посмотреть изменилось.

Нашел такой способ: Событие нажатия мыши (Down) срабатывает раньше события приказов. Отдаем во время нажатия мыши приказ стоп - очередь тут же сбивается. Но юнит сразу же получает новый приказ, активированный нами только что кликом. А уже при событии приказа мы записываем приказ, и возобновляем пред приказ. Главное не перепутайте с отпускаем мыши (UP), тк отпускание мыши срабатывает позже приказов. Но не знаю не будет ли юнита передергивать. Но это уже завтра потестим
Чтобы оставить комментарий, пожалуйста, войдите на сайт.