Спавн юнита с помощью фрейма

Published
» Способ реализации: vJass
» Тип: Наработка
» Версия Warcraft: 1.26, 1.27a, 1.27b, 1.28f
Наработка, создающая юнита при нажатии на кнопку.

Не прошло и трех дней...

Вид

Принцип работы
SelectUnit(u, flag) позволяет вызвать функцию у всех, с константами игрока и выбранного юнита, из локального условия.
С помощью не хитрых манипуляций, получаем быстрый синх булевых. Подробно опишу в статье, которую, надеюсь, скоро напишу
Примерная скорость синха - ~100 мс.
С помощью этого также возможно синхронизировать целочисленные, у меня даже уже есть наработка, которая это делает


Views: 140

quq_CCCP #1 - 2 months ago 1
Голосов: +1 / -0
Не вызовет дисинх и в реальной игре на айкапе или гарены? Как насчёт проверить?
ofeerist #2 - 2 months ago 1
Голосов: +1 / -0
quq_CCCP:
Не вызовет дисинх и в реальной игре на айкапе или гарены? Как насчёт проверить?
Проверил на ирине, все работает
На гифке видно же, что с челом играю
GetLocalPlayer #3 - 2 months ago 0
Голосов: +0 / -0
А на Wurst мемхак не прикручивали?
Bergi_Bear #4 - 2 months ago 0
Голосов: +0 / -0
По поводу скорости синха не пойму, мне кажется, что она элементарно зависит от пинг. Могу ошибаться. Или можно задержка, самого выделения
ofeerist #5 - 2 months ago 0
Голосов: +0 / -0
Bergi_Bear:
По поводу скорости синха не пойму, мне кажется, что она элементарно зависит от пинг. Могу ошибаться. Или можно задержка, самого выделения
Вообще без понятия.
Может и от пинга, но тогда почему есть задержка в соло?
А если задержка выделения, то почему всегда разная скорость?
Bergi_Bear #6 - 2 months ago 0
Голосов: +0 / -0
Тогда все сходится, получения что скорость зависит от обоих факторов, но в любом случае, это лучше и быстрее гейм Кеша. Код добавь что-ли, хочется сам метод синхронизации увидеть
ofeerist #7 - 2 months ago 0
Голосов: +0 / -0
Bergi_Bear:
Тогда все сходится, получения что скорость зависит от обоих факторов, но в любом случае, это лучше и быстрее гейм Кеша. Код добавь что-ли, хочется сам метод синхронизации увидеть
» Init
globals
    integer SpawnUnitBackdrop
    integer array SpawnUnit[7]
    string array ButtonName[7]
    integer array UnitButtonId[7]
    
    unit array SyncUnit[1][7]
endglobals

function Trig_Init_Actions takes nothing returns nothing
    
    local integer i = 0
    
    call LoadTOCFile("uitoc.toc")
    
    set ButtonName[0] = "Футмен"
    set ButtonName[1] = "Рифл"
    set ButtonName[2] = "Вертолет"
    set ButtonName[3] = "Грифон"
    set ButtonName[4] = "Паладин"
    set ButtonName[5] = "Гном"
    set ButtonName[6] = "Праудмур"
    set ButtonName[7] = "Гаритос"
    
    set UnitButtonId[0] = 'hfoo'
    set UnitButtonId[1] = 'hrif'
    set UnitButtonId[2] = 'hgyr'
    set UnitButtonId[3] = 'hgry'
    set UnitButtonId[4] = 'Hpal'
    set UnitButtonId[5] = 'Hmkg'
    set UnitButtonId[6] = 'Hapm'
    set UnitButtonId[7] = 'Hlgr'
    
    // Бэкдропчик
    set SpawnUnitBackdrop = CreateFrame("ChatHistoryBackdrop", pGameUI, 1)
    call SetFrameAbsolutePoint(SpawnUnitBackdrop, 4, .1, .37)
    call SetFrameSize(SpawnUnitBackdrop, .2, .42)
        
    // Кнопочки
    loop
    exitwhen i == 8
    
        set SpawnUnit[i] = CreateFrame("ButtonChat", SpawnUnitBackdrop, 2 + i)
        // call DisplayTimedTextToPlayer(GetLocalPlayer(), 1, 0, 0, I2S(SpawnUnit[i]))
        call SetFrameAbsolutePoint(SpawnUnit[i], 4, .1, .2 + I2R(i) / 20)
        call SetFrameSize(SpawnUnit[i], 0.15, 0.05)
        call SetFrameText(SpawnUnit[i], ButtonName[i])
    
    set i = i + 1
    endloop
    
    // Юниты для синха
    set i = 0
    loop
    exitwhen i == 8
    
        set SyncUnit[0][i] = CreateUnit(Player(0), 'hfoo', -3000, 2900, 0)
        set SyncUnit[1][i] = CreateUnit(Player(1), 'hfoo', -3000, 2900, 0)
    
    set i = i + 1
    endloop
