local sw, sh = guiGetScreenSize ( )
local isPanel = false

items = {
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
    { itemName = nil, quantity = 0, image = nil },
} -- ข้อมูลตาราง

scroll = 0 -- เลื่อนขึ้นลง ( ห้ามแก้ไข )
postGUI = false

_p = {}
_p.main = {}
_p.main.w = 550 -- ขนาดความกว้าง
_p.main.h = 580 -- ขนาดความสูง
_p.main.x = sw/2 - _p.main.w/2 -- ตำแหน่งพิกัด X
_p.main.y = sh/2 - _p.main.h/2 -- ตำแหน่งพิกัด Y
_p.main.color = tocolor( 26, 26, 26, 255 ) -- สีพื้นหลัง

_p.boxs = {}
_p.boxs.horizontal = 4 -- จำนวนช่องแนวนอน
_p.boxs.vertical = 3 --  จำนวนช่องแนวตั้ง
_p.boxs.w = 120 -- ขนาดความกว้าง
_p.boxs.h = 160 -- ขนาดความสูง
_p.boxs.distX = 8 -- ระยะห่างของแต่ละช่อง X
_p.boxs.distY = 8 -- ระยะห่างของแต่ละช่อง Y

_p.boxs.mainX = ( _p.main.w - ( _p.boxs.w * _p.boxs.horizontal ) - ( _p.boxs.distX * ( _p.boxs.horizontal - 1 ) ) ) / 2 -- ระยะห่างของช่องจาก Main X ( ไม่แนะนำให้แก้ไข )
_p.boxs.mainY = 40 -- ระยะห่างของช่องจาก Main Y

_p.boxs.color = tocolor( 190, 190, 190, 120 ) -- สีพื้นหลัง ของช่อง

_p.img = {}
_p.img.w = 120 -- ขนาดรูป Width
_p.img.h = 120 -- ขนาดรูป Height
_p.img.distY = 0 -- ระยะห่างรูปจากด้านบน
_p.img.color = tocolor( 255, 255, 255, 255 ) -- สีรูป

_p.item = {}
_p.item.distX = 0 -- ระยะห่างข้อความจากซ้าย
_p.item.distY = 20 -- ระยะห่างข้อความจากด้านบน
_p.item.scale = 1 -- ขนาด font
_p.item.font = "default-bold" -- font
_p.item.color = tocolor( 255, 255, 255, 255 ) -- สีข้อความ


_p.qty = {}
_p.qty.distX = 0
_p.qty.distY = 120 + 20 -- ระยะห่างข้อความจากด้านบน ( 120 คือ _p.img.h / 20 คือระยะห่างจากรูป สามารภกำหนดได้อิสระ )
_p.qty.scale = 1 -- ขนาด font
_p.qty.font = "default-bold" -- font
_p.qty.color = tocolor( 255, 255, 255, 255 ) -- สีข้อความ

