Создаём и работаем с фреймами через ГУИ (CS)

Published
» Способ реализации: Lua
» Тип: Наработка
» Версия Warcraft: Reforged
» Весь код
---
--- Generated by EmmyLua(https://github.com/EmmyLua)
--- Created by Bergi.
--- DateTime: 21.02.2021 15:15
---
do
    local InitGlobalsOrigin = InitGlobals -- записываем InitGlobals в переменную
    function InitGlobals()
        InitGlobalsOrigin() -- вызываем оригинальную InitGlobals из переменной
        TimerStart(CreateTimer(), 2, false, function()
            CreateFramesForAllPlayers(0.4,0.3) --стартовая точка осздания фреймов
            TotalReload=udg_TotalFrameReloadSEC -- общее время перезарядки всех фреймов
        end)
    end
end

AllAbilityFrames={
   -- ReadyToReload={}
}

function CreateFramesForAllPlayers(x,y)
    for i = 0, bj_MAX_PLAYER_SLOTS - 1 do
        if IsPlayerSlotState(Player(i),PLAYER_SLOT_STATE_PLAYING) and GetPlayerController(Player(i))==MAP_CONTROL_USER  then
            local step=0.04
            AllAbilityFrames[i]={
                ReadyToReload={},
                ClickTrig={},
                k=0
            }
            -- Если не нужно, вот эти строчки можно удалить, и создавать фреймы из гуи
            CreateUniversalFrame(x,y,step,"Призывает волков",Player(i),"ReplaceableTextures\\CommandButtons\\BTNBerserkForTrolls","Re​placeableTextures\\CommandButtonsDisabled\\DISBTNBerserkForTrolls",1)
            CreateUniversalFrame(x+step,y,step,"Призывает Bergi",Player(i),"ReplaceableTextures\\CommandButtons\\BTNAncestralSpirit.blp","​ReplaceableTextures\\CommandButtonsDisabled\\DISBTNAncestralSpirit.blp",2)
            CreateUniversalFrame(x+step+step,y,step,"Фаталит Карту",Player(i),"ReplaceableTextures\\PassiveButtons\\PASBTNBerserk","Replaceab​leTextures\\CommandButtonsDisabled\\DISBTNBerserk",3)
            CreateUniversalFrame(x+step+step+step,y,step,"Активирет ульту и много всего делает и тут очень длинный текст",Player(i),"ReplaceableTextures\\CommandButtons\\BTNBloodLustOn","Replacea​bleTextures\\CommandButtonsDisabled\\DISBTNBloodLustOn",4)
            
        end
    end 
end

function CreateUniversalFrame(x,y,size,toolTipTex,visionPlayer,activeTexture,passiveTexture,flag)
    if not BlzLoadTOCFile("SystemGeneric\\Main.toc") then
        print("ошибка загрузки " .. "SystemGeneric\\Main.toc")
    end
    local face = BlzCreateFrameByType('GLUEBUTTON', 'FaceButton', BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), 'ScoreScreenTabButtonTemplate', 0)
    BlzFrameSetAbsPoint(face, FRAMEPOINT_CENTER, x, y)
    BlzFrameSetSize(face, size, size)
    local buttonIconFrame = BlzCreateSimpleFrame("MyBar", face, 0)
    BlzFrameSetAllPoints(buttonIconFrame, face)
    BlzFrameSetValue(buttonIconFrame, 100) -- начальная перезарядка
    local cdtext = BlzGetFrameByName("MyBarText", 0)
    BlzFrameSetText(cdtext, "")
    local cdICO = BlzGetFrameByName("MyBarBackground", 0)
    BlzFrameSetTexture(cdICO, passiveTexture, 0, true)
    BlzFrameSetTexture(buttonIconFrame, activeTexture, 0, true)
    BlzFrameSetSize(buttonIconFrame, size, size)
    --print("Создана кнопка с флагом "..flag)
    --- Устанавливаем видимость, каждый игрок видит свой набор фреймов и свои кулдауны
    BlzFrameSetVisible(face,false)
    BlzFrameSetVisible(face,GetLocalPlayer()==visionPlayer)
    --- tooltip
    local tooltip,backdrop,text=CreateToolTipBoxSize(x,y+size,size*5,size,toolTipTex)

    --- Создаём 3 события
    local ClickTrig = CreateTrigger()
    BlzTriggerRegisterFrameEvent(ClickTrig, face, FRAMEEVENT_CONTROL_CLICK)
    TriggerAddAction(ClickTrig, function()
        --print("Нажата кнопка ")
        --StartFrameCD(TotalReload,buttonIconFrame)
        BlzFrameSetEnable(BlzGetTriggerFrame(), false)
        BlzFrameSetEnable(BlzGetTriggerFrame(), true)
        StartAllFrameCD(GetTriggerPlayer())
        ------------------------------------------------------------
        ------------------------------------------------------------
        -----ВОТ ТУТ ЧЕРЕЗ ФЛАГИ ПИШЕТ ГУИ ДЕЙСТВИЯ ДЛЯ СВОИХ КНОПОК
        ------------------------------------------------------------
        if flag==1 then
            Trig_Test1_Actions()
        end
        if flag==2 then
            Trig_Test2_Actions()
        end
        if flag==3 then
            Trig_Test3_Actions()
        end
        if flag==4 then
            Trig_Test4_Actions()
        end
        if flag==5 then
            Trig_MyGUITrigger_Actions()
        end
        if flag==6 then
            Trig_MyNormalButton_Actions()
            --действия можно писать и тут
            --также сюда можно передать нормального GetTriggerPlayer()
        end
    end)

    local TrigMOUSE_ENTER = CreateTrigger()
    BlzTriggerRegisterFrameEvent(TrigMOUSE_ENTER, face, FRAMEEVENT_MOUSE_ENTER)
    TriggerAddAction(TrigMOUSE_ENTER, function()
       -- print("показать подсказку ")
        BlzFrameSetVisible(tooltip,GetLocalPlayer()==GetTriggerPlayer())
    end)
    local TrigMOUSE_LEAVE = CreateTrigger()
    BlzTriggerRegisterFrameEvent(TrigMOUSE_LEAVE, face, FRAMEEVENT_MOUSE_LEAVE)
    TriggerAddAction(TrigMOUSE_LEAVE, function()
        --mouseOnFrame=false
        BlzFrameSetVisible(tooltip,false)
    end)

    ---Глобализация 
    local data=AllAbilityFrames[GetPlayerId(visionPlayer)]
    data.k=data.k+1
    data.ReadyToReload[data.k],data.ClickTrig[data.k]=buttonIconFrame,ClickTrig
    return buttonIconFrame,ClickTrig
