Выбор героя на фреймах

Published
» Способ реализации: vJass
» Тип: Наработка
» Версия Warcraft: 1.26, 1.27a, 1.27b, 1.28f
По просьбе loliconshik3
Выбор героя на фреймах
Пора уже забыть о тавернах и виспах, пора идти в ногу с мемхаком, именно для этого данная наработка.

Функционал
- Кнопки в виде любой иконки юнита/ предмета/ спелла.
- Поддержка одного из 5-ти красивых селекторов.
- Название и описание для любого юнита.
- Быстрый отклик на нажатие фрейма, с помощью всего 5-ти юнитов.
- Полная поддержка мультиплеера.
» Проверка на десинхрон.

Требования
- Уверенное пользование jass.
- Мемхак анрайза. (>1.3)
- pjass для работы мемхака. (Закинуть в JNGP/jasshelper)

Использование
1. Скачиваем пример.
2. Копируем папку триггеров HeroChoose и кидаем к себе в карту.
3. Экспортируем text.fdf, uitoc.toc и кидаем к себе в карту.
4. Настраиваем это дело.
5. Радуемся. (optional)

Принцип работы
- Все также используется быстрый синх булевых через локальный выбор.
- Но я довел до ума схему и теперь это позволяет синхронизировать 5-ти битные целочисленные. Именно поэтому, 32 героя максимум
- По примеру, можно сделать синх 8/16/32 битных, но это имеет мало смысла.
- Скорость синха одного бита - 100мс, скорость синха 5-ти бит - 500мс и дальше по аналогии.

Код
- Использую кастомный чат, как основу, уже 4ый раз.
- Но здесь, обновленный MouseEvent, не то, что он лучшее, он просто красивее.
» Init
globals
    
    integer       HeroChooseBackdrop
    integer array HeroChoose[31]
    integer array HeroChooseBut[31]
    integer       Title
    integer       Desc
    string array  HeroChoosePath[31]
    integer array HeroId[31]
    string array  HeroTitle[31]
    string array  HeroDesc[31]
    integer       Selector
    
    unit array Bit[4]
    unit EndTrans
    
endglobals

function InitChoosePathes takes nothing returns nothing
    
    set HeroChoosePath[0]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[1]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[2]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[3]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[4]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[5]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[6]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[7]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[8]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[9]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[10] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[11] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[12] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[13] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[14] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[15] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[16] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[17] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[18] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[19] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[20] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[21] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[22] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[23] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[24] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[25] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[26] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[27] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[28] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[29] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[30] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[31] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    
    set HeroTitle[0]  = "Работяга"
    set HeroDesc[0]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[1]  = "Работяга"
    set HeroDesc[1]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[2]  = "Работяга"
    set HeroDesc[2]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[3]  = "Работяга"
    set HeroDesc[3]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[4]  = "Работяга"
    set HeroDesc[4]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[5]  = "Работяга"
    set HeroDesc[5]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[6]  = "Работяга"
    set HeroDesc[6]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[7]  = "Работяга"
    set HeroDesc[7]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[8]  = "Работяга"
    set HeroDesc[8]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[9]  = "Работяга"
    set HeroDesc[9]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[10] = "Работяга"
    set HeroDesc[10]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[11] = "Работяга"
    set HeroDesc[11]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[12] = "Работяга"
    set HeroDesc[12]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[13] = "Работяга"
    set HeroDesc[13]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[14] = "Работяга"
    set HeroDesc[14]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[15] = "Работяга"
    set HeroDesc[15]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[16] = "Работяга"
    set HeroDesc[16]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[17] = "Работяга"
    set HeroDesc[17]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[18] = "Работяга"
    set HeroDesc[18]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[19] = "Работяга"
    set HeroDesc[19]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[20] = "Работяга"
    set HeroDesc[20]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[21] = "Работяга"
    set HeroDesc[21]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[22] = "Работяга"
    set HeroDesc[22]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[23] = "Работяга"
    set HeroDesc[23]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[24] = "Работяга"
    set HeroDesc[24]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[25] = "Работяга"
    set HeroDesc[25]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[26] = "Работяга"
    set HeroDesc[26]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[27] = "Работяга"
    set HeroDesc[27]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[28] = "Работяга"
    set HeroDesc[28]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[29] = "Работяга"
    set HeroDesc[29]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[30] = "Работяга"
    set HeroDesc[30]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[31] = "Работяга"
    set HeroDesc[31]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    
    set HeroId[0]  = 'hpea'
    set HeroId[1]  = 'hpea'
    set HeroId[2]  = 'hpea'
    set HeroId[3]  = 'hpea'
    set HeroId[4]  = 'hpea'
    set HeroId[5]  = 'hpea'
    set HeroId[6]  = 'hpea'
    set HeroId[7]  = 'hpea'
    set HeroId[8]  = 'hpea'
    set HeroId[9]  = 'hpea'
    set HeroId[10] = 'hpea'
    set HeroId[11] = 'hpea'
    set HeroId[12] = 'hpea'
    set HeroId[13] = 'hpea'
    set HeroId[14] = 'hpea'
    set HeroId[15] = 'hpea'
    set HeroId[16] = 'hpea'
    set HeroId[17] = 'hpea'
    set HeroId[18] = 'hpea'
    set HeroId[19] = 'hpea'
    set HeroId[20] = 'hpea'
    set HeroId[21] = 'hpea'
    set HeroId[22] = 'hpea'
    set HeroId[23] = 'hpea'
    set HeroId[24] = 'hpea'
    set HeroId[25] = 'hpea'
    set HeroId[25] = 'hpea'
    set HeroId[26] = 'hpea'
    set HeroId[27] = 'hpea'
    set HeroId[28] = 'hpea'
    set HeroId[29] = 'hpea'
    set HeroId[30] = 'hpea'
    set HeroId[31] = 'hpea'
    
