Добавлен , опубликован
Алгоритмы, Наработки и Способности
Способ реализации:
Jass
Тип:
Алгоритм
Версия Warcraft:
UjAPI v1.1.8.178+

О системе

Относительно краткий пример создания системы магазина строго на CSimpleFrame/CSimpleRegion фреймах используя UjAPI и Frame API.
Главным бонусом UjAPI в данной наработке является handlelist тип, который позволяет нам хранить все созданные фреймы в "листе" и не использовать тучу переменных, без какой-либо нужды. А так же возможность получать текущую анимацию курсора через GetFrameSpriteCurrentAnimationId, чтобы убедиться, что ПКМ была нажата.
Ну и конечно же HashTable, которая решает в целом проблемы работы с MUI наработками.
Собственно, почему же выбор пал на CSimpleFrame/CSimpleRegion типы фреймов? На деле, главная причина - отсутствие в целом поддержки этих фреймов как на Reforged, так и в DzAPI. Хотя этих фреймов хватает почти на все нужды, если расширить их API.
Данная система конечно же работает в онлайне и не вызывает десинха, иначе это не имело бы смысла.

Код

раскрыть
globals
    hashtable FrameHT = InitHashtable( )
    hashtable ItemDataHT = InitHashtable( )
    framehandle ItemShopUI = null
    framehandle ShopButton = null
    handlelist ItemShopItemList = HandleListCreate( )
endglobals

function OnButtonPress takes nothing returns nothing
    local framehandle but = GetTriggerFrame( )
    local integer bid = GetHandleId( but )
    local player p = GetTriggerPlayer( )
    local real width = GetFrameWidth( but )
    local real height = GetFrameHeight( but )

    if p == GetLocalPlayer( ) then
        if but != null then
            if not LoadBoolean( FrameHT, bid, 'prss' ) then
                call SetFrameSize( but, width - .0025, height - .0025 ) // .024, .0465
                call SaveBoolean( FrameHT, bid, 'prss', true )
            endif
        endif
    endif

    set p = null
    set but = null
endfunction

function OnButtonUnpressHandler takes nothing returns nothing
    local integer hid = GetHandleId( GetExpiredTimer( ) )
    local player p = LoadPlayerHandle( FrameHT, hid, '+ply' )
    local framehandle but = LoadFrameHandle( FrameHT, hid, '+frm' )
    local integer bid = GetHandleId( but )
    local real width = GetFrameWidth( but )
    local real height = GetFrameHeight( but )

    if p == GetLocalPlayer( ) then
        if but != null then
            if LoadBoolean( FrameHT, bid, 'prss' ) then
                call SetFrameSize( but, width + .0025, height + .0025 ) // .025, .0475
                call SaveBoolean( FrameHT, bid, 'prss', false )
            endif
        endif
    endif

    set p = null
    set but = null
endfunction

function OnButtonUnpress takes nothing returns nothing
    local player p = GetTriggerPlayer( )
    local framehandle but = GetTriggerFrame( )
    local timer tmr = LoadTimerHandle( FrameHT, GetHandleId( but ), '+tmr' )

    if tmr == null then
        set tmr = CreateTimer( )
        call SaveTimerHandle( FrameHT, GetHandleId( but ), '+tmr', tmr )
        call SavePlayerHandle( FrameHT, GetHandleId( tmr ), '+ply', p )
        call SaveFrameHandle( FrameHT, GetHandleId( tmr ), '+frm', but )
    endif

    call TimerStart( tmr, .1, false, function OnButtonUnpressHandler )

    set p = null
    set but = null
endfunction

function UnitAddItemConditional takes unit u, integer iid, integer goldCost returns integer
    local player p = GetOwningPlayer( u )
    local integer i = 0
    local integer whichId = 0
    local integer baseCharges = 0
    local integer charges = 0
    local integer newCharges = 0
    local integer freeSlotId = -1
    local integer playerGold = GetPlayerState( p, PLAYER_STATE_RESOURCE_GOLD )
    local item it = null

    if playerGold < goldCost then
        set p = null
        return -1
    endif

    set baseCharges = GetBaseItemIntegerFieldById( iid, ITEM_IF_NUMBER_OF_CHARGES )

    loop
        exitwhen i == GetUnitItemSlots( u )
        set it = UnitItemInSlot( u, i )

        if it != null then
            if baseCharges > 0 then
                set whichId = GetItemTypeId( it )
                set charges = GetItemCharges( it )
                set newCharges = baseCharges + charges

                if iid == GetItemTypeId( it ) then
                    if newCharges <= LoadInteger( ItemDataHT, iid, 'mchr' ) then
                        call SetPlayerState( p, PLAYER_STATE_RESOURCE_GOLD, playerGold - goldCost )
                        call SetItemCharges( it, newCharges )
                        set p = null
                        set it = null
                        return i
                    endif
                endif
            endif
        else
            if freeSlotId == -1 then
                set freeSlotId = i
            endif
        endif

        set i = i + 1
    endloop

    if freeSlotId != -1 then
        call SetPlayerState( p, PLAYER_STATE_RESOURCE_GOLD, playerGold - goldCost )
        call UnitAddItemById( u, iid )
    endif

    set p = null
    set it = null
    return freeSlotId
endfunction

function OnButtonAcceptPurchase takes nothing returns nothing
    local player p = GetTriggerPlayer( )
    local integer pHid = GetHandleId( p )
    local integer buttonId = LoadInteger( FrameHT, pHid, '+bId' )
    local framehandle but = null
    local integer butHid = 0
    local integer itemTypeId = 0
    local integer freeSlotId = 0
    local item it = null

    if buttonId == -1 then
        return
    endif

    set but = HandleListGetFrameByIndex( ItemShopItemList, buttonId )
    set butHid = GetHandleId( but )
    set itemTypeId = LoadInteger( FrameHT, butHid, 'tpid' )

    call UnitAddItemConditional( LoadUnitHandle( FrameHT, pHid, 'hero' ), itemTypeId, GetBaseItemIntegerFieldById( itemTypeId, ITEM_IF_GOLD_COST ) )

    if false and p == GetLocalPlayer( ) then
        call EditBlackBorders( -.02, .13 ) // -.02, .13 | to return to default 
        call HideOriginFrames( false )
        //call SelectUnit( u, true )
    endif

    set p = null
    set but = null