addEventHandler( "onClientRender", getRootElement( ),
    function ( )
        if not isPanel then return false end

        -- สร้างพื้นหลัง
        dxDrawRectangle( _p.main.x, _p.main.y, _p.main.w, _p.main.h, _p.main.color, postGUI )

        local number = #items
        if number > _p.boxs.horizontal * _p.boxs.vertical then
            number = _p.boxs.horizontal * _p.boxs.vertical
        end

        local xLine = 0
        local yLine = 0
        for i=1, number do
            if xLine == _p.boxs.horizontal then
                yLine = yLine + _p.boxs.h + _p.boxs.distY
                xLine = 1
            else
                xLine = xLine + 1
            end

            -- บันทึกตำแหน่งลงตาราง
            if items[ i + scroll ] then
                items[ i + scroll ].pos = {
                    x = _p.main.x + _p.boxs.mainX + ( _p.boxs.distX + _p.boxs.w ) * ( xLine - 1 ),
                    y = _p.main.y + _p.boxs.mainY + yLine
                }
            end

            local data = items[ i + scroll ]
            if data then
                -- สร้างช่อง
                dxDrawRectangle( data.pos.x, data.pos.y, _p.boxs.w, _p.boxs.h, _p.boxs.color, postGUI )

                -- แสดงไอดีช่อง
                dxDrawText( i + scroll, data.pos.x, data.pos.y, 0, 0, tocolor( 255, 255, 255, 255 ), 1, "default", "left", "top", false, false, postGUI, false, false, 0, 0, 0 )

                -- พิกัดที่สามารถทำไปใช้ต่อได้ data.pos.x และ data.pos.y
                -- ขนาด _p.boxs.w และ _p.boxs.h

                -- แสดงรูปภาพ
                if data.image and type( data.quantity ) == "string" then
                    dxDrawImage( data.pos.x + ( _p.boxs.w/2 - _p.img.w/2 ), data.pos.y, _p.img.w, _p.img.h, data.image, 0, 0, 0, _p.img.color, postGUI )
                end


                -- แสดงข้อความชื่อไอเทม
                if data.quantity and type( data.quantity ) == "string" then
                    local text = data.itemName
                    local scale = _p.item.scale
                    local font = _p.item.font
                    local textWidth = dxGetTextWidth( string.gsub( text, "#%x%x%x%x%x%x", "" ), scale, font )
                    local textHeight = dxGetFontHeight( scale, font )
                    dxDrawText( string.gsub( text, "#%x%x%x%x%x%x", "" ), data.pos.x + ( _p.boxs.w/2 - textWidth/2 ) + _p.item.distX + 1, data.pos.y + _p.item.distY + 1, 0, 0, tocolor( 255, 255, 255, 255 ), scale, font, "left", "top", false, false, postGUI, false, false, 0, 0, 0 )
                    dxDrawText( string.gsub( text, "#%x%x%x%x%x%x", "" ), data.pos.x + ( _p.boxs.w/2 - textWidth/2 ) + _p.item.distX - 1, data.pos.y + _p.item.distY - 1, 0, 0, tocolor( 255, 255, 255, 255 ), scale, font, "left", "top", false, false, postGUI, false, false, 0, 0, 0 )
                    dxDrawText( string.gsub( text, "#%x%x%x%x%x%x", "" ), data.pos.x + ( _p.boxs.w/2 - textWidth/2 ) + _p.item.distX + 1, data.pos.y + _p.item.distY - 1, 0, 0, tocolor( 255, 255, 255, 255 ), scale, font, "left", "top", false, false, postGUI, false, false, 0, 0, 0 )
                    dxDrawText( string.gsub( text, "#%x%x%x%x%x%x", "" ), data.pos.x + ( _p.boxs.w/2 - textWidth/2 ) + _p.item.distX - 1, data.pos.y + _p.item.distY + 1, 0, 0, tocolor( 255, 255, 255, 255 ), scale, font, "left", "top", false, false, postGUI, false, false, 0, 0, 0 )
                   
                    dxDrawText( text, data.pos.x + ( _p.boxs.w/2 - textWidth/2 ) + _p.item.distX, data.pos.y + _p.item.distY, 0, 0, tocolor( 255, 255, 255, 255 ), scale, font, "left", "top", false, false, postGUI, false, false, 0, 0, 0 )
                end

                -- แสดงข้อความจำนวน
                if data.quantity and ( type( data.quantity ) == "string" or data.quantity == "number" ) then
                    local text = data.quantity
                    local scale = _p.qty.scale
                    local font = _p.qty.font
                    local textWidth = dxGetTextWidth( string.gsub( text, "#%x%x%x%x%x%x", "" ), scale, font )
                    local textHeight = dxGetFontHeight( scale, font )
                    dxDrawText( string.gsub( text, "#%x%x%x%x%x%x", "" ), data.pos.x + ( _p.boxs.w/2 - textWidth/2 ) + _p.qty.distX + 1, data.pos.y + _p.qty.distY + 1, 0, 0, tocolor( 26, 26, 26, 160 ), scale, font, "left", "top", false, false, postGUI, false, false, 0, 0, 0 )
                    dxDrawText( string.gsub( text, "#%x%x%x%x%x%x", "" ), data.pos.x + ( _p.boxs.w/2 - textWidth/2 ) + _p.qty.distX - 1, data.pos.y + _p.qty.distY - 1, 0, 0, tocolor( 26, 26, 26, 160 ), scale, font, "left", "top", false, false, postGUI, false, false, 0, 0, 0 )
                    dxDrawText( string.gsub( text, "#%x%x%x%x%x%x", "" ), data.pos.x + ( _p.boxs.w/2 - textWidth/2 ) + _p.qty.distX + 1, data.pos.y + _p.qty.distY - 1, 0, 0, tocolor( 26, 26, 26, 160 ), scale, font, "left", "top", false, false, postGUI, false, false, 0, 0, 0 )
                    dxDrawText( string.gsub( text, "#%x%x%x%x%x%x", "" ), data.pos.x + ( _p.boxs.w/2 - textWidth/2 ) + _p.qty.distX - 1, data.pos.y + _p.qty.distY + 1, 0, 0, tocolor( 26, 26, 26, 160 ), scale, font, "left", "top", false, false, postGUI, false, false, 0, 0, 0 )

                    dxDrawText( text, data.pos.x + ( _p.boxs.w/2 - textWidth/2 ) + _p.qty.distX, data.pos.y + _p.qty.distY, 0, 0, tocolor( 255, 255, 255, 255 ), scale, font, "left", "top", false, false, postGUI, false, false, 0, 0, 0 )
                end

            end

        end
    end
)