endfunction

function CreateSelector takes nothing returns nothing
    set Selector = CreateFrame("Selector4", pGameUI, 80) // Selector 1-5
    call SetFrameSize(Selector, .05, .05)
    call SetFrameAbsolutePoint(Selector, 0, .2, .2 + .05)
    call HideFrame(Selector)
endfunction

function CreateButtons takes nothing returns nothing
    local integer i = 0
    local real x = .255
    local real y = .36
    loop
    exitwhen i == 32
    
        set HeroChoose[i] = CreateFrame("HeroBackdrop", HeroChooseBackdrop, 2 + i)
        call SetCBackDropFrameTexture(HeroChoose[i], HeroChoosePath[i], false)
        call SetFrameSize(HeroChoose[i], .05, .05)
        call SetFrameAbsolutePoint(HeroChoose[i], 4, x , y)
        
        set HeroChooseBut[i] = CreateFrame("ButtonChat", HeroChooseBackdrop, 34 + i)
        call SetFrameSize(HeroChooseBut[i], .05, .05)
        call SetFrameAbsolutePoint(HeroChooseBut[i], 4, x , y)
        call SetFrameAlpha(HeroChooseBut[i], 0)
        
        set x = x + .041
        if i == 7 or i == 15 or i == 23 then
            set y = y + .041
            set x = .255
        endif
        
    set i = i + 1
    endloop
endfunction

function Trig_Init_Actions takes nothing returns nothing
    
    local integer i = 0
    local real x = .255
    local real y = .36
    
    call LoadTOCFile("uitoc.toc")
    call InitChoosePathes()
    
    set HeroChooseBackdrop = CreateFrame("ChatHistoryBackdrop", pGameUI, 0)
    call SetFrameSize(HeroChooseBackdrop, .4, .3)
    call SetFrameAbsolutePoint(HeroChooseBackdrop, 4, .4, .365)
    
        set Title = CreateFrame("ChatText2", HeroChooseBackdrop, 81) 
    call SetFrameAbsolutePoint(Title, 0, .225, .33)
    call SetFrameText(Title, "test")
    call HideFrame(Title)
    
    set Desc = CreateFrame("ChatText1", HeroChooseBackdrop, 82) 
    call SetFrameAbsolutePoint(Desc, 0, .225, .31)
    call SetFrameText(Desc, "test2")
    call HideFrame(Desc)
    
    call CreateSelector() 
    call ExecuteFunc("CreateButtons") // Я хз как, но без него не работает
    
    
    // Юниты для синха
    set x = 0
    set y = 0
    set Bit[0] = CreateUnit(Player(13),'hfoo',x, y, 0)
    set Bit[1] = CreateUnit(Player(13),'hfoo',x, y, 0)
    set Bit[2] = CreateUnit(Player(13),'hfoo',x, y, 0)
    set Bit[3] = CreateUnit(Player(13),'hfoo',x, y, 0)
    set Bit[4] = CreateUnit(Player(13),'hfoo',x, y, 0)
    set EndTrans = CreateUnit(Player(13),'hfoo',x, y, 0)
    