endfunction

function SetFrameShopSellButtonState takes player p, boolean state returns nothing
    local framehandle sellBut = GetCSimpleFrameByName( "ItemSellButton", 0 )
    local framehandle sellText = GetCSimpleFontStringByName( "ItemSellText", 0 )

    if p == GetLocalPlayer( ) then
        if state then
            call SetFrameEnabled( sellBut, true )
            call SetFrameColourEx( sellBut, 1, 0xFFFFFFFF )
            call SetFrameTextColour( sellText, 0xFF806050 )
        else
            call SetFrameEnabled( sellBut, false )
            call SetFrameColourEx( sellBut, 1, 0x50FFFFFF )
            call SetFrameTextColour( sellText, 0x50806050 )
        endif
    endif

    set sellBut = null
    set sellText = null
endfunction

function OnButtonAcceptSell takes nothing returns nothing
    local player p = GetTriggerPlayer( )
    local integer hid = GetHandleId( p )
    local integer itemSlot = LoadInteger( FrameHT, hid, 'itId' )
    local integer price = 0
    local integer charges = 0
    local item it = null
    local framehandle selector = null
    
    if itemSlot != -1 then
        set it = UnitItemInSlot( LoadUnitHandle( FrameHT, hid, 'hero' ), itemSlot )

        if it != null then
            set selector = GetCFrameByName( "ItemPurchaseSelector", 0 )
            set charges = GetItemCharges( it )
            
            if charges > 0 then
                set price = GetItemIntegerField( it, ITEM_IF_GOLD_COST ) * charges
            else
                set price = GetItemIntegerField( it, ITEM_IF_GOLD_COST )
            endif

            set price = price / 2 // R2I( price / ( 1. + LoadReal( ItemDataHT, GetItemTypeId( it ), '+tax' ) ) )
            //call ConsolePrint( "price = " + I2S( price ) + "\n" )
            call SetPlayerState( p, PLAYER_STATE_RESOURCE_GOLD, GetPlayerState( p, PLAYER_STATE_RESOURCE_GOLD ) + price )
            call RemoveItem( it )
            call ShowFrame( selector, false )
            call SetFrameShopSellButtonState( p, false )
        endif
    endif

    set p = null
    set it = null
    set selector = null
endfunction

function ToggleShopVisibilityState takes player p returns nothing
    local framehandle shopFrame = GetFrameByName( "ItemSelectionUI", 0 )
    local boolean isShow = not IsFrameVisible( shopFrame )

    if p == GetLocalPlayer( ) then
        call ShowFrame( shopFrame, isShow )
        call ShowFrame( GetCFrameByName( "ItemPurchaseSelector", 0 ), false )
        call ShowFrame( GetFrameByName( "ItemPurchaseToolTip", 0 ), false )
    endif

    set shopFrame = null
endfunction

function OnCloseItemShopInfo takes nothing returns nothing
    local player p = GetTriggerPlayer( )

    if p == GetLocalPlayer( ) then
        //call ShowFrame( GetFrameByName( "ItemSelectionUI", 0 ), false )
        call ShowFrame( GetCFrameByName( "ItemPurchaseSelector", 0 ), false )
        call ShowFrame( GetFrameByName( "ItemPurchaseToolTip", 0 ), false )
    endif
    
    set p = null
endfunction