end


function CreateToolTipBoxSize(x,y,sizeX,sizeY,toolTipTex)
    local tooltip = BlzCreateFrameByType("FRAME", "TestDialog", BlzGetOriginFrame(ORIGIN_FRAME_GAME_UI, 0), "StandardFrameTemplate", 0)
    local backdrop = BlzCreateFrame("QuestButtonDisabledBackdropTemplate", tooltip, 0, 0)
    local text = BlzCreateFrameByType("TEXT", "ButtonChargesText", tooltip, "", 0)
    BlzFrameSetAbsPoint(tooltip, FRAMEPOINT_CENTER, x, y)
    --print(#toolTipTex..toolTipTex)
    BlzFrameSetSize(tooltip, sizeX, sizeY)
    BlzFrameSetSize(backdrop, sizeX, sizeY)
    BlzFrameSetSize(text, sizeX*.7, sizeY*.7)

    BlzFrameSetPoint(backdrop, FRAMEPOINT_CENTER, tooltip, FRAMEPOINT_CENTER, 0.0, 0.0)
    BlzFrameSetAlpha(backdrop,100)
    BlzFrameSetText(text,toolTipTex)
    BlzFrameSetPoint(text, FRAMEPOINT_CENTER, tooltip, FRAMEPOINT_CENTER, 0.0, 0.0)
    BlzFrameSetVisible(tooltip,false)
    return tooltip,backdrop,text
end


function StartFrameCD(cd,fh)
    local amount=5/cd
    local full=0

    TimerStart(CreateTimer(), 0.05, true, function()
        full=full+amount
        BlzFrameSetValue(fh, full)
        if full>=100 then
            DestroyTimer(GetExpiredTimer())
            full=0
        end
    end)
end

function StartAllFrameCD(player)
    local pid=GetPlayerId(player)
    local data=AllAbilityFrames[pid]
    for i=1,data.k do --#data.ReadyToReload[i]
        StartFrameCD(TotalReload,data.ReadyToReload[i])
        DisableTrigger(data.ClickTrig[i])
        TimerStart(CreateTimer(),TotalReload, false, function()
            EnableTrigger(data.ClickTrig[i])
        end)
    end
end

Установка

  1. Скопировать код в свободный блок
  2. Создать переменную FrameReloadSEC
  3. Скопировать toc и fdf по таким же путям как и у меня "SystemGeneric"
  4. Создавать свой свой фрейм в любом месте используя кастом строку
CreateUniversalFrame(x,y,size,toolTipTex,visionPlayer,activeTexture,passiveTexture,flag)
Где х - координата экрана х
y - координата экрана х
size - размер фрейма (стандартная иконка около 0.039)
toolTipTex - текст в подсказке при наведении
visionPlayer - игрок для которого виден этот фрейм и видна его перезарядка
activeTexture - обычная текстура
passiveTexture - затемнённая отключенная текстура
flag - самое важное, именно он и определяет действие, можно создавать отдельные триггеры но это сложнее гораздо, принимает любое значение, можно хоть цифру хоть слово
В карте много примеров и объяснений по использованию


Views: 170

Bergi_Bear #1 - 1 week ago 2
Голосов: +2 / -0
Карта в режиме папки, пора привыкать к правильной работе
build #2 - 1 week ago 0
Голосов: +0 / -0
Вот я уже вторую статью вижу, но у меня вопрос: где эти toc и fdf взять?
МрачныйВорон #3 - 1 week ago (изм. ) 2
Голосов: +2 / -0
build, этот файл импортируют в карту. И потом кодом вызывают этот файл. открываются блокнотом
Bergi_Bear #4 - 1 week ago (изм. ) 1
Голосов: +1 / -0
build, в данный момент они в архиве карты, эта карта как папка, так что я не стал отдельно прикладывать, вообще их обычно с нуля никто не делает, все редактируют дефолтные. Дефолтные же можно просто вытащить из игрового архива каском.
О структуре fdf есть целая статья
AMark #5 - 1 week ago 0
Голосов: +0 / -0
Крутая наработка, однозначно +
AMark #6 - 1 week ago 0
Голосов: +0 / -0
Время перезарядки всех скиллов задается при инициализации, а это реально изменить во время игры?
Bergi_Bear #7 - 1 week ago (изм. ) 0
Голосов: +0 / -0
да, строчку
TotalReload=udg_TotalFrameReloadSEC
удалить, а везде в коде TotalReload заменять на udg_TotalFrameReloadSEC, а конкретно в этом месте
заменить на
function StartAllFrameCD(player)
    local pid=GetPlayerId(player)
    local data=AllAbilityFrames[pid]
    for i=1,data.k do --#data.ReadyToReload[i]
        StartFrameCD(udg_TotalFrameReloadSEC,data.ReadyToReload[i])
        DisableTrigger(data.ClickTrig[i])
        TimerStart(CreateTimer(),udg_TotalFrameReloadSEC, false, function()
            EnableTrigger(data.ClickTrig[i])
        end)
    end
end
Прикрепленные файлы