endfunction

//===========================================================================
function InitTrig_Init takes nothing returns nothing
    set gg_trg_Init = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg_Init, 0.10 )
    call TriggerAddAction( gg_trg_Init, function Trig_Init_Actions )
endfunction
» Sync
function Mod2 takes integer n returns integer

    local real num = I2R(n) / I2R(2)
    local integer i = 0
    loop
    exitwhen i > StringLength(R2S(num)) - 2
    if SubString(R2S(num), i, i + 2) == ".0" then
        return 0
    endif
    set i = i + 1
    endloop
    return 1
endfunction

function ToBin takes integer n returns string
    local integer bin = 0
    local integer i = 0
    local string s = ""
    local string ts = ""
    
    if n == 0 then
        return "0"
    endif
    
    loop
    exitwhen not (n > 0)

        set bin = Mod2(n)
        set n = n / 2
        set s = s + I2S(bin)
        
    set i = i + 1
    endloop
    
    // Переворот
    set i = StringLength(s)
    loop
    exitwhen StringLength(ts) == StringLength(s)
        
        set ts = ts + SubString(s, i - 1, i)
        
    set i = i - 1
    endloop
    

    return ts
    
endfunction

function ToDec takes string n returns integer

    local integer temp = 0
    local integer sum = 0
    local integer i = 0
    local integer j = StringLength(n) - 1
    
    loop
    exitwhen i == StringLength(n)
    
        set temp = S2I(SubString(n, i, i + 1)) * PowI(2, j)

        set sum = sum + temp
        set j = j - 1
    set i = i + 1
    endloop
    
    return sum
    
endfunction

globals
    string array TempTrans[1][4]
endglobals

function CreateHero takes integer n, player p, real x, real y returns nothing
    local unit u = CreateUnit(p, HeroId[n], x, y, 0)
    set u = null
endfunction

function Trig_Sync_Actions takes nothing returns nothing

    local integer pid = GetPlayerId(GetTriggerPlayer())
    local integer i = 0
    local string num = ""
    
    loop
    exitwhen i == 5
    
    if GetTriggerUnit() == Bit[i] then
        set TempTrans[pid][i] = "1"
    endif   
    
    set i = i + 1
    endloop
    
    if GetTriggerUnit() == EndTrans then
        set i = 0
        loop
        exitwhen i == 5
        
        set num = num + TempTrans[pid][i]
        set TempTrans[pid][i] = "0"
        
        set i = i + 1
        endloop
        call CreateHero(ToDec(num), GetTriggerPlayer(), 0, 0)
    endif
endfunction

//===========================================================================
function InitTrig_Sync takes nothing returns nothing
    local integer i = 0
    local integer j = 0
    loop
    exitwhen i == 2
        set j = 0
        loop
        exitwhen j == 5
            set TempTrans[i][j] = "0"
        set j = j + 1
        endloop
    set i = i + 1
    endloop
    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 KeySpan
endglobals

function SyncChoose takes integer n returns nothing
    local string bin = ToBin(n)
    local integer i = 0
    
    loop
    exitwhen StringLength(bin) == 5
    set bin = "0" + bin
    endloop
    
    set i = 0
    loop
    exitwhen i == 5
    if SubString(bin, i, i + 1) == "1" then
        call SelectUnit(Bit[i], true)
        call ClearSelection()
    endif
    set i = i + 1
    endloop
    call SelectUnit(EndTrans, true)
    call ClearSelection()