function GetFrameItemShopUI takes nothing returns framehandle
    local framehandle gameUI = null
    local framehandle consoleUI = null
    local framehandle shopUI = null
    local framehandle texture = null
    local framehandle textFrame = null
    local framehandle selectorFrame = null
    local framehandle frm = null
    local framehandle simpleButton = null
    local trigger tOnPress = null
    local trigger tOnUnPress = null
    local trigger tOnClick = null
    local string s = ""
    local integer i = 0

    if ItemShopUI != null then
        return ItemShopUI
    endif

    set consoleUI = GetOriginFrame( ORIGIN_FRAME_CONSOLE_UI, 0 )
    set shopUI = GetCSimpleFrameByName( "ItemSelectionUI", 0 )

    set ItemShopUI = CreateFrameByType( "SIMPLEFRAME", "ItemPurchaseToolTip", consoleUI, "", 0 )
    call ClearFrameAllPoints( ItemShopUI )
    call SetFrameSize( ItemShopUI, .1225, .45 ) // .25
    call SetFrameRelativePoint( ItemShopUI, FRAMEPOINT_TOPRIGHT, shopUI, FRAMEPOINT_TOPRIGHT, .12, .0 ) // UI\\Widgets\\ToolTips\\Human\\human-tooltip-background | UI\\Widgets\\ToolTips\\Human\\human-tooltip-border
    call SetFrameTextureEx( ItemShopUI, "UI\\Widgets\\EscMenu\\Orc\\orc-options-menu-background", "UI\\Widgets\\EscMenu\\Orc\\orc-options-menu-border", 0, false )
    call SetFramePriority( ItemShopUI, 4 )

    set texture = CreateFrameByType( "SIMPLETEXTURE", "ItemPurchaseIcon", ItemShopUI, "", 0 )
    //call SetFrameTexture( texture, heroIcon, 0, false )
    call ClearFrameAllPoints( texture )
    call SetFrameRelativePoint( texture, FRAMEPOINT_TOPLEFT, ItemShopUI, FRAMEPOINT_TOPLEFT, .005, -.0075 )
    call SetFrameSize( texture, .0175, .04 )
    call SetFramePriority( texture, 2 )
    call ShowFrame( texture, true )

    set textFrame = CreateFrameByType( "SIMPLETEXT", "ItemPurchaseTextHeader", ItemShopUI, "", 0 )
    call ClearFrameAllPoints( textFrame )
    call SetFrameRelativePoint( textFrame, FRAMEPOINT_TOPLEFT, texture, FRAMEPOINT_TOPRIGHT, .0025, -.0025 )
    call SetFramePriority( textFrame, 2 )
    call SetFrameFont( textFrame, "Fonts\\FRIZQT__.TTF", .0125, 0 )
    call SetFrameTextAlignment( textFrame, TEXT_JUSTIFY_CENTER, TEXT_JUSTIFY_LEFT )
    //call SetFrameWidth( textFrame, .1 )
    call SetFrameText( textFrame, " " )
    call ShowFrame( textFrame, true )

    set textFrame = CreateFrameByType( "SIMPLETEXT", "ItemPurchaseTextBody", ItemShopUI, "", 0 )
    call ClearFrameAllPoints( textFrame )
    call SetFrameRelativePoint( textFrame, FRAMEPOINT_TOPLEFT, texture, FRAMEPOINT_BOTTOMLEFT, .0, -.01 )
    call SetFramePriority( textFrame, 2 )
    call SetFrameFont( textFrame, "Fonts\\FRIZQT__.TTF", .012, 0 )
    call SetFrameTextHorizontalAlignment( textFrame, TEXT_JUSTIFY_LEFT )
    call SetFrameWidth( textFrame, .110 )
    call SetFrameText( textFrame, " " )
    call ShowFrame( textFrame, true )

    set frm = CreateFrameByType( "SIMPLETEXTURE", "ItemPurchaseGoldIcon", ItemShopUI, "", i )
    call SetFrameTexture( frm, "UI\\Feedback\\Resources\\ResourceGold", 0, false )
    call ClearFrameAllPoints( frm )
    call SetFrameRelativePoint( frm, FRAMEPOINT_TOPLEFT, texture, FRAMEPOINT_TOPRIGHT, .0025, -.0175 )
    call SetFrameSize( frm, .01, .015 )
    call SetFramePriority( frm, 2 )
    call ShowFrame( frm, true )

    set textFrame = CreateFrameByType( "SIMPLETEXT", "ItemPurchaseGoldCostText", ItemShopUI, "", i )
    call ClearFrameAllPoints( textFrame )
    call SetFrameRelativePoint( textFrame, FRAMEPOINT_CENTER, frm, FRAMEPOINT_RIGHT, .01, .0 )
    call SetFramePriority( textFrame, 2 )
    call SetFrameFont( textFrame, "Fonts\\FRIZQT__.TTF", .011, 0 )
    call SetFrameTextAlignment( textFrame, TEXT_JUSTIFY_CENTER, TEXT_JUSTIFY_LEFT )
    call SetFrameTextColour( textFrame, 0xFFFFA5FF )
    call SetFrameText( textFrame, "" )
    call ShowFrame( textFrame, true )

    call ShowFrame( ItemShopUI, false )
    
    set gameUI = GetOriginFrame( ORIGIN_FRAME_GAME_UI, 0 )
    
    set selectorFrame = CreateFrameByType( "SPRITE", "ItemPurchaseSelector", gameUI, "", 0 )
    call ClearFrameAllPoints( selectorFrame )
    call SetFrameAbsolutePoint( selectorFrame, FRAMEPOINT_CENTER, .2, .2 )
    call SetFrameSize( selectorFrame, .01, .01 )
    call SetFrameSpriteModel( selectorFrame, "UI\\Feedback\\Autocast\\UI-ModalButtonOn.mdl" )
    call SetFrameTrackState( selectorFrame, 2 )
    call ShowFrame( selectorFrame, false )


    set s = "CustomUI\\Selectors\\ClickableButton" // "UI\\Widgets\\EscMenu\\Human\\checkbox-check"
    set simpleButton = CreateFrameByType( "SIMPLEBUTTON", "ItemPurchaseAcceptButton", ItemShopUI, "", 0 )
    call ClearFrameAllPoints( simpleButton )
    
    call SetFrameTexture( simpleButton, s, 0, true )
    call SetFrameTexture( simpleButton, s, 1, true )
    call SetFrameTexture( simpleButton, s, 2, true )
    call SetFrameSize( simpleButton, .1, .025 )
    call SetFramePriority( simpleButton, 5 )
    call SetFrameParent( simpleButton, ItemShopUI )
    call ShowFrame( simpleButton, true )
    call SetFrameRelativePoint( simpleButton, FRAMEPOINT_CENTER, ItemShopUI, FRAMEPOINT_BOTTOM, .0, .025 )

    set textFrame = CreateFrameByType( "SIMPLETEXT", "ItemPurchaseAcceptText", simpleButton, "", 0 )
    call ClearFrameAllPoints( textFrame )
    call SetFramePriority( textFrame, 2 )
    call SetFrameFont( textFrame, "Fonts\\FRIZQT__.TTF", .015, 0 )
    call SetFrameTextAlignment( textFrame, TEXT_JUSTIFY_CENTER, TEXT_JUSTIFY_MIDDLE )
    //call SetFrameWidth( textFrame, .1 )
    call SetFrameTextColour( textFrame, 0xFF806050 ) // 0xFFFF9000
    call SetFrameParent( textFrame, simpleButton )
    call SetFrameText( textFrame, "PURCHASE" )
    call ShowFrame( textFrame, true )
    call SetFrameRelativePoint( textFrame, FRAMEPOINT_CENTER, simpleButton, FRAMEPOINT_CENTER, .0, .0 )

    set tOnPress = CreateTrigger( )
    set tOnUnPress = CreateTrigger( )
    set tOnClick = CreateTrigger( )

    call TriggerRegisterFrameEvent( tOnPress, simpleButton, FRAMEEVENT_MOUSE_DOWN )
    call TriggerRegisterFrameEvent( tOnUnPress, simpleButton, FRAMEEVENT_MOUSE_UP )
    call TriggerRegisterFrameEvent( tOnClick, simpleButton, FRAMEEVENT_CONTROL_CLICK )

    call TriggerAddAction( tOnPress, function OnButtonPress )
    call TriggerAddAction( tOnUnPress, function OnButtonUnpress )
    call TriggerAddAction( tOnClick, function OnButtonAcceptPurchase )


    set s = "CustomUI\\Selectors\\ClickableButton"
    set simpleButton = CreateFrameByType( "SIMPLEBUTTON", "ItemClosePurchaseButton", ItemShopUI, "", 0 )
    call ClearFrameAllPoints( simpleButton )
    
    call SetFrameTexture( simpleButton, s, 0, true )
    call SetFrameTexture( simpleButton, s, 1, true )
    call SetFrameTexture( simpleButton, s, 2, true )
    call SetFrameSize( simpleButton, .01, .015 )
    call SetFramePriority( simpleButton, 6 )
    call SetFrameParent( simpleButton, ItemShopUI )
    call ShowFrame( simpleButton, true )
    call SetFrameRelativePoint( simpleButton, FRAMEPOINT_TOPRIGHT, ItemShopUI, FRAMEPOINT_TOPRIGHT, .0, .0 )

    set textFrame = CreateFrameByType( "SIMPLETEXT", "ItemClosePurchaseText", simpleButton, "", 0 )
    call ClearFrameAllPoints( textFrame )
    call SetFramePriority( textFrame, 2 )
    call SetFrameFont( textFrame, "Fonts\\FRIZQT__.TTF", .007, 0 )
    call SetFrameTextAlignment( textFrame, TEXT_JUSTIFY_CENTER, TEXT_JUSTIFY_MIDDLE )
    call SetFrameTextColour( textFrame, 0xFF806050 ) // 0xFF806050
    call SetFrameParent( textFrame, simpleButton )
    call SetFrameText( textFrame, "X" )
    call ShowFrame( textFrame, true )
    call SetFrameRelativePoint( textFrame, FRAMEPOINT_CENTER, simpleButton, FRAMEPOINT_CENTER, .0, .0 )

    set tOnPress = CreateTrigger( )
    set tOnUnPress = CreateTrigger( )
    set tOnClick = CreateTrigger( )

    call TriggerRegisterFrameEvent( tOnPress, simpleButton, FRAMEEVENT_MOUSE_DOWN )
    call TriggerRegisterFrameEvent( tOnUnPress, simpleButton, FRAMEEVENT_MOUSE_UP )
    call TriggerRegisterFrameEvent( tOnClick, simpleButton, FRAMEEVENT_CONTROL_CLICK )

    call TriggerAddAction( tOnPress, function OnButtonPress )
    call TriggerAddAction( tOnUnPress, function OnButtonUnpress )
    call TriggerAddAction( tOnClick, function OnCloseItemShopInfo )

    set gameUI = null
    set consoleUI = null
    set texture = null
    set textFrame = null
    set selectorFrame = null
    set simpleButton = null
    set tOnPress = null
    set tOnUnPress = null
    set tOnClick = null

    return ItemShopUI
