carlos eduardo Posted May 6, 2018 Share Posted May 6, 2018 Estou tentando fazer um script para por cor no carro com um color picker. Queria saber quais as syntaxes para conseguir fazer um tipo esse. http://prntscr.com/jeflct Link to comment
Other Languages Moderators Lord Henry Posted May 7, 2018 Other Languages Moderators Share Posted May 7, 2018 (edited) Sugiro que use este colorPicker: Spoiler function table.copy(theTable) local t = {} for k, v in pairs(theTable) do if type(v) == "table" then t[k] = table.copy(theTable) else t[k] = v end end return t end colorPicker = { default = { x = 0, y = 0, width = 200, height = 20, buttonWidth = .38, testWidth = .6, testHeight = 1, relative = false, value = "#ff0000ff", selectWindow = { width = 350, height = 430, paletteX = 18, paletteY = 30, luminanceOffset = 10, luminanceWidth = 15, alphaOffset = 25 + 17, alphaWidth = 15, rgbX = 265, rgbY = 300, rgbWidth = 50, rgbHeight = 21, hslX = 190, hslY = 300, hslWidth = 50, hslHeight = 21, historyX = 18, historyY = 300, historyWidth = 140, historyHeight = 80, noteX = 18, noteY = 378, ra1X = 18, ra1Y = 398, ra2X = 88, ra2Y = 398, ra3X = 168, ra3Y = 398 } }, constructor = function( info ) info = info or colorPicker.default colorPicker.value = colorPicker.convertColorToTable(info.value) colorPicker.buttonWidth = info.width * colorPicker.default.buttonWidth local offset = 1 --px local height = 10 --local sizeX, sizeY = guiGetSize(info.parent, false) if not sizeX then sizeX, sizeY = guiGetScreenSize() end if info.relative then offset = offset / sizeX height = height / sizeY end colorPicker.GUI = {} colorPicker.children = {} -- Create the color selection window local screenW, screenH = guiGetScreenSize() colorPicker.selectWindow = info.selectWindow colorPicker.GUI.selectWindow = guiCreateWindow(screenW - info.selectWindow.width - 5, 5, info.selectWindow.width, info.selectWindow.height, "Escolha a cor (clique fora da janela para fechar)", false) guiSetVisible(colorPicker.GUI.selectWindow, false) guiWindowSetSizable(colorPicker.GUI.selectWindow, false) colorPicker.GUI.palette = guiCreateStaticImage(colorPicker.selectWindow.paletteX, colorPicker.selectWindow.paletteY, 256, 256, "colorpicker/palette.png", false, colorPicker.GUI.selectWindow) colorPicker.GUI.alphaBar = guiCreateStaticImage(colorPicker.selectWindow.paletteX + 255 + colorPicker.selectWindow.alphaOffset, colorPicker.selectWindow.paletteY, colorPicker.selectWindow.alphaWidth, 255, "colorpicker/alpha.png", false, colorPicker.GUI.selectWindow) colorPicker.isSelectOpen = false -- Create the RGB and HSL edit boxes colorPicker.children.R = guiCreateEdit(info.selectWindow.rgbX + 10, info.selectWindow.rgbY, info.selectWindow.rgbWidth, info.selectWindow.rgbHeight, tostring( colorPicker.value[1] ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.R, 3) addEventHandler("onClientGUIChanged", colorPicker.children.R, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.R, colorPicker.selectionManualInputRGB) colorPicker.GUI.labelR = guiCreateLabel(info.selectWindow.rgbX, info.selectWindow.rgbY + 3, 10, 20, "R", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelR, "default-bold-small") colorPicker.children.G = guiCreateEdit(info.selectWindow.rgbX + 10, info.selectWindow.rgbY + info.selectWindow.rgbHeight, info.selectWindow.rgbWidth, info.selectWindow.rgbHeight, tostring( colorPicker.value[2] ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.G, 3) addEventHandler("onClientGUIChanged", colorPicker.children.G, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.G, colorPicker.selectionManualInputRGB) colorPicker.GUI.labelG = guiCreateLabel(info.selectWindow.rgbX, info.selectWindow.rgbY + 3 + info.selectWindow.rgbHeight, 10, 20, "G", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelG, "default-bold-small") colorPicker.children.B = guiCreateEdit(info.selectWindow.rgbX + 10, info.selectWindow.rgbY + info.selectWindow.rgbHeight*2, info.selectWindow.rgbWidth, info.selectWindow.rgbHeight, tostring( colorPicker.value[3] ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.B, 3) addEventHandler("onClientGUIChanged", colorPicker.children.B, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.B, colorPicker.selectionManualInputRGB) colorPicker.GUI.labelB = guiCreateLabel(info.selectWindow.rgbX, info.selectWindow.rgbY + 3 + info.selectWindow.rgbHeight*2, 10, 20, "B", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelB, "default-bold-small") colorPicker.children.A = guiCreateEdit(info.selectWindow.rgbX + 10, info.selectWindow.rgbY + info.selectWindow.rgbHeight*3, info.selectWindow.rgbWidth, info.selectWindow.rgbHeight, tostring( colorPicker.value[4] ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.A, 3) addEventHandler("onClientGUIChanged", colorPicker.children.A, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.A, colorPicker.selectionManualInputRGB) colorPicker.GUI.labelA = guiCreateLabel(info.selectWindow.rgbX - 25, info.selectWindow.rgbY + 3 + info.selectWindow.rgbHeight*3, 50, 20, "Alpha", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelA, "default-bold-small") colorPicker.h, colorPicker.s, colorPicker.l = colorPicker.rgb2hsl(colorPicker.value[1] / 255, colorPicker.value[2] / 255, colorPicker.value[3] / 255) colorPicker.children.H = guiCreateEdit(info.selectWindow.hslX + 10, info.selectWindow.hslY, info.selectWindow.hslWidth, info.selectWindow.hslHeight, tostring( math.floor(colorPicker.h * 255) ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.H, 3) addEventHandler("onClientGUIChanged", colorPicker.children.H, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.H, colorPicker.selectionManualInputHSL) colorPicker.GUI.labelH = guiCreateLabel(info.selectWindow.hslX, info.selectWindow.hslY + 3, 10, 20, "H", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelH, "default-bold-small") colorPicker.children.S = guiCreateEdit(info.selectWindow.hslX + 10, info.selectWindow.hslY + info.selectWindow.hslHeight, info.selectWindow.hslWidth, info.selectWindow.hslHeight, tostring( math.floor(colorPicker.s * 255) ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.S, 3) addEventHandler("onClientGUIChanged", colorPicker.children.S, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.S, colorPicker.selectionManualInputHSL) colorPicker.GUI.labelS = guiCreateLabel(info.selectWindow.hslX, info.selectWindow.hslY + 3 + info.selectWindow.hslHeight, 10, 20, "S", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelS, "default-bold-small") colorPicker.children.L = guiCreateEdit(info.selectWindow.hslX + 10, info.selectWindow.hslY + info.selectWindow.hslHeight*2, info.selectWindow.hslWidth, info.selectWindow.hslHeight, tostring( math.floor(colorPicker.s * 255) ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.L, 3) addEventHandler("onClientGUIChanged", colorPicker.children.L, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.L, colorPicker.selectionManualInputHSL) colorPicker.GUI.labelL = guiCreateLabel(info.selectWindow.hslX, info.selectWindow.hslY + 3 + info.selectWindow.hslHeight*2, 10, 20, "L", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelL, "default-bold-small") -- Create the color history if not colorHistory then colorHistory = {} for i=1,9 do colorHistory[i] = { 255, 255, 255, 200 } end end colorPicker.GUI.historyLabel = guiCreateLabel(info.selectWindow.historyX, info.selectWindow.historyY, 150, 15, "Cores usadas recentemente:", false, colorPicker.GUI.selectWindow) colorPicker.GUI.noteLabel = guiCreateLabel(info.selectWindow.noteX, info.selectWindow.noteY, 190, 15, "Clique fora desta janela para fechar.", false, colorPicker.GUI.selectWindow) guiSetFont( colorPicker.GUI.noteLabel, "default-small" ) checkColor1 = guiCreateCheckBox(info.selectWindow.ra1X, info.selectWindow.ra1Y, 70, 15, "Cor 1", true, false, colorPicker.GUI.selectWindow) checkColor2 = guiCreateCheckBox(info.selectWindow.ra2X, info.selectWindow.ra2Y, 70, 15, "Cor 2", true, false, colorPicker.GUI.selectWindow) colorPicker.avoidRecursion = false end, forceNaturalAndRange = function() local inputText = guiGetText( source ) if not tonumber( inputText ) then local changedText = string.gsub( inputText, "[^%d]", "" ) if changedText ~= inputText then guiSetText(source, changedText) end end local inputNumber = tonumber(guiGetText( source )) if inputNumber then local clampedNumber = inputNumber clampedNumber = math.max(clampedNumber, 0) clampedNumber = math.min(clampedNumber, 255) if clampedNumber ~= inputNumber then guiSetText(source, tostring(clampedNumber)) end end end, setValue = function( value ) colorPicker.value = colorPicker.convertColorToTable(value) colorPicker.updateTempColors() local avoidRecursion = colorPicker.avoidRecursion colorPicker.avoidRecursion = true colorPicker.updateSelectionWindowEdits() colorPicker.avoidRecursion = avoidRecursion return true end, selectionManualInputRGB = function() if not colorPicker.avoidRecursion then colorPicker.avoidRecursion = true local r, g, b, a = tonumber(guiGetText(colorPicker.children.R)), tonumber(guiGetText(colorPicker.children.G)), tonumber(guiGetText(colorPicker.children.B)), tonumber(guiGetText(colorPicker.children.A)) if not r or not g or not b or not a then colorPicker.avoidRecursion = false return end colorPicker.h, colorPicker.s, colorPicker.l = colorPicker.rgb2hsl(r / 255, g / 255, b / 255) colorPicker.setValue({r, g, b, a}) colorPicker.avoidRecursion = false end end, selectionManualInputHSL = function() if not colorPicker.avoidRecursion then colorPicker.avoidRecursion = true local h, s, l = tonumber(guiGetText(colorPicker.children.H)), tonumber(guiGetText(colorPicker.children.S)), tonumber(guiGetText(colorPicker.children.L)) if not h or not s or not l then colorPicker.avoidRecursion = false return end colorPicker.h, colorPicker.s, colorPicker.l = h / 255, s / 255, l / 256 local r, g, b = colorPicker.hsl2rgb(colorPicker.h, colorPicker.s, colorPicker.l) colorPicker.setValue({r * 255, g * 255, b * 255, colorPicker.value[4]}) colorPicker.avoidRecursion = false end end, updateSelectionWindowEdits = function() guiSetText(colorPicker.children.R, tostring(colorPicker.value[1])) guiSetText(colorPicker.children.G, tostring(colorPicker.value[2])) guiSetText(colorPicker.children.B, tostring(colorPicker.value[3])) guiSetText(colorPicker.children.A, tostring(colorPicker.value[4])) guiSetText(colorPicker.children.H, tostring(math.floor(colorPicker.h * 255))) guiSetText(colorPicker.children.S, tostring(math.floor(colorPicker.s * 255))) guiSetText(colorPicker.children.L, tostring(math.floor(colorPicker.l * 256))) end, --This is where the color updates every time you click the palette or presets! updateTempColors = function() local r, g, b, a = colorPicker.value[1], colorPicker.value[2], colorPicker.value[3], colorPicker.value[4] return r, g, b end, openSelect = function( currentColor ) if colorPicker.isSelectOpen then return end colorPicker.currentColor = currentColor --local r, g, b, a = tempColors[currentColor].r, tempColors[currentColor].g, tempColors[currentColor].b, tempColors[currentColor].a --colorPicker.setValue( { r * 255, g * 255, b * 255, a * 255 } ) guiSetVisible(colorPicker.GUI.selectWindow, true) guiBringToFront(colorPicker.GUI.selectWindow) addEventHandler("onClientRender", root, colorPicker.updateSelectedValue) addEventHandler("onClientClick", root, colorPicker.pickColor) colorPicker.isSelectOpen = true colorPicker.pickingColor = false colorPicker.pickingLuminance = false colorPicker.pickingAlpha = false colorPicker.h, colorPicker.s, colorPicker.l = colorPicker.rgb2hsl(colorPicker.value[1] / 255, colorPicker.value[2] / 255, colorPicker.value[3] / 255) end, closeSelect = function() if not colorPicker.isSelectOpen then return end colorPicker.currentColor = nil guiSetVisible(colorPicker.GUI.selectWindow, false) removeEventHandler("onClientRender", root, colorPicker.updateSelectedValue) removeEventHandler("onClientClick", root, colorPicker.pickColor) colorPicker.isSelectOpen = false colorPicker.addCurrentColorToHistory() closedColorPicker(colorPicker.value[1], colorPicker.value[2], colorPicker.value[3]) end, addCurrentColorToHistory = function() -- First look up in color history to check if the -- current color is already present there for i=1,9 do local color = colorHistory[i] if color[1] == colorPicker.value[1] and color[2] == colorPicker.value[2] and color[3] == colorPicker.value[3] and color[4] == colorPicker.value[4] then return end end -- Pop the last color and insert the new value table.remove(colorHistory) table.insert(colorHistory, 1, table.copy(colorPicker.value)) end, updateSelectedValue = function() if not guiGetVisible(colorPicker.GUI.selectWindow) then return end local r, g, b, a -- Check for color changes local wx, wy = guiGetPosition(colorPicker.GUI.selectWindow, false) local paletteX, paletteY = wx + colorPicker.selectWindow.paletteX, wy + colorPicker.selectWindow.paletteY local luminanceX, luminanceY = paletteX + 255 + colorPicker.selectWindow.luminanceOffset, paletteY local alphaX, alphaY = paletteX + 255 + colorPicker.selectWindow.alphaOffset - 1, paletteY --Wont work until I get the actual mouse working local cursorX, cursorY = getCursorPosition() local screenW, screenH = guiGetScreenSize() cursorX = cursorX * screenW cursorY = cursorY * screenH if colorPicker.pickingColor then if cursorX < paletteX then cursorX = paletteX elseif cursorX > paletteX + 255 then cursorX = paletteX + 255 end if cursorY < paletteY then cursorY = paletteY elseif cursorY > paletteY + 255 then cursorY = paletteY + 255 end setCursorPosition(cursorX, cursorY) colorPicker.h, colorPicker.s = (cursorX - paletteX) / 255, (255 - cursorY + paletteY) / 255 r, g, b = colorPicker.hsl2rgb(colorPicker.h, colorPicker.s, colorPicker.l) a = colorPicker.value[4] / 255 colorPicker.avoidRecursion = true colorPicker.setValue({r*255, g*255, b*255, colorPicker.value[4]}) colorPicker.avoidRecursion = false elseif colorPicker.pickingLuminance then if cursorY < luminanceY then cursorY = luminanceY elseif cursorY > luminanceY + 256 then cursorY = luminanceY + 256 end setCursorPosition(cursorX, cursorY) colorPicker.l = (256 - cursorY + luminanceY) / 256 r, g, b = colorPicker.hsl2rgb(colorPicker.h, colorPicker.s, colorPicker.l) a = colorPicker.value[4] / 255 colorPicker.avoidRecursion = true colorPicker.setValue({r*255, g*255, b*255, colorPicker.value[4]}) colorPicker.avoidRecursion = false elseif colorPicker.pickingAlpha then if cursorY < alphaY then cursorY = alphaY elseif cursorY > alphaY + 255 then cursorY = alphaY + 255 end setCursorPosition(cursorX, cursorY) colorPicker.avoidRecursion = true colorPicker.setValue({colorPicker.value[1], colorPicker.value[2], colorPicker.value[3], cursorY - alphaY}) colorPicker.avoidRecursion = false r, g, b, a = colorPicker.value[1] / 255, colorPicker.value[2] / 255, colorPicker.value[3] / 255, colorPicker.value[4] / 255 else r, g, b, a = colorPicker.value[1] / 255, colorPicker.value[2] / 255, colorPicker.value[3] / 255, colorPicker.value[4] / 255 end -- Draw the lines pointing to the current selected color local x = paletteX + (colorPicker.h * 255) local y = paletteY + ((1 - colorPicker.s) * 255) local color = tocolor(0, 0, 0, 255) dxDrawLine(x - 12, y, x - 2, y, color, 3, true) dxDrawLine(x + 2, y, x + 12, y, color, 3, true) dxDrawLine(x, y - 12, x, y - 2, color, 3, true) dxDrawLine(x, y + 2, x, y + 12, color, 3, true) -- Draw the luminance for this color local i for i=0,256 do local _r, _g, _b = colorPicker.hsl2rgb(colorPicker.h, colorPicker.s, (256 - i) / 256) local color = tocolor(_r * 255, _g * 255, _b * 255, 255) dxDrawRectangle(luminanceX, luminanceY + i, colorPicker.selectWindow.luminanceWidth, 1, color, true) end -- Draw the luminance position marker local arrowX = luminanceX + colorPicker.selectWindow.luminanceWidth + 4 local arrowY = luminanceY + ((1 - colorPicker.l) * 256) dxDrawLine(arrowX, arrowY, arrowX + 8, arrowY, tocolor(255, 255, 255, 255), 2, true) -- Draw the alpha for this color for i=0,255 do local color = tocolor(colorPicker.value[1], colorPicker.value[2], colorPicker.value[3], i) dxDrawRectangle(alphaX, alphaY + i, colorPicker.selectWindow.alphaWidth + 1, 1, color, true) end -- Draw the alpha position marker arrowX = alphaX + colorPicker.selectWindow.alphaWidth + 4 arrowY = alphaY + colorPicker.value[4] dxDrawLine(arrowX, arrowY, arrowX + 8, arrowY, tocolor(255, 255, 255, 255), 2, true) -- Draw the recently used colors local boxWidth = (colorPicker.selectWindow.historyWidth - 15) / 3 local boxHeight = (colorPicker.selectWindow.historyHeight - 45) / 3 for i=1,3 do for j=1,3 do local color = colorHistory[j + ((i - 1) * 3)] local x = wx + colorPicker.selectWindow.historyX + ((boxWidth + 5) * (j-1)) local y = wy + colorPicker.selectWindow.historyY + 30 + ((boxHeight + 5) * (i-1)) dxDrawRectangle(x, y, boxWidth, boxHeight, tocolor(unpack(color)), true) end end end, isCursorInArea = function( cursorX, cursorY, minX, minY, maxX, maxY ) if cursorX < minX or cursorX > maxX or cursorY < minY or cursorY > maxY then return false end return true end, pickColor = function( button, state, cursorX, cursorY ) if button ~= "left" then return end local wx, wy = guiGetPosition(colorPicker.GUI.selectWindow, false) local ww, wh = guiGetSize(colorPicker.GUI.selectWindow, false) local isOutsideWindow = not colorPicker.isCursorInArea(cursorX, cursorY, wx, wy, wx+ww, wy+wh) local minX, minY, maxX, maxY = wx + colorPicker.selectWindow.paletteX, wy + colorPicker.selectWindow.paletteY, wx + colorPicker.selectWindow.paletteX + 255, wy + colorPicker.selectWindow.paletteY + 255 local isInPalette = colorPicker.isCursorInArea(cursorX, cursorY, minX, minY, maxX, maxY) minX, maxX = maxX + colorPicker.selectWindow.luminanceOffset, maxX + colorPicker.selectWindow.luminanceOffset + colorPicker.selectWindow.luminanceWidth + 12 maxY = maxY + 1 local isInLuminance = colorPicker.isCursorInArea(cursorX, cursorY, minX, minY, maxX, maxY) maxY = maxY - 1 minX, maxX = wx + colorPicker.selectWindow.paletteX + 255 + colorPicker.selectWindow.alphaOffset, wx + colorPicker.selectWindow.paletteX + 255 + colorPicker.selectWindow.alphaOffset + colorPicker.selectWindow.alphaWidth + 12 local isInAlpha = colorPicker.isCursorInArea(cursorX, cursorY, minX, minY, maxX, maxY) minX, minY, maxX, maxY = wx + colorPicker.selectWindow.historyX, wy + colorPicker.selectWindow.historyY, wx + colorPicker.selectWindow.historyX + colorPicker.selectWindow.historyWidth, wy + colorPicker.selectWindow.historyY + colorPicker.selectWindow.historyHeight local isInHistory = colorPicker.isCursorInArea(cursorX, cursorY, minX, minY, maxX, maxY) if state == "down" then if isOutsideWindow then colorPicker.closeSelect() elseif isInPalette then colorPicker.pickingColor = true elseif isInLuminance then colorPicker.pickingLuminance = true elseif isInAlpha then colorPicker.pickingAlpha = true elseif isInHistory then colorPicker.pickHistory(cursorX - minX, cursorY - minY) end elseif state == "up" then if colorPicker.pickingColor then colorPicker.pickingColor = false elseif colorPicker.pickingLuminance then colorPicker.pickingLuminance = false elseif colorPicker.pickingAlpha then colorPicker.pickingAlpha = false end end end, pickHistory = function( cursorX, cursorY) local relX = cursorX local relY = cursorY - 25 if relX < 0 or relY < 0 then return end local boxWidth = (colorPicker.selectWindow.historyWidth - 15) / 3 local boxHeight = (colorPicker.selectWindow.historyHeight - 45) / 3 local modX = relX % (boxWidth + 5) local modY = relY % (boxHeight + 5) if modX > boxWidth or modY > boxHeight then return end local j = math.floor(relX / (boxWidth + 5)) local i = math.floor(relY / (boxHeight + 5)) local box = j + 1 + i * 3 if box < 1 or box > #colorHistory then return end local color = colorHistory[box] colorPicker.h, colorPicker.s, colorPicker.l = colorPicker.rgb2hsl(color[1] / 255, color[2] / 255, color[3] / 255) colorPicker.avoidRecursion = true colorPicker.setValue(color) colorPicker.avoidRecursion = false end, convertColorToTable = function( color ) local result if type(color) == "string" then result = {getColorFromString(color)} elseif type(color) == "number" then local str if color > 0xFFFFFF then -- RGBA color str = "#" .. string.format("%08X", color) else -- RGB color str = "#" .. string.format("%06X", color) end result = {getColorFromString(str)} elseif type(color) == "table" then result = color else result = { 255, 255, 255, 255 } end local checkValue = function(value) if not value then return 255 end value = math.floor(tonumber(value)) if value < 0 then return 0 elseif value > 255 then return 255 else return value end end result[1] = checkValue(result[1]) result[2] = checkValue(result[2]) result[3] = checkValue(result[3]) result[4] = checkValue(result[4]) return result end, hsl2rgb = function(h, s, l) local m2 if l < 0.5 then m2 = l * (s + 1) else m2 = (l + s) - (l * s) end local m1 = l * 2 - m2 local hue2rgb = function(m1, m2, h) if h < 0 then h = h + 1 elseif h > 1 then h = h - 1 end if h*6 < 1 then return m1 + (m2 - m1) * h * 6 elseif h*2 < 1 then return m2 elseif h*3 < 2 then return m1 + (m2 - m1) * (2/3 - h) * 6 else return m1 end end local r = hue2rgb(m1, m2, h + 1/3) local g = hue2rgb(m1, m2, h) local b = hue2rgb(m1, m2, h - 1/3) return r, g, b end, rgb2hsl = function(r, g, b) local max = math.max(r, g, b) local min = math.min(r, g, b) local l = (min + max) / 2 local h local s if max == min then h = 0 s = 0 else local d = max - min if l < 0.5 then s = d / (max + min) else s = d / (2 - max - min) end if max == r then h = (g - b) / d if g < b then h = h + 6 end elseif max == g then h = (b - r) / d + 2 else h = (r - g) / d + 4 end h = h / 6 end return h, s, l end, } tempColors = {} colors = {} tempColors[colors] = {} colorPicker.constructor(colorPicker.default) Ele precisa destas 2 imagens pra funcionar: https://prnt.sc/jellpq (alpha.png)https://prnt.sc/jelm01 (palette.png) O script colorpicker.lua e as duas imagens devem estar dentro de uma pasta chamada colorpicker no seu resource. Com seus arquivos devidamente declarados no meta.xml do seu resource. Use isso para obter as cores selecionadas no colorpicker: local r, g, b = colorPicker.updateTempColors() Use isso para abrir o painel do colorpicker: function openColorPicker() if (colorPicker.isSelectOpen) or not isElement(veh) then return end -- veh = veículo que vc quer pintar no seu script. colorPicker.openSelect() -- abre o colorpicker end Pra fechar o painel ele já tem uma função interna que fecha sozinho ao clicar fora do painel. Mas se quiser fechar por algum comando ou botão, da pra usar isso: colorPicker.closeSelect() Obs: Tudo isso é somente client-side. Edited May 7, 2018 by Lord Henry Link to comment
carlos eduardo Posted May 7, 2018 Author Share Posted May 7, 2018 Just now, Lord Henry said: Sugiro que use este colorPicker: Hide contents function table.copy(theTable) local t = {} for k, v in pairs(theTable) do if type(v) == "table" then t[k] = table.copy(theTable) else t[k] = v end end return t end colorPicker = { default = { x = 0, y = 0, width = 200, height = 20, buttonWidth = .38, testWidth = .6, testHeight = 1, relative = false, value = "#ff0000ff", selectWindow = { width = 350, height = 430, paletteX = 18, paletteY = 30, luminanceOffset = 10, luminanceWidth = 15, alphaOffset = 25 + 17, alphaWidth = 15, rgbX = 265, rgbY = 300, rgbWidth = 50, rgbHeight = 21, hslX = 190, hslY = 300, hslWidth = 50, hslHeight = 21, historyX = 18, historyY = 300, historyWidth = 140, historyHeight = 80, noteX = 18, noteY = 378, ra1X = 18, ra1Y = 398, ra2X = 88, ra2Y = 398, ra3X = 168, ra3Y = 398 } }, constructor = function( info ) info = info or colorPicker.default colorPicker.value = colorPicker.convertColorToTable(info.value) colorPicker.buttonWidth = info.width * colorPicker.default.buttonWidth local offset = 1 --px local height = 10 --local sizeX, sizeY = guiGetSize(info.parent, false) if not sizeX then sizeX, sizeY = guiGetScreenSize() end if info.relative then offset = offset / sizeX height = height / sizeY end colorPicker.GUI = {} colorPicker.children = {} -- Create the color selection window local screenW, screenH = guiGetScreenSize() colorPicker.selectWindow = info.selectWindow colorPicker.GUI.selectWindow = guiCreateWindow(screenW - info.selectWindow.width - 5, 5, info.selectWindow.width, info.selectWindow.height, "Escolha a cor (clique fora da janela para fechar)", false) guiSetVisible(colorPicker.GUI.selectWindow, false) guiWindowSetSizable(colorPicker.GUI.selectWindow, false) colorPicker.GUI.palette = guiCreateStaticImage(colorPicker.selectWindow.paletteX, colorPicker.selectWindow.paletteY, 256, 256, "colorpicker/palette.png", false, colorPicker.GUI.selectWindow) colorPicker.GUI.alphaBar = guiCreateStaticImage(colorPicker.selectWindow.paletteX + 255 + colorPicker.selectWindow.alphaOffset, colorPicker.selectWindow.paletteY, colorPicker.selectWindow.alphaWidth, 255, "colorpicker/alpha.png", false, colorPicker.GUI.selectWindow) colorPicker.isSelectOpen = false -- Create the RGB and HSL edit boxes colorPicker.children.R = guiCreateEdit(info.selectWindow.rgbX + 10, info.selectWindow.rgbY, info.selectWindow.rgbWidth, info.selectWindow.rgbHeight, tostring( colorPicker.value[1] ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.R, 3) addEventHandler("onClientGUIChanged", colorPicker.children.R, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.R, colorPicker.selectionManualInputRGB) colorPicker.GUI.labelR = guiCreateLabel(info.selectWindow.rgbX, info.selectWindow.rgbY + 3, 10, 20, "R", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelR, "default-bold-small") colorPicker.children.G = guiCreateEdit(info.selectWindow.rgbX + 10, info.selectWindow.rgbY + info.selectWindow.rgbHeight, info.selectWindow.rgbWidth, info.selectWindow.rgbHeight, tostring( colorPicker.value[2] ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.G, 3) addEventHandler("onClientGUIChanged", colorPicker.children.G, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.G, colorPicker.selectionManualInputRGB) colorPicker.GUI.labelG = guiCreateLabel(info.selectWindow.rgbX, info.selectWindow.rgbY + 3 + info.selectWindow.rgbHeight, 10, 20, "G", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelG, "default-bold-small") colorPicker.children.B = guiCreateEdit(info.selectWindow.rgbX + 10, info.selectWindow.rgbY + info.selectWindow.rgbHeight*2, info.selectWindow.rgbWidth, info.selectWindow.rgbHeight, tostring( colorPicker.value[3] ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.B, 3) addEventHandler("onClientGUIChanged", colorPicker.children.B, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.B, colorPicker.selectionManualInputRGB) colorPicker.GUI.labelB = guiCreateLabel(info.selectWindow.rgbX, info.selectWindow.rgbY + 3 + info.selectWindow.rgbHeight*2, 10, 20, "B", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelB, "default-bold-small") colorPicker.children.A = guiCreateEdit(info.selectWindow.rgbX + 10, info.selectWindow.rgbY + info.selectWindow.rgbHeight*3, info.selectWindow.rgbWidth, info.selectWindow.rgbHeight, tostring( colorPicker.value[4] ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.A, 3) addEventHandler("onClientGUIChanged", colorPicker.children.A, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.A, colorPicker.selectionManualInputRGB) colorPicker.GUI.labelA = guiCreateLabel(info.selectWindow.rgbX - 25, info.selectWindow.rgbY + 3 + info.selectWindow.rgbHeight*3, 50, 20, "Alpha", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelA, "default-bold-small") colorPicker.h, colorPicker.s, colorPicker.l = colorPicker.rgb2hsl(colorPicker.value[1] / 255, colorPicker.value[2] / 255, colorPicker.value[3] / 255) colorPicker.children.H = guiCreateEdit(info.selectWindow.hslX + 10, info.selectWindow.hslY, info.selectWindow.hslWidth, info.selectWindow.hslHeight, tostring( math.floor(colorPicker.h * 255) ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.H, 3) addEventHandler("onClientGUIChanged", colorPicker.children.H, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.H, colorPicker.selectionManualInputHSL) colorPicker.GUI.labelH = guiCreateLabel(info.selectWindow.hslX, info.selectWindow.hslY + 3, 10, 20, "H", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelH, "default-bold-small") colorPicker.children.S = guiCreateEdit(info.selectWindow.hslX + 10, info.selectWindow.hslY + info.selectWindow.hslHeight, info.selectWindow.hslWidth, info.selectWindow.hslHeight, tostring( math.floor(colorPicker.s * 255) ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.S, 3) addEventHandler("onClientGUIChanged", colorPicker.children.S, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.S, colorPicker.selectionManualInputHSL) colorPicker.GUI.labelS = guiCreateLabel(info.selectWindow.hslX, info.selectWindow.hslY + 3 + info.selectWindow.hslHeight, 10, 20, "S", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelS, "default-bold-small") colorPicker.children.L = guiCreateEdit(info.selectWindow.hslX + 10, info.selectWindow.hslY + info.selectWindow.hslHeight*2, info.selectWindow.hslWidth, info.selectWindow.hslHeight, tostring( math.floor(colorPicker.s * 255) ), false, colorPicker.GUI.selectWindow) guiEditSetMaxLength(colorPicker.children.L, 3) addEventHandler("onClientGUIChanged", colorPicker.children.L, colorPicker.forceNaturalAndRange) addEventHandler("onClientGUIChanged", colorPicker.children.L, colorPicker.selectionManualInputHSL) colorPicker.GUI.labelL = guiCreateLabel(info.selectWindow.hslX, info.selectWindow.hslY + 3 + info.selectWindow.hslHeight*2, 10, 20, "L", false, colorPicker.GUI.selectWindow) guiSetFont(colorPicker.GUI.labelL, "default-bold-small") -- Create the color history if not colorHistory then colorHistory = {} for i=1,9 do colorHistory[i] = { 255, 255, 255, 200 } end end colorPicker.GUI.historyLabel = guiCreateLabel(info.selectWindow.historyX, info.selectWindow.historyY, 150, 15, "Cores usadas recentemente:", false, colorPicker.GUI.selectWindow) colorPicker.GUI.noteLabel = guiCreateLabel(info.selectWindow.noteX, info.selectWindow.noteY, 190, 15, "Clique fora desta janela para fechar.", false, colorPicker.GUI.selectWindow) guiSetFont( colorPicker.GUI.noteLabel, "default-small" ) checkColor1 = guiCreateCheckBox(info.selectWindow.ra1X, info.selectWindow.ra1Y, 70, 15, "Cor 1", true, false, colorPicker.GUI.selectWindow) checkColor2 = guiCreateCheckBox(info.selectWindow.ra2X, info.selectWindow.ra2Y, 70, 15, "Cor 2", true, false, colorPicker.GUI.selectWindow) colorPicker.avoidRecursion = false end, forceNaturalAndRange = function() local inputText = guiGetText( source ) if not tonumber( inputText ) then local changedText = string.gsub( inputText, "[^%d]", "" ) if changedText ~= inputText then guiSetText(source, changedText) end end local inputNumber = tonumber(guiGetText( source )) if inputNumber then local clampedNumber = inputNumber clampedNumber = math.max(clampedNumber, 0) clampedNumber = math.min(clampedNumber, 255) if clampedNumber ~= inputNumber then guiSetText(source, tostring(clampedNumber)) end end end, setValue = function( value ) colorPicker.value = colorPicker.convertColorToTable(value) colorPicker.updateTempColors() local avoidRecursion = colorPicker.avoidRecursion colorPicker.avoidRecursion = true colorPicker.updateSelectionWindowEdits() colorPicker.avoidRecursion = avoidRecursion return true end, selectionManualInputRGB = function() if not colorPicker.avoidRecursion then colorPicker.avoidRecursion = true local r, g, b, a = tonumber(guiGetText(colorPicker.children.R)), tonumber(guiGetText(colorPicker.children.G)), tonumber(guiGetText(colorPicker.children.B)), tonumber(guiGetText(colorPicker.children.A)) if not r or not g or not b or not a then colorPicker.avoidRecursion = false return end colorPicker.h, colorPicker.s, colorPicker.l = colorPicker.rgb2hsl(r / 255, g / 255, b / 255) colorPicker.setValue({r, g, b, a}) colorPicker.avoidRecursion = false end end, selectionManualInputHSL = function() if not colorPicker.avoidRecursion then colorPicker.avoidRecursion = true local h, s, l = tonumber(guiGetText(colorPicker.children.H)), tonumber(guiGetText(colorPicker.children.S)), tonumber(guiGetText(colorPicker.children.L)) if not h or not s or not l then colorPicker.avoidRecursion = false return end colorPicker.h, colorPicker.s, colorPicker.l = h / 255, s / 255, l / 256 local r, g, b = colorPicker.hsl2rgb(colorPicker.h, colorPicker.s, colorPicker.l) colorPicker.setValue({r * 255, g * 255, b * 255, colorPicker.value[4]}) colorPicker.avoidRecursion = false end end, updateSelectionWindowEdits = function() guiSetText(colorPicker.children.R, tostring(colorPicker.value[1])) guiSetText(colorPicker.children.G, tostring(colorPicker.value[2])) guiSetText(colorPicker.children.B, tostring(colorPicker.value[3])) guiSetText(colorPicker.children.A, tostring(colorPicker.value[4])) guiSetText(colorPicker.children.H, tostring(math.floor(colorPicker.h * 255))) guiSetText(colorPicker.children.S, tostring(math.floor(colorPicker.s * 255))) guiSetText(colorPicker.children.L, tostring(math.floor(colorPicker.l * 256))) end, --This is where the color updates every time you click the palette or presets! updateTempColors = function() local r, g, b, a = colorPicker.value[1], colorPicker.value[2], colorPicker.value[3], colorPicker.value[4] return r, g, b end, openSelect = function( currentColor ) if colorPicker.isSelectOpen then return end colorPicker.currentColor = currentColor --local r, g, b, a = tempColors[currentColor].r, tempColors[currentColor].g, tempColors[currentColor].b, tempColors[currentColor].a --colorPicker.setValue( { r * 255, g * 255, b * 255, a * 255 } ) guiSetVisible(colorPicker.GUI.selectWindow, true) guiBringToFront(colorPicker.GUI.selectWindow) addEventHandler("onClientRender", root, colorPicker.updateSelectedValue) addEventHandler("onClientClick", root, colorPicker.pickColor) colorPicker.isSelectOpen = true colorPicker.pickingColor = false colorPicker.pickingLuminance = false colorPicker.pickingAlpha = false colorPicker.h, colorPicker.s, colorPicker.l = colorPicker.rgb2hsl(colorPicker.value[1] / 255, colorPicker.value[2] / 255, colorPicker.value[3] / 255) end, closeSelect = function() if not colorPicker.isSelectOpen then return end colorPicker.currentColor = nil guiSetVisible(colorPicker.GUI.selectWindow, false) removeEventHandler("onClientRender", root, colorPicker.updateSelectedValue) removeEventHandler("onClientClick", root, colorPicker.pickColor) colorPicker.isSelectOpen = false colorPicker.addCurrentColorToHistory() closedColorPicker(colorPicker.value[1], colorPicker.value[2], colorPicker.value[3]) end, addCurrentColorToHistory = function() -- First look up in color history to check if the -- current color is already present there for i=1,9 do local color = colorHistory[i] if color[1] == colorPicker.value[1] and color[2] == colorPicker.value[2] and color[3] == colorPicker.value[3] and color[4] == colorPicker.value[4] then return end end -- Pop the last color and insert the new value table.remove(colorHistory) table.insert(colorHistory, 1, table.copy(colorPicker.value)) end, updateSelectedValue = function() if not guiGetVisible(colorPicker.GUI.selectWindow) then return end local r, g, b, a -- Check for color changes local wx, wy = guiGetPosition(colorPicker.GUI.selectWindow, false) local paletteX, paletteY = wx + colorPicker.selectWindow.paletteX, wy + colorPicker.selectWindow.paletteY local luminanceX, luminanceY = paletteX + 255 + colorPicker.selectWindow.luminanceOffset, paletteY local alphaX, alphaY = paletteX + 255 + colorPicker.selectWindow.alphaOffset - 1, paletteY --Wont work until I get the actual mouse working local cursorX, cursorY = getCursorPosition() local screenW, screenH = guiGetScreenSize() cursorX = cursorX * screenW cursorY = cursorY * screenH if colorPicker.pickingColor then if cursorX < paletteX then cursorX = paletteX elseif cursorX > paletteX + 255 then cursorX = paletteX + 255 end if cursorY < paletteY then cursorY = paletteY elseif cursorY > paletteY + 255 then cursorY = paletteY + 255 end setCursorPosition(cursorX, cursorY) colorPicker.h, colorPicker.s = (cursorX - paletteX) / 255, (255 - cursorY + paletteY) / 255 r, g, b = colorPicker.hsl2rgb(colorPicker.h, colorPicker.s, colorPicker.l) a = colorPicker.value[4] / 255 colorPicker.avoidRecursion = true colorPicker.setValue({r*255, g*255, b*255, colorPicker.value[4]}) colorPicker.avoidRecursion = false elseif colorPicker.pickingLuminance then if cursorY < luminanceY then cursorY = luminanceY elseif cursorY > luminanceY + 256 then cursorY = luminanceY + 256 end setCursorPosition(cursorX, cursorY) colorPicker.l = (256 - cursorY + luminanceY) / 256 r, g, b = colorPicker.hsl2rgb(colorPicker.h, colorPicker.s, colorPicker.l) a = colorPicker.value[4] / 255 colorPicker.avoidRecursion = true colorPicker.setValue({r*255, g*255, b*255, colorPicker.value[4]}) colorPicker.avoidRecursion = false elseif colorPicker.pickingAlpha then if cursorY < alphaY then cursorY = alphaY elseif cursorY > alphaY + 255 then cursorY = alphaY + 255 end setCursorPosition(cursorX, cursorY) colorPicker.avoidRecursion = true colorPicker.setValue({colorPicker.value[1], colorPicker.value[2], colorPicker.value[3], cursorY - alphaY}) colorPicker.avoidRecursion = false r, g, b, a = colorPicker.value[1] / 255, colorPicker.value[2] / 255, colorPicker.value[3] / 255, colorPicker.value[4] / 255 else r, g, b, a = colorPicker.value[1] / 255, colorPicker.value[2] / 255, colorPicker.value[3] / 255, colorPicker.value[4] / 255 end -- Draw the lines pointing to the current selected color local x = paletteX + (colorPicker.h * 255) local y = paletteY + ((1 - colorPicker.s) * 255) local color = tocolor(0, 0, 0, 255) dxDrawLine(x - 12, y, x - 2, y, color, 3, true) dxDrawLine(x + 2, y, x + 12, y, color, 3, true) dxDrawLine(x, y - 12, x, y - 2, color, 3, true) dxDrawLine(x, y + 2, x, y + 12, color, 3, true) -- Draw the luminance for this color local i for i=0,256 do local _r, _g, _b = colorPicker.hsl2rgb(colorPicker.h, colorPicker.s, (256 - i) / 256) local color = tocolor(_r * 255, _g * 255, _b * 255, 255) dxDrawRectangle(luminanceX, luminanceY + i, colorPicker.selectWindow.luminanceWidth, 1, color, true) end -- Draw the luminance position marker local arrowX = luminanceX + colorPicker.selectWindow.luminanceWidth + 4 local arrowY = luminanceY + ((1 - colorPicker.l) * 256) dxDrawLine(arrowX, arrowY, arrowX + 8, arrowY, tocolor(255, 255, 255, 255), 2, true) -- Draw the alpha for this color for i=0,255 do local color = tocolor(colorPicker.value[1], colorPicker.value[2], colorPicker.value[3], i) dxDrawRectangle(alphaX, alphaY + i, colorPicker.selectWindow.alphaWidth + 1, 1, color, true) end -- Draw the alpha position marker arrowX = alphaX + colorPicker.selectWindow.alphaWidth + 4 arrowY = alphaY + colorPicker.value[4] dxDrawLine(arrowX, arrowY, arrowX + 8, arrowY, tocolor(255, 255, 255, 255), 2, true) -- Draw the recently used colors local boxWidth = (colorPicker.selectWindow.historyWidth - 15) / 3 local boxHeight = (colorPicker.selectWindow.historyHeight - 45) / 3 for i=1,3 do for j=1,3 do local color = colorHistory[j + ((i - 1) * 3)] local x = wx + colorPicker.selectWindow.historyX + ((boxWidth + 5) * (j-1)) local y = wy + colorPicker.selectWindow.historyY + 30 + ((boxHeight + 5) * (i-1)) dxDrawRectangle(x, y, boxWidth, boxHeight, tocolor(unpack(color)), true) end end end, isCursorInArea = function( cursorX, cursorY, minX, minY, maxX, maxY ) if cursorX < minX or cursorX > maxX or cursorY < minY or cursorY > maxY then return false end return true end, pickColor = function( button, state, cursorX, cursorY ) if button ~= "left" then return end local wx, wy = guiGetPosition(colorPicker.GUI.selectWindow, false) local ww, wh = guiGetSize(colorPicker.GUI.selectWindow, false) local isOutsideWindow = not colorPicker.isCursorInArea(cursorX, cursorY, wx, wy, wx+ww, wy+wh) local minX, minY, maxX, maxY = wx + colorPicker.selectWindow.paletteX, wy + colorPicker.selectWindow.paletteY, wx + colorPicker.selectWindow.paletteX + 255, wy + colorPicker.selectWindow.paletteY + 255 local isInPalette = colorPicker.isCursorInArea(cursorX, cursorY, minX, minY, maxX, maxY) minX, maxX = maxX + colorPicker.selectWindow.luminanceOffset, maxX + colorPicker.selectWindow.luminanceOffset + colorPicker.selectWindow.luminanceWidth + 12 maxY = maxY + 1 local isInLuminance = colorPicker.isCursorInArea(cursorX, cursorY, minX, minY, maxX, maxY) maxY = maxY - 1 minX, maxX = wx + colorPicker.selectWindow.paletteX + 255 + colorPicker.selectWindow.alphaOffset, wx + colorPicker.selectWindow.paletteX + 255 + colorPicker.selectWindow.alphaOffset + colorPicker.selectWindow.alphaWidth + 12 local isInAlpha = colorPicker.isCursorInArea(cursorX, cursorY, minX, minY, maxX, maxY) minX, minY, maxX, maxY = wx + colorPicker.selectWindow.historyX, wy + colorPicker.selectWindow.historyY, wx + colorPicker.selectWindow.historyX + colorPicker.selectWindow.historyWidth, wy + colorPicker.selectWindow.historyY + colorPicker.selectWindow.historyHeight local isInHistory = colorPicker.isCursorInArea(cursorX, cursorY, minX, minY, maxX, maxY) if state == "down" then if isOutsideWindow then colorPicker.closeSelect() elseif isInPalette then colorPicker.pickingColor = true elseif isInLuminance then colorPicker.pickingLuminance = true elseif isInAlpha then colorPicker.pickingAlpha = true elseif isInHistory then colorPicker.pickHistory(cursorX - minX, cursorY - minY) end elseif state == "up" then if colorPicker.pickingColor then colorPicker.pickingColor = false elseif colorPicker.pickingLuminance then colorPicker.pickingLuminance = false elseif colorPicker.pickingAlpha then colorPicker.pickingAlpha = false end end end, pickHistory = function( cursorX, cursorY) local relX = cursorX local relY = cursorY - 25 if relX < 0 or relY < 0 then return end local boxWidth = (colorPicker.selectWindow.historyWidth - 15) / 3 local boxHeight = (colorPicker.selectWindow.historyHeight - 45) / 3 local modX = relX % (boxWidth + 5) local modY = relY % (boxHeight + 5) if modX > boxWidth or modY > boxHeight then return end local j = math.floor(relX / (boxWidth + 5)) local i = math.floor(relY / (boxHeight + 5)) local box = j + 1 + i * 3 if box < 1 or box > #colorHistory then return end local color = colorHistory[box] colorPicker.h, colorPicker.s, colorPicker.l = colorPicker.rgb2hsl(color[1] / 255, color[2] / 255, color[3] / 255) colorPicker.avoidRecursion = true colorPicker.setValue(color) colorPicker.avoidRecursion = false end, convertColorToTable = function( color ) local result if type(color) == "string" then result = {getColorFromString(color)} elseif type(color) == "number" then local str if color > 0xFFFFFF then -- RGBA color str = "#" .. string.format("%08X", color) else -- RGB color str = "#" .. string.format("%06X", color) end result = {getColorFromString(str)} elseif type(color) == "table" then result = color else result = { 255, 255, 255, 255 } end local checkValue = function(value) if not value then return 255 end value = math.floor(tonumber(value)) if value < 0 then return 0 elseif value > 255 then return 255 else return value end end result[1] = checkValue(result[1]) result[2] = checkValue(result[2]) result[3] = checkValue(result[3]) result[4] = checkValue(result[4]) return result end, hsl2rgb = function(h, s, l) local m2 if l < 0.5 then m2 = l * (s + 1) else m2 = (l + s) - (l * s) end local m1 = l * 2 - m2 local hue2rgb = function(m1, m2, h) if h < 0 then h = h + 1 elseif h > 1 then h = h - 1 end if h*6 < 1 then return m1 + (m2 - m1) * h * 6 elseif h*2 < 1 then return m2 elseif h*3 < 2 then return m1 + (m2 - m1) * (2/3 - h) * 6 else return m1 end end local r = hue2rgb(m1, m2, h + 1/3) local g = hue2rgb(m1, m2, h) local b = hue2rgb(m1, m2, h - 1/3) return r, g, b end, rgb2hsl = function(r, g, b) local max = math.max(r, g, b) local min = math.min(r, g, b) local l = (min + max) / 2 local h local s if max == min then h = 0 s = 0 else local d = max - min if l < 0.5 then s = d / (max + min) else s = d / (2 - max - min) end if max == r then h = (g - b) / d if g < b then h = h + 6 end elseif max == g then h = (b - r) / d + 2 else h = (r - g) / d + 4 end h = h / 6 end return h, s, l end, } tempColors = {} colors = {} tempColors[colors] = {} colorPicker.constructor(colorPicker.default) Ele precisa destas 2 imagens pra funcionar: https://prnt.sc/jellpq (alpha.png)https://prnt.sc/jelm01 (palette.png) O script colorpicker.lua e as duas imagens devem estar dentro de uma pasta chamada colorpicker no seu resource. Com seus arquivos devidamente declarados no meta.xml do seu resource. Use isso para obter as cores selecionadas no colorpicker: local r, g, b = colorPicker.updateTempColors() Use isso para abrir o painel do colorpicker: function openColorPicker() if (colorPicker.isSelectOpen) or not isElement(veh) then return end -- veh = veículo que vc quer pintar no seu script. colorPicker.openSelect() -- abre o colorpickerend Pra fechar o painel ele já tem uma função interna que fecha sozinho ao clicar fora do painel. Mas se quiser fechar por algum comando ou botão, da pra usar isso: colorPicker.closeSelect() Obs: Tudo isso é somente client-side. é que eu queria botar nesse painel. https://cdn.discordapp.com/attachments/442730330047250442/442734662624739328/mta-screen_2018-05-06_14-09-13.png OBS:è um painel de teste Link to comment
Other Languages Moderators Lord Henry Posted May 7, 2018 Other Languages Moderators Share Posted May 7, 2018 Nada impede de vc colocar o colorpicker (GUI) junto ao painel DX. Link to comment
Gw8 Posted May 8, 2018 Share Posted May 8, 2018 Eu que fiz esse ai, ele tem a base igual a do cpicker do mta só que é todo feito em DX, sem os componentes GUI. Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now