endfunction

function Trig_MouseEvent_Actions takes nothing returns nothing

    local integer i = 0
    local integer j = 0
    local real x = .255
    local real y = .36
    local integer b = 0
    
    loop
    exitwhen i == 2
    
    if GetLocalPlayer() == Player(i) then
        
        set j = 0
        loop
        exitwhen j == 32
        
            if FindCLayerUnderCursor() == HeroChooseBut[j] then
                call ShowFrame(Title)
                call ShowFrame(Desc)
                call SetFrameText(Title, HeroTitle[j])
                call SetFrameText(Desc, HeroDesc[j])
                call ShowFrame(Selector)
                call SetFrameAbsolutePoint(Selector, 0, x, y + .05)
                set b = b + 1
                
                if IsKeyPressed(0x01) and KeySpan then
                    call HideFrame(HeroChooseBackdrop)
                    call SyncChoose(j)
                endif
                
            endif
            
            set x = x + .041
            if j == 7 or j == 15 or j == 23 then
                set y = y + .041
                set x = .255
            endif
            
        set j = j + 1
        endloop
        
        if b == 0 then
            call HideFrame(Selector)
            call HideFrame(Title)
            call HideFrame(Desc)
        endif
        
        if IsKeyPressed(0x01) then
            set KeySpan = false
        else
            set KeySpan = true
        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.10 )
    call TriggerAddAction( gg_trg_MouseEvent, function Trig_MouseEvent_Actions )
endfunction

» Небольшой оффтопик
Опоздал с выпуском на 4 часа, так как фреймы подкинули неожиданный сюрприз,
Подробнее, в будущей статье (Скоро будет, наверно)

Если вам нужна помощь с фреймами прямо сейчас, можете писать в лс.
Я либо могу помогу вам разобраться,
Либо сделаю вот такой ресурс специально под ваши требования.

Завтра мне уже нечего выпускать, поэтому вряд-ли что-нибудь сделаю.

» v 1.1
Теперь, положения всех кнопок, текстов и селекторов выставляются относительно бэкдропа.
Скачать
Код
» Init
globals
    
    integer       HeroChooseBackdrop
    integer array HeroChoose[31]
    integer array HeroChooseBut[31]
    integer       Title
    integer       Desc
    string array  HeroChoosePath[31]
    integer array HeroId[31]
    string array  HeroTitle[31]
    string array  HeroDesc[31]
    integer       Selector
    
    unit array Bit[4]
    unit EndTrans
    
endglobals