endfunction

function OnDisplayItemButtonData takes player p, framehandle but returns nothing
    local framehandle cursor = GetOriginFrame( ORIGIN_FRAME_CURSOR_FRAME, 0 )
    local framehandle tooltip = GetOriginFrame( ORIGIN_FRAME_UBERTOOLTIP, 0 )
    local framehandle frm = null
    local integer index = LoadInteger( FrameHT, GetHandleId( but ), 'indx' )
    local integer typeId = LoadInteger( FrameHT, GetHandleId( but ), 'tpid' )
    local integer goldCost = GetBaseItemIntegerFieldById( typeId, ITEM_IF_GOLD_COST )
    local string texturePath = GetFrameTexture( but, 0 )
    local string name = LoadStr( FrameHT, GetHandleId( but ), 'name' )
    local string info_normal = LoadStr( FrameHT, GetHandleId( but ), 'ninf' )
    local string info_extended = LoadStr( FrameHT, GetHandleId( but ), 'einf' )

    if p == GetLocalPlayer( ) then
        set tooltip = GetFrameItemShopUI( )
        call ShowFrame( tooltip, true )

        set frm = GetCSimpleTextureByName( "ItemPurchaseIcon", 0 )
        call SetFrameTexture( frm, texturePath, 0, false )

        set frm = GetCSimpleFontStringByName( "ItemPurchaseTextHeader", 0 )
        call SetFrameText( frm, name )

        set frm = GetCSimpleFontStringByName( "ItemPurchaseGoldCostText", 0 )
        call SetFrameText( frm, I2S( goldCost ) )

        set frm = GetCSimpleFontStringByName( "ItemPurchaseTextBody", 0 )
        call SetFrameText( frm, info_extended )
        
        //call ConsolePrint( "[" + GetTimeStamp( true, 0 ) + "]:================\n" )
    endif

    set frm = null
    set cursor = null
    set tooltip = null
endfunction

function OnButtonEnter takes nothing returns nothing
    local player p = GetTriggerPlayer( )
    local framehandle but = GetTriggerFrame( )
    local framehandle cursor = GetOriginFrame( ORIGIN_FRAME_CURSOR_FRAME, 0 )

    if p == GetLocalPlayer( ) then
        call SetFrameSpriteColour( cursor, 0xFF00FF00 )
    endif

    set p = null
    set but = null
    set cursor = null
endfunction

function OnButtonLeave takes nothing returns nothing
    local player p = GetTriggerPlayer( )
    local framehandle but = GetTriggerFrame( )
    local framehandle cursor = GetOriginFrame( ORIGIN_FRAME_CURSOR_FRAME, 0 )
    local framehandle tooltip = GetOriginFrame( ORIGIN_FRAME_UBERTOOLTIP, 0 )

    if p == GetLocalPlayer( ) then
        call SetFrameSpriteColour( cursor, 0xFFFFFFFF )
    endif
    
    set p = null
    set but = null
    set cursor = null
    set tooltip = null
endfunction