-- ฟังก์ชั่นสำหรับตรวจสอบว่าเราคลิกที่ตำแหน่งช่องไหน return ไอดีช่อง
function isClicker ( )
    if isMouseWithinRangeOf ( _p.main.x, _p.main.y, _p.main.w, _p.main.h ) then
        local number = #items
        if number > _p.boxs.horizontal * _p.boxs.vertical then
            number = _p.boxs.horizontal * _p.boxs.vertical
        end
        for i=1, number do
            local data = items[ i + scroll ]
            if data then
                if isMouseWithinRangeOf ( data.pos.x, data.pos.y, _p.boxs.w, _p.boxs.h ) then
                    return i + scroll
                end
            end
        end
    end
    return false
end

-- ฟังก์ชั่นตรวจสอบตำแหน่งเม้าส์
function isMouseWithinRangeOf ( psx, psy, pssx, pssy )
    if not isCursorShowing ( ) then
        return false
    end
    local cx, cy = getCursorPosition( )
    local sw, sh = guiGetScreenSize( )
    cx, cy = cx * sw, cy * sh
    if cx >= psx and cx <= psx + pssx and cy >= psy and cy <= psy + pssy then
        return true,cx,cy
    else
        return false
    end
end

addEventHandler( "onClientKey", root,
    function( button, press )
        if not isPanel then return false end
       
        if button == "mouse1" then
            if press == true then
                -- เมื่อผู้เล่นคลิกซ้าย down
            else
                -- เมื่อผู้เล่นคลิกซ้าย up
               
                -- ไอดีช่องที่คลิก
                local boxID = isClicker ( )
                if boxID then
                    outputChatBox( "click up box id " .. boxID )
                end

            end
        end

        -- เลื่อนขึ้นลง เมื่อเม้าส์อยู่ในตำแหน่ง Panel
        if press then
            if isMouseWithinRangeOf ( _p.main.x, _p.main.y, _p.main.w, _p.main.h ) then
                if button == "mouse_wheel_up" then
                    if scroll > 0 then
                        scroll = scroll - _p.boxs.horizontal
                    end
                elseif button == "mouse_wheel_down" then
                    if #items > _p.boxs.horizontal * _p.boxs.vertical then
                        if scroll < #items - _p.boxs.horizontal then
                            scroll = scroll + _p.boxs.horizontal
                        end
                    end
                end
            end
        end

    end
)

function startPanel ( state )
    if state == true then
        isPanel = true
    else
        isPanel = false
    end
end

bindKey( "tab", "down",
function ( )
    if isPanel then
        startPanel ( false )
    else
        startPanel ( true )
    end
end
)

ไม่มีความคิดเห็น:

แสดงความคิดเห็น