function InitChoosePathes takes nothing returns nothing
    
    set HeroChoosePath[0]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[1]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[2]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[3]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[4]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[5]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[6]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[7]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[8]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[9]  = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[10] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[11] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[12] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[13] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[14] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[15] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[16] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[17] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[18] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[19] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[20] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[21] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[22] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[23] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[24] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[25] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[26] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[27] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[28] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[29] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[30] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    set HeroChoosePath[31] = "ReplaceableTextures\\CommandButtons\\BTNPeasant.blp"
    
    set HeroTitle[0]  = "Работяга"
    set HeroDesc[0]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[1]  = "Работяга"
    set HeroDesc[1]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[2]  = "Работяга"
    set HeroDesc[2]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[3]  = "Работяга"
    set HeroDesc[3]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[4]  = "Работяга"
    set HeroDesc[4]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[5]  = "Работяга"
    set HeroDesc[5]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[6]  = "Работяга"
    set HeroDesc[6]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[7]  = "Работяга"
    set HeroDesc[7]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[8]  = "Работяга"
    set HeroDesc[8]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[9]  = "Работяга"
    set HeroDesc[9]   = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[10] = "Работяга"
    set HeroDesc[10]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[11] = "Работяга"
    set HeroDesc[11]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[12] = "Работяга"
    set HeroDesc[12]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[13] = "Работяга"
    set HeroDesc[13]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[14] = "Работяга"
    set HeroDesc[14]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[15] = "Работяга"
    set HeroDesc[15]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[16] = "Работяга"
    set HeroDesc[16]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[17] = "Работяга"
    set HeroDesc[17]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[18] = "Работяга"
    set HeroDesc[18]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[19] = "Работяга"
    set HeroDesc[19]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[20] = "Работяга"
    set HeroDesc[20]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[21] = "Работяга"
    set HeroDesc[21]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[22] = "Работяга"
    set HeroDesc[22]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[23] = "Работяга"
    set HeroDesc[23]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[24] = "Работяга"
    set HeroDesc[24]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[25] = "Работяга"
    set HeroDesc[25]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[26] = "Работяга"
    set HeroDesc[26]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[27] = "Работяга"
    set HeroDesc[27]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[28] = "Работяга"
    set HeroDesc[28]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[29] = "Работяга"
    set HeroDesc[29]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[30] = "Работяга"
    set HeroDesc[30]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    set HeroTitle[31] = "Работяга"
    set HeroDesc[31]  = "|c00FFFFFFУбийца пеонов, каменьщик, мастер на все руки, ловкач, силач, две ульты|r"
    
    set HeroId[0]  = 'hpea'
    set HeroId[1]  = 'hpea'
    set HeroId[2]  = 'hpea'
    set HeroId[3]  = 'hpea'
    set HeroId[4]  = 'hpea'
    set HeroId[5]  = 'hpea'
    set HeroId[6]  = 'hpea'
    set HeroId[7]  = 'hpea'
    set HeroId[8]  = 'hpea'
    set HeroId[9]  = 'hpea'
    set HeroId[10] = 'hpea'
    set HeroId[11] = 'hpea'
    set HeroId[12] = 'hpea'
    set HeroId[13] = 'hpea'
    set HeroId[14] = 'hpea'
    set HeroId[15] = 'hpea'
    set HeroId[16] = 'hpea'
    set HeroId[17] = 'hpea'
    set HeroId[18] = 'hpea'
    set HeroId[19] = 'hpea'
    set HeroId[20] = 'hpea'
    set HeroId[21] = 'hpea'
    set HeroId[22] = 'hpea'
    set HeroId[23] = 'hpea'
    set HeroId[24] = 'hpea'
    set HeroId[25] = 'hpea'
    set HeroId[25] = 'hpea'
    set HeroId[26] = 'hpea'
    set HeroId[27] = 'hpea'
    set HeroId[28] = 'hpea'
    set HeroId[29] = 'hpea'
    set HeroId[30] = 'hpea'
    set HeroId[31] = 'hpea'
    
endfunction

function CreateSelector takes nothing returns nothing
    set Selector = CreateFrame("Selector4", pGameUI, 80) // Selector 1-5
    call SetFrameSize(Selector, .05, .05)
    call SetFrameAbsolutePoint(Selector, 0, .2, .2 + .05)
    call HideFrame(Selector)
endfunction

function CreateButtons takes nothing returns nothing
    local integer i = 0
    local real x = -.143
    local real y = -.01
    loop
    exitwhen i == 32
    
        set HeroChoose[i] = CreateFrame("HeroBackdrop", HeroChooseBackdrop, 2 + i)
        call SetCBackDropFrameTexture(HeroChoose[i], HeroChoosePath[i], false)
        call SetFrameSize(HeroChoose[i], .05, .05)
        call SetFramePoint(HeroChoose[i], 4, HeroChooseBackdrop, 4, x , y)
        
        set HeroChooseBut[i] = CreateFrame("ButtonChat", HeroChooseBackdrop, 34 + i)
        call SetFrameSize(HeroChooseBut[i], .05, .05)
        call SetFramePoint(HeroChooseBut[i], 4, HeroChooseBackdrop, 4, x , y)
        call SetFrameAlpha(HeroChooseBut[i], 0)
        
        set x = x + .041
        if i == 7 or i == 15 or i == 23 then
            set y = y + .041
            set x = -.143
        endif
        
    set i = i + 1
    endloop
endfunction