function OnButtonClick takes nothing returns nothing
    local player p = GetTriggerPlayer( )
    local framehandle but = GetTriggerFrame( )
    local framehandle selector = GetCFrameByName( "ItemPurchaseSelector", 0 )
    local integer bid = GetHandleId( but )
    local integer pHid = GetHandleId( p )
    local integer index = LoadInteger( FrameHT, bid, 'indx' )
    local integer typeId = LoadInteger( FrameHT, bid, 'tpid' )

    call SaveInteger( FrameHT, pHid, '+bId', index )

    if p == GetLocalPlayer( ) then
        call ClearFrameAllPoints( selector )
        call SetFrameRelativePoint( selector, FRAMEPOINT_BOTTOMLEFT, but, FRAMEPOINT_BOTTOMLEFT, .0, .0 )
        call SetFrameSpriteMaterialScale( selector, .5, 1., 1. )
        call ShowFrame( selector, true )

        if HaveSavedInteger( FrameHT, bid, 'indx' ) then
            call OnDisplayItemButtonData( p, but )
        endif
    endif

    set p = null
    set but = null
    set selector = null
endfunction

function InitFrameItemShop takes nothing returns nothing
    local trigger tOnPress = null
    local trigger tOnUnPress = null
    local trigger tOnClick = null
    local trigger tOnEnter = null
    local trigger tOnLeave = null
    local framehandle gameUI = GetOriginFrame( ORIGIN_FRAME_GAME_UI, 0 )
    local framehandle consoleUI = GetOriginFrame( ORIGIN_FRAME_CONSOLE_UI, 0 )
    local framehandle mainFrame = CreateFrameByType( "SIMPLEFRAME", "ItemSelectionUI", consoleUI, "", 0 )
    local framehandle simpleButton = null
    local framehandle textFrame = null
    local integer i = 0
    local integer j = 0
    local integer k = 0
	local integer id = 0
    local integer maxCharges = 0
    local integer itemCount = 16
    local integer itemsPerRow = 11
    local real x = 0.
    local real y = 0.
    local real width = .0
    local real height = .0
    local string s = ""
    local string array ItemPurchaseData // this will be discarded at the end.

    call EditBlackBorders( .0, .0 ) // -.02, .13 | to return to default 
    call HideOriginFrames( true )
    call ClearFrameAllPoints( mainFrame )
    call SetFrameSize( mainFrame, .29, .45 )
    call SetFrameAbsolutePoint( mainFrame, FRAMEPOINT_CENTER, .34, .35 ) // UI\\Widgets\\ToolTips\\Human\\human-tooltip-border
    call SetFrameTextureEx( mainFrame, "UI\\Widgets\\EscMenu\\Orc\\orc-options-menu-background", "UI\\Widgets\\EscMenu\\Orc\\orc-options-menu-border", 0, false )
    call SetFramePriority( mainFrame, 4 )
    call ShowFrame( mainFrame, true )

    set ItemPurchaseData[  0 ] = "wild"
    set ItemPurchaseData[  1 ] = "spsh"
    set ItemPurchaseData[  2 ] = "ajen"
    set ItemPurchaseData[  3 ] = "bgst"
    set ItemPurchaseData[  4 ] = "belv"
    set ItemPurchaseData[  5 ] = "bspd"
    set ItemPurchaseData[  6 ] = "cnob"
    set ItemPurchaseData[  7 ] = "ratc"
    set ItemPurchaseData[  8 ] = "clfm"
    set ItemPurchaseData[  9 ] = "clsd"
    set ItemPurchaseData[ 10 ] = "crys"
    set ItemPurchaseData[ 11 ] = "dsum"
    set ItemPurchaseData[ 12 ] = "rst1"
    set ItemPurchaseData[ 13 ] = "gcel"
    set ItemPurchaseData[ 14 ] = "hval"
    set ItemPurchaseData[ 15 ] = "hcun"

    set ItemPurchaseData[  0 ] = "wild"
    set ItemPurchaseData[  1 ] = "spsh"
    set ItemPurchaseData[  2 ] = "ajen"
    set ItemPurchaseData[  3 ] = "bgst"
    set ItemPurchaseData[  4 ] = "belv"
    set ItemPurchaseData[  5 ] = "bspd"
    set ItemPurchaseData[  6 ] = "cnob"
    set ItemPurchaseData[  7 ] = "ratc"
    set ItemPurchaseData[  8 ] = "clfm"
    set ItemPurchaseData[  9 ] = "clsd"
    set ItemPurchaseData[ 10 ] = "crys"
    set ItemPurchaseData[ 11 ] = "dsum"
    set ItemPurchaseData[ 12 ] = "rst1"
    set ItemPurchaseData[ 13 ] = "gcel"
    set ItemPurchaseData[ 14 ] = "hval"
    set ItemPurchaseData[ 15 ] = "hcun"

    set ItemPurchaseData[ 1000 +  0 ] = "5"
    set ItemPurchaseData[ 1000 +  1 ] = "0"
    set ItemPurchaseData[ 1000 +  2 ] = "0"
    set ItemPurchaseData[ 1000 +  3 ] = "0"
    set ItemPurchaseData[ 1000 +  4 ] = "0"
    set ItemPurchaseData[ 1000 +  5 ] = "0"
    set ItemPurchaseData[ 1000 +  6 ] = "0"
    set ItemPurchaseData[ 1000 +  7 ] = "0"
    set ItemPurchaseData[ 1000 +  8 ] = "0"
    set ItemPurchaseData[ 1000 +  9 ] = "0"
    set ItemPurchaseData[ 1000 + 10 ] = "0"
    set ItemPurchaseData[ 1000 + 11 ] = "0"
    set ItemPurchaseData[ 1000 + 12 ] = "0"
    set ItemPurchaseData[ 1000 + 13 ] = "0"
    set ItemPurchaseData[ 1000 + 14 ] = "0"
    set ItemPurchaseData[ 1000 + 15 ] = "0"

    set tOnEnter = CreateTrigger( )
    set tOnLeave = CreateTrigger( )
    set tOnPress = CreateTrigger( )
    set tOnUnPress = CreateTrigger( )
    set tOnClick = CreateTrigger( )

    set width = .020
    set height = .038
    loop
        exitwhen i == itemCount
		set id = String2Id( ItemPurchaseData[ i ] )
        set maxCharges = S2I( ItemPurchaseData[ 1000 + i ] )
        set simpleButton = CreateFrameByType( "SIMPLEBUTTON", "ItemListButton", consoleUI, "", i )

        call ClearFrameAllPoints( simpleButton )
        call SetFrameSize( simpleButton, width, height )

        if ModuloInteger( i, itemsPerRow ) == .0 then
            set j = 0
        endif

        set x = .02 + ( width * 1.25 ) * j
        set y = .035 + ( height * 1.4 ) * I2R( i / itemsPerRow )

        call SetFrameRelativePoint( simpleButton, FRAMEPOINT_CENTER, mainFrame, FRAMEPOINT_TOPLEFT, x, -y )
        call SetFrameTexture( simpleButton, GetBaseItemStringFieldById( id, ITEM_SF_ICON ), 0, true )
        call SetFrameTexture( simpleButton, GetBaseItemStringFieldById( id, ITEM_SF_ICON ), 1, true )
        call SetFrameTexture( simpleButton, GetBaseItemStringFieldById( id, ITEM_SF_ICON ), 2, true )

        call SaveInteger( FrameHT, GetHandleId( simpleButton ), 'indx', i )
        call SaveInteger( FrameHT, GetHandleId( simpleButton ), 'tpid', id )
        if maxCharges > 0 then
            call SaveInteger( ItemDataHT, id, 'mchr', maxCharges )
        endif
        call SaveStr( FrameHT, GetHandleId( simpleButton ), 'name', GetBaseItemStringFieldById( id, ITEM_SF_NAME ) )
        call SaveStr( FrameHT, GetHandleId( simpleButton ), 'ninf', GetBaseItemStringFieldById( id, ITEM_SF_TOOLTIP_NORMAL ) )
        call SaveStr( FrameHT, GetHandleId( simpleButton ), 'einf', GetBaseItemStringFieldById( id, ITEM_SF_TOOLTIP_EXTENDED ) )
        call SetFramePriority( simpleButton, 5 )
        call ShowFrame( simpleButton, true )

        call SetFrameParent( simpleButton, mainFrame )
        
        set textFrame = CreateFrameByType( "SIMPLETEXT", "ItemListGoldCostText", simpleButton, "", i )
        call ClearFrameAllPoints( textFrame )
        call SetFrameRelativePoint( textFrame, FRAMEPOINT_BOTTOM, simpleButton, FRAMEPOINT_BOTTOM, .0, -.01 )
        call SetFramePriority( textFrame, 2 )
        call SetFrameFont( textFrame, "Fonts\\FRIZQT__.TTF", .01, 0 )
        call SetFrameTextAlignment( textFrame, TEXT_JUSTIFY_CENTER, TEXT_JUSTIFY_LEFT )
        call SetFrameText( textFrame, I2S( GetBaseItemIntegerFieldById( id, ITEM_IF_GOLD_COST ) ) )
        call SetFrameTextColour( textFrame, 0xFFFFA500 )
        call ShowFrame( textFrame, true )

        call TriggerRegisterFrameEvent( tOnEnter, simpleButton, FRAMEEVENT_MOUSE_ENTER )
        call TriggerRegisterFrameEvent( tOnLeave, simpleButton, FRAMEEVENT_MOUSE_LEAVE )
        call TriggerRegisterFrameEvent( tOnPress, simpleButton, FRAMEEVENT_MOUSE_DOWN )
        call TriggerRegisterFrameEvent( tOnUnPress, simpleButton, FRAMEEVENT_MOUSE_UP )
        call TriggerRegisterFrameEvent( tOnClick, simpleButton, FRAMEEVENT_CONTROL_CLICK )

        call HandleListAddHandle( ItemShopItemList, simpleButton )

        set i = i + 1
        set j = j + 1
    endloop
    
    call TriggerAddAction( tOnEnter, function OnButtonEnter )
    call TriggerAddAction( tOnLeave, function OnButtonLeave )
    call TriggerAddAction( tOnPress, function OnButtonPress )
    call TriggerAddAction( tOnUnPress, function OnButtonUnpress )
    call TriggerAddAction( tOnClick, function OnButtonClick )

    set s = "CustomUI\\Selectors\\ClickableButton"
    set simpleButton = CreateFrameByType( "SIMPLEBUTTON", "ItemSellButton", mainFrame, "", 0 )
    call ClearFrameAllPoints( simpleButton )
    
    call SetFrameTexture( simpleButton, s, 0, true )
    call SetFrameTexture( simpleButton, s, 1, true )
    call SetFrameTexture( simpleButton, s, 2, true )
    call SetFrameSize( simpleButton, .05, .025 )
    call SetFramePriority( simpleButton, 5 )
    call SetFrameParent( simpleButton, mainFrame )
    call ShowFrame( simpleButton, true )
    call SetFrameRelativePoint( simpleButton, FRAMEPOINT_CENTER, mainFrame, FRAMEPOINT_BOTTOMRIGHT, -.0325, .025 )
    call SetFrameEnabled( simpleButton, false )
    call SetFrameColourEx( simpleButton, 1, 0x50FFFFFF )

    set textFrame = CreateFrameByType( "SIMPLETEXT", "ItemSellText", simpleButton, "", 0 )
    call ClearFrameAllPoints( textFrame )
    call SetFramePriority( textFrame, 2 )
    call SetFrameFont( textFrame, "Fonts\\FRIZQT__.TTF", .015, 0 )
    call SetFrameTextAlignment( textFrame, TEXT_JUSTIFY_CENTER, TEXT_JUSTIFY_MIDDLE )
    call SetFrameTextColour( textFrame, 0x50806050 ) // 0xFF806050
    call SetFrameParent( textFrame, simpleButton )
    call SetFrameText( textFrame, "SELL" )
    call ShowFrame( textFrame, true )
    call SetFrameRelativePoint( textFrame, FRAMEPOINT_CENTER, simpleButton, FRAMEPOINT_CENTER, .0, .0 )

    set tOnPress = CreateTrigger( )
    set tOnUnPress = CreateTrigger( )
    set tOnClick = CreateTrigger( )

    call TriggerRegisterFrameEvent( tOnPress, simpleButton, FRAMEEVENT_MOUSE_DOWN )
    call TriggerRegisterFrameEvent( tOnUnPress, simpleButton, FRAMEEVENT_MOUSE_UP )
    call TriggerRegisterFrameEvent( tOnClick, simpleButton, FRAMEEVENT_CONTROL_CLICK )

    call TriggerAddAction( tOnPress, function OnButtonPress )
    call TriggerAddAction( tOnUnPress, function OnButtonUnpress )
    call TriggerAddAction( tOnClick, function OnButtonAcceptSell )

    call GetFrameItemShopUI( )

    set gameUI = null
    set consoleUI = null
    set mainFrame = null
    set simpleButton = null
    set textFrame = null
    set tOnEnter = null
    set tOnLeave = null
    set tOnPress = null
    set tOnUnPress = null
    set tOnClick = null