endfunction

//===========================================================================
function InitTrig_Init takes nothing returns nothing

    set gg_trg_Init = CreateTrigger(  )
    
    call TriggerRegisterTimerEventSingle( gg_trg_Init, .01 )
    call TriggerAddAction( gg_trg_Init, function Trig_Init_Actions )
endfunction

» Sync
function Trig_Sync_Actions takes nothing returns nothing

    local integer i = 0
    local unit u
    
    loop
    exitwhen i == 8
    
        if GetTriggerUnit() == SyncUnit[GetPlayerId(GetTriggerPlayer())][i] then
            set u = CreateUnit(GetTriggerPlayer(), UnitButtonId[i], 0, 0, 0)
            
            if GetLocalPlayer() == GetTriggerPlayer() then
                call ShowFrame(SpawnUnitBackdrop)
            endif
            
        endif
    
    set i = i + 1
    endloop
    
    set u = null
    
endfunction

//===========================================================================
function InitTrig_Sync takes nothing returns nothing
    set gg_trg_Sync = CreateTrigger(  )
    call TriggerRegisterPlayerSelectionEventBJ( gg_trg_Sync, Player(0), true )
    call TriggerRegisterPlayerSelectionEventBJ( gg_trg_Sync, Player(1), true )
    call TriggerAddAction( gg_trg_Sync, function Trig_Sync_Actions )
endfunction
» MouseEvent
globals
    boolean array KeySpan
endglobals

function Trig_MouseEvent_Actions takes nothing returns nothing
    local integer i = 0
    local integer j = 0
    loop
        
        exitwhen(i==12)
        
        if(Player(i) == GetLocalPlayer()) then
            //call DisplayTimedTextToPlayer(GetLocalPlayer(), 0, 0, 0.1, "X = "+R2S(GetCursorX())+", Y = "+R2S(GetCursorY()))
            
            loop
            exitwhen j == 8
            // Button Press
                if FindCLayerUnderCursor() == SpawnUnit[j] and IsKeyPressed(0x01) and KeySpan[i] then 
                    set KeySpan[i] = false
                    call HideFrame(SpawnUnitBackdrop)
                    call SelectUnit(SyncUnit[GetPlayerId(GetLocalPlayer())][j], true)
                    call ClearSelection()
                endif
            set j = j + 1
            endloop
            
            if not (IsKeyPressed(0x01)) then
                set KeySpan[i] = true
            endif
            
            if IsKeyPressed(0x01) then
                set KeySpan[i] = false
            endif
            
        endif
        

        set i = i + 1
        
    endloop
    
endfunction

//===========================================================================
function InitTrig_MouseEvent takes nothing returns nothing
    set gg_trg_MouseEvent = CreateTrigger(  )
    call TriggerRegisterTimerEventPeriodic( gg_trg_MouseEvent, 0.01 )
    call TriggerAddAction( gg_trg_MouseEvent, function Trig_MouseEvent_Actions )
endfunction
Код ни разу не универсальный и подходит только конкретно к этой мапе.