function Trig_Init_Actions takes nothing returns nothing
    
    local integer i = 0
    local real x = .255
    local real y = .36
    
    call LoadTOCFile("uitoc.toc")
    call InitChoosePathes()
    
    set HeroChooseBackdrop = CreateFrame("ChatHistoryBackdrop", pGameUI, 0)
    call SetFrameSize(HeroChooseBackdrop, .4, .3)
    call SetFrameAbsolutePoint(HeroChooseBackdrop, 4, .4, .365)
    
    set Title = CreateFrame("ChatText2", HeroChooseBackdrop, 81) 
    call SetFramePoint(Title, 0, HeroChooseBackdrop, 4, -.18, -.035)
    call SetFrameText(Title, "test")
    call HideFrame(Title)
    
    set Desc = CreateFrame("ChatText1", HeroChooseBackdrop, 82) 
    call SetFramePoint(Desc, 0, HeroChooseBackdrop, 4, -.18, -.052)
    call SetFrameText(Desc, "test2")
    call HideFrame(Desc)
    
    call CreateSelector() 
    call ExecuteFunc("CreateButtons") // Я хз как, но без него не работает
    
    
    // Юниты для синха
    set x = 0
    set y = 0
    set Bit[0] = CreateUnit(Player(13),'hfoo',x, y, 0)
    set Bit[1] = CreateUnit(Player(13),'hfoo',x, y, 0)
    set Bit[2] = CreateUnit(Player(13),'hfoo',x, y, 0)
    set Bit[3] = CreateUnit(Player(13),'hfoo',x, y, 0)
    set Bit[4] = CreateUnit(Player(13),'hfoo',x, y, 0)
    set EndTrans = CreateUnit(Player(13),'hfoo',x, y, 0)
    
endfunction

//===========================================================================
function InitTrig_Init takes nothing returns nothing
    set gg_trg_Init = CreateTrigger(  )
    call TriggerRegisterTimerEventSingle( gg_trg_Init, 0.10 )
    call TriggerAddAction( gg_trg_Init, function Trig_Init_Actions )
endfunction

» MouseEvent
globals
    boolean KeySpan
endglobals

function SyncChoose takes integer n returns nothing
    local string bin = ToBin(n)
    local integer i = 0
    
    loop
    exitwhen StringLength(bin) == 5
    set bin = "0" + bin
    endloop
    
    set i = 0
    loop
    exitwhen i == 5
    if SubString(bin, i, i + 1) == "1" then
        call SelectUnit(Bit[i], true)
        call ClearSelection()
    endif
    set i = i + 1
    endloop
    call SelectUnit(EndTrans, true)
    call ClearSelection()
endfunction

function Trig_MouseEvent_Actions takes nothing returns nothing

    local integer i = 0
    local integer j = 0
    local real x = -.143
    local real y = -.01
    local integer b = 0
    
    loop
    exitwhen i == 2
    
    if GetLocalPlayer() == Player(i) then
        
        set j = 0
        loop
        exitwhen j == 32
        
            if FindCLayerUnderCursor() == HeroChooseBut[j] then
                call ShowFrame(Title)
                call ShowFrame(Desc)
                call SetFrameText(Title, HeroTitle[j])
                call SetFrameText(Desc, HeroDesc[j])
                call ShowFrame(Selector)
                call SetFramePoint(Selector, 0, HeroChooseBackdrop, 4, x , y + .05)
                set b = b + 1
                
                if IsKeyPressed(0x01) and KeySpan then
                    call HideFrame(HeroChooseBackdrop)
                    call SyncChoose(j)
                endif
                
            endif
            
            set x = x + .041
            if j == 7 or j == 15 or j == 23 then
                set y = y + .041
                set x = -.143
            endif
            
        set j = j + 1
        endloop
        
        if b == 0 then
            call HideFrame(Selector)
            call HideFrame(Title)
            call HideFrame(Desc)
        endif
        
        if IsKeyPressed(0x01) then
            set KeySpan = false
        else
            set KeySpan = true
        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.10 )
    call TriggerAddAction( gg_trg_MouseEvent, function Trig_MouseEvent_Actions )
endfunction



Views: 237