endfunction

function OnButtonOpenShop takes nothing returns nothing
    call ToggleShopVisibilityState( GetTriggerPlayer( ) )
endfunction

function GetFrameItemShopOpenButton takes nothing returns framehandle
    local framehandle gameUI = null
    local framehandle consoleUI = null
    local framehandle shopUI = null
    local framehandle texture = null
    local framehandle textFrame = null
    local framehandle selectorFrame = null
    local framehandle frm = null
    local framehandle simpleButton = null
    local trigger tOnPress = null
    local trigger tOnUnPress = null
    local trigger tOnClick = null
    local string s = ""
    local integer i = 0

    if ShopButton != null then
        return ShopButton
    endif

    set gameUI = GetOriginFrame( ORIGIN_FRAME_GAME_UI, 0 )
    set consoleUI = GetOriginFrame( ORIGIN_FRAME_CONSOLE_UI, 0 )

    set simpleButton = CreateFrameByType( "SIMPLEBUTTON", "OpenItemShopButton", consoleUI, "", 0 )
    set s = "CustomUI\\Selectors\\ClickableButton"
    call ClearFrameAllPoints( simpleButton )
    
    call SetFrameTexture( simpleButton, s, 0, true )
    call SetFrameTexture( simpleButton, s, 1, true )
    call SetFrameTexture( simpleButton, s, 2, true )
    call SetFrameSize( simpleButton, .05, .025 )
    call SetFramePriority( simpleButton, 6 )
    call ShowFrame( simpleButton, true )
    call SetFrameRelativePoint( simpleButton, FRAMEPOINT_CENTER, consoleUI, FRAMEPOINT_CENTER, .2425, -.15 )

    set textFrame = CreateFrameByType( "SIMPLETEXT", "OpenItemShopText", simpleButton, "", 0 )
    call ClearFrameAllPoints( textFrame )
    
    call SetFramePriority( textFrame, 2 )
    call SetFrameFont( textFrame, "Fonts\\FRIZQT__.TTF", .015, 0 )
    call SetFrameTextAlignment( textFrame, TEXT_JUSTIFY_CENTER, TEXT_JUSTIFY_MIDDLE )
    call SetFrameTextColour( textFrame, 0xFF806050 ) // 0xFFFF9000
    call SetFrameParent( textFrame, simpleButton )
    call SetFrameText( textFrame, "SHOP" )
    call ShowFrame( textFrame, true )

    set tOnPress = CreateTrigger( )
    set tOnUnPress = CreateTrigger( )
    set tOnClick = CreateTrigger( )

    call TriggerRegisterFrameEvent( tOnPress, simpleButton, FRAMEEVENT_MOUSE_DOWN )
    call TriggerRegisterFrameEvent( tOnUnPress, simpleButton, FRAMEEVENT_MOUSE_UP )
    call TriggerRegisterFrameEvent( tOnClick, simpleButton, FRAMEEVENT_CONTROL_CLICK )

    call TriggerAddAction( tOnPress, function OnButtonPress )
    call TriggerAddAction( tOnUnPress, function OnButtonUnpress )
    call TriggerAddAction( tOnClick, function OnButtonOpenShop )

    call SetFrameRelativePoint( textFrame, FRAMEPOINT_CENTER, simpleButton, FRAMEPOINT_CENTER, .0, .0 )
    
    set texture = CreateFrameByType( "SIMPLETEXTURE", "ShopPlayerGoldTexture", consoleUI, "", 0 )
    call SetFrameTexture( texture, "UI\\Feedback\\Resources\\ResourceGold", 0, false )
    call ClearFrameAllPoints( texture )
    call SetFrameRelativePoint( texture, FRAMEPOINT_CENTER, simpleButton, FRAMEPOINT_RIGHT, .01, .0 )
    call SetFrameParent( texture, simpleButton )
    call SetFrameSize( texture, .01, .015 )
    call SetFramePriority( texture, 2 )
    call ShowFrame( texture, true )

    set textFrame = CreateFrameByType( "SIMPLETEXT", "ShopPlayerGoldText", consoleUI, "", i )
    call ClearFrameAllPoints( textFrame )
    call SetFrameRelativePoint( textFrame, FRAMEPOINT_CENTER, texture, FRAMEPOINT_RIGHT, .015, .0 )
    call SetFrameParent( textFrame, simpleButton )
    call SetFramePriority( textFrame, 2 )
    call SetFrameFont( textFrame, "Fonts\\FRIZQT__.TTF", .011, 0 )
    call SetFrameTextAlignment( textFrame, TEXT_JUSTIFY_CENTER, TEXT_JUSTIFY_LEFT )
    call SetFrameTextColour( textFrame, 0xFFFFA500 )
    call SetFrameText( textFrame, I2S( GetPlayerState( GetLocalPlayer( ), PLAYER_STATE_RESOURCE_GOLD ) ) )
    call ShowFrame( textFrame, true )

    set ShopButton = simpleButton

    set gameUI = null
    set consoleUI = null
    set simpleButton = null
    set textFrame = null
    set tOnPress = null
    set tOnUnPress = null
    set tOnClick = null
    return ShopButton