loliconshik3 #1 - 1 month ago 1
Голосов: +1 / -0
Благодарствую, мистер
Konstantin19 #2 - 1 month ago (изм. ) 2
Голосов: +2 / -0
Топ, а то фреймы в 1.26 есть уже лет 5, а никто кроме 2-3 человек их не пользует.
Bergi_Bear #3 - 1 month ago (изм. ) 2
Голосов: +2 / -0
Konstantin19, фреймы были захвачены бизнесменами, но теперь они в массах и можно наконец-то начать что-то клепать
Rejuvenation #4 - 1 week ago 0
Голосов: +0 / -0
На 1.27b не взлетело. Полагаю из-за мемхака.
Прикрепленные файлы
quq_CCCP #5 - 1 week ago 0
Голосов: +0 / -0
Ну хоть кто то начал юзать... Правда главную проблему низкой производительности так и не решили.

кстати а в мемхаке анрайза быстрого синха от abso нема?
Bergi_Bear #6 - 1 week ago 0
Голосов: +0 / -0
Правда главную проблему низкой производительности так и не решили.
Ну в выборе героя производительность не нужна, это же не игровой интерфейс
quq_CCCP #7 - 1 week ago 0
Голосов: +0 / -0
Bergi_Bear, в целом весь этот функционал - тормозной, и требует внимания и оптимизации, без нативок вызов всех этихвнутриигровых функций + постоянные конвертации данных очень бьют по производительности + нагрузка на сетевой траффик.
Bergi_Bear #8 - 1 week ago 0
Голосов: +0 / -0
без нативок вызов всех этихвнутриигровых функций
Серьёзно? вот тоже самое на нативка из mix/dll + функция в игре было бы быстрее?, а зачем тогда всё это?
Почему нельзя было сделать мемхак по другому:
Сам мемхак это лишь основа для подгрузки dll в память и сама dll. Сильно ли она большая вышла бы?
quq_CCCP #9 - 1 week ago 0
Голосов: +0 / -0
Bergi_Bear, можно, нетизы и прочие так сделаны - но чето никто для паблика не сделал, айсфог сделал наработку -никто не развивал.
Bergi_Bear #10 - 1 week ago 0
Голосов: +0 / -0
quq_CCCP, так кроме него никто и не понял как пользоваться, кто будет развивать, гуишники?
quq_CCCP #11 - 1 week ago 0
Голосов: +0 / -0
Bergi_Bear, можно 1 раз сделать, и будет даже гуи с новыми функциями, это тупо длл, и 2 war3map.j первый пустышка куда пишется конфиг карты и мемхак, на минималках который запускает длл, и самовыпиливается, айс нашел отдельный способ чтобы оно не мешало ракапам, и прочему софту, далее длл грузит в игру нативки и запускает второй скрипт, который и является основным. Так же возможен конверт скрипта в длл, что тоже круто поможет с производительностью. Стоить помнить что всякие CallThisCallFast - на деле жуткие костыли которые очень медленные, и часто их юзать не желательно, по сути они делают тоже самое что и делают нативки - JASS это скрипт, вирутальная машина видит имя жасс функции и обращается к внутренней функции игры, а для каждой нативки есть метка, её можно сравнить с goto в бейсике (к слову все функции в жассе имеют такие метки, по которым и прыгает машина). Но нативки есть не для всех функций, а некоторые и вовсе не будут пахать корректно ибо нужны еще приведение типов, и прочее - ибо работа ведется с адрессами обьектов в памяти игры а не ссылки на обьект в таблице хендлов.
Это предлажили еще очень давно - Шарп крафт, тому яркий пример, там в бородатых нулевых были событие на мышку и прочее, но шарпкрафт это не для игроков, для платформ - а платформам в то время оно не усралось, впрочем как и сейчас...
Потом был и айсфог и китайцы со своим нетизом и еще с десятком клонов, потом анрайз сделал свою WFE и на основе работ китацев тоже сделал WFE лаунчер, в котором поддерживаются новые нативки (включая тех что у китацев нет) и полный функционал мемхака в виде нативок, быстрая скорость,защита от читов + какие хочешь кеи,квик касты и камеры - пробник стоит 500 баксов, пока в снг нет желающих...
Вот такие пироги.