endfunction

function OnPlayerGoldChange takes nothing returns nothing
    local player p = GetTriggerPlayer( )
    local playerstate state = GetEventPlayerState( )
    local integer amount = GetPlayerState( p, state )
    local framehandle goldFrame = GetCSimpleFontStringByName( "ShopPlayerGoldText", 0 )

    if p == GetLocalPlayer( ) then
        call SetFrameText( goldFrame, I2S( amount ) )
    endif

    set p = null
    set state = null
    set goldFrame = null
endfunction

function OnItemButtonClick takes nothing returns nothing
    local player p = GetTriggerPlayer( )
    local integer hid = GetHandleId( p )
    local framehandle but = GetTriggerFrame( )
    local framehandle tempBut = null
    local framehandle selector = null
    local framehandle cursor = GetOriginFrame( ORIGIN_FRAME_CURSOR_FRAME, 0 )
    local mousebuttontype mtype = GetTriggerFrameMouseButton( )
    local item it = null
    local integer i = 0
    local integer colour = 0xFF806050

    if GetFrameSpriteCurrentAnimationId( cursor ) == 5 and mtype == MOUSE_BUTTON_TYPE_RIGHT then
        loop
            set tempBut = GetOriginFrame( ORIGIN_FRAME_ITEM_BUTTON, i )
            exitwhen i == 6 or but == tempBut
            set i = i + 1
        endloop
        
        if i < 6 then
            set it = UnitItemInSlot( LoadUnitHandle( FrameHT, hid, 'hero' ), i )
            
            if it == null then
                set i = -1
            endif
        else
            set i = -1
        endif
    else
        set i = -1
    endif

    set selector = GetCFrameByName( "ItemPurchaseSelector", 0 )

    if p == GetLocalPlayer( ) then
        call SaveInteger( FrameHT, hid, 'itId', i )
        call SyncSavedInteger( FrameHT, hid, 'itId' )

        if i != -1 then
            call SaveInteger( FrameHT, hid, '+bId', -1 )
            call SetFrameShopSellButtonState( p, true )
            
            call ShowFrame( selector, false )
            call ClearFrameAllPoints( selector )
            call SetFrameSpriteMaterialScale( selector, .8, .8, 1. )
            call SetFrameRelativePoint( selector, FRAMEPOINT_BOTTOMLEFT, but, FRAMEPOINT_BOTTOMLEFT, .0, .0 )
            call ShowFrame( selector, true )
        else
            call SetFrameShopSellButtonState( p, false )
            call ShowFrame( selector, false )
        endif
    endif

    set p = null
    set but = null
    set tempBut = null
    set selector = null
    set cursor = null
    set it = null
    set mtype = null
endfunction

function InitFrameItemShopSellSystem takes nothing returns nothing
    local trigger t = CreateTrigger( )
    local framehandle but = null
    local integer i = 0
    
    loop
        exitwhen i == 6
        set but = GetOriginFrame( ORIGIN_FRAME_ITEM_BUTTON, i )
        call TriggerRegisterFrameEvent( t, but, FRAMEEVENT_CONTROL_CLICK )
        set i = i + 1
    endloop
    
    call TriggerAddAction( t, function OnItemButtonClick )
    
    set t = null
endfunction

function InitFrameItemShopForPlayer takes player p returns nothing
    local trigger t = null
	local integer hid = GetHandleId( p )
    local unit u = LoadUnitHandle( FrameHT, hid, 'hero' )

    if u == null then
        call SetPlayerState( p, PLAYER_STATE_RESOURCE_GOLD, 9999999 )
        set t = CreateTrigger( )
        set u = CreateUnit( p, 'Hpal', -500. + 1000. * GetPlayerId( p ), .0, .0 )
        if p == GetLocalPlayer( ) then
            call SelectUnit( u, true )
        endif
        call SaveUnitHandle( FrameHT, hid, 'hero', u )

        call TriggerRegisterPlayerStateEvent( t, p, PLAYER_STATE_RESOURCE_GOLD, GREATER_THAN_OR_EQUAL, 0. )
        call TriggerAddAction( t, function OnPlayerGoldChange )
    endif

    set u = null
    set t = null
endfunction

function OnInitFrameItemShopSystemDelayed takes nothing returns nothing
    call InitFrameItemShopForPlayer( Player( 0 ) )
    call InitFrameItemShopForPlayer( Player( 1 ) )

    call InitFrameItemShop( )
    call GetFrameItemShopOpenButton( )
    call InitFrameItemShopSellSystem( )
endfunction

//===========================================================================
function InitTrig_FrameItemShopSystem takes nothing returns nothing
    //set gg_trg_FrameItemShopSystem = CreateTrigger(  )

    call FogEnable( false )
    call FogMaskEnable( false )
    call PanCameraToTimed( 0., 0., 0. )
    call EnableOperationLimit( false )
    call TimerStart( CreateTimer( ), .5, false, function OnInitFrameItemShopSystemDelayed )
endfunction

Скриншоты

Превью

`
ОЖИДАНИЕ РЕКЛАМЫ...
5
35
10 месяцев назад
5
Наконец-то годный ресурс за день
2
29
10 месяцев назад
2
Отличная система магазина.
110/10
Ставлю лайк сразу за подобную годноту.
0
20
9 месяцев назад
0
Вышла новая версия!
Карта обновлена под UjAPI v1.0.28.102.
2
20
6 месяцев назад
2
Вышла новая версия!
Карта обновлена под UjAPI v1.0.37.137.
2
20
4 месяца назад
2
Вышла новая версия!
Карта обновлена под UjAPI v1.1.4.167
2
20
2 месяца назад
2
Вышла новая версия!
Карта обновлена под UjAPI v1.1.8.178, система выбора теперь использует SIMPLEGRID для выставления фреймов.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.