Проблема с цветами mimgui

игрок сампа

Участник
Автор темы
121
14
Версия MoonLoader
.027.0-preview
Всем привет! Я пишу скрипт который заменяет клист игрока на тот, который выбран в mimgui пипетке и сохраняю это в конфиг.

local cfg = {
COLOR_GROVE = 0xAA09A400, -- grove
COLOR_BALLAS = 0xAAC515FF, -- ballas
COLOR_VAGOS = 0xAAFFDE24, -- vagos
COLOR_RIFA = 0xAA2EA07B, -- rifa
COLOR_AZTEC = 0xAA0DEDFF, -- aztec
COLOR_LCN = 0xAAF4C400, -- lcn
COLOR_YAKUZA = 0xAAFF0606, -- yakuza
COLOR_RUSSIAN = 0xAA114D71 -- russian mafia
}

local color_float_grove = imgui.new.float[4]()
local color_float_ballas = imgui.new.float[4]()
local color_float_vagos = imgui.new.float[4]()
local color_float_rifa = imgui.new.float[4]()
local color_float_aztec = imgui.new.float[4]()
local color_float_lcn = imgui.new.float[4]()
local color_float_yakuza = imgui.new.float[4]()
local color_float_russian = imgui.new.float[4]()


Потом вызываю функцию при инициализации окна
function initColors()
color_float_grove = convertColorToFloat4(cfg.COLOR_GROVE) -- grove
color_float_ballas = convertColorToFloat4(cfg.COLOR_BALLAS) -- ballas
color_float_vagos = convertColorToFloat4(cfg.COLOR_VAGOS) -- vagos
color_float_rifa = convertColorToFloat4(cfg.COLOR_RIFA) -- rifa
color_float_aztec = convertColorToFloat4(cfg.COLOR_AZTEC) -- aztec
color_float_lcn = convertColorToFloat4(cfg.COLOR_LCN) -- lcn
color_float_yakuza = convertColorToFloat4(cfg.COLOR_YAKUZA) -- yakuza
color_float_russian = convertColorToFloat4(cfg.COLOR_RUSSIAN) -- russian mafia
end

function convertColorToFloat4(hexColor)
local tmp = imgui.ColorConvertU32ToFloat4(argb2abgr(hexColor))
local floatArray = imgui.new.float[4]()
floatArray[0] = tmp.x
floatArray[1] = tmp.y
floatArray[2] = tmp.z
floatArray[3] = tmp.w
return floatArray
end

После этого создаю пипетку для выбора цвета
-- Russian Mafia
if imgui.ColorEdit4("##Russian", color_float_russian, imgui.ColorEditFlags.NoInputs) then
cfg.COLOR_RUSSIAN = imgui.ColorConvertFloat4ToU32(
imgui.ImVec4(color_float_russian[0], color_float_russian[1], color_float_russian[2], color_float_russian[3])
)
applyNewColors()
saveConfig()
end

И наконец вызываю мою функцию applyNewColors
local playerOriginalColors = {}
function applyNewColors()
local colorMapping = {
[0xAA09A400] = cfg.COLOR_GROVE,
[0xAAC515FF] = cfg.COLOR_BALLAS,
[0xAAFFDE24] = cfg.COLOR_VAGOS,
[0xAA2EA07B] = cfg.COLOR_RIFA,
[0xAA0DEDFF] = cfg.COLOR_AZTEC,
[0xAAF4C400] = cfg.COLOR_LCN,
[0xAAFF0606] = cfg.COLOR_YAKUZA,
[0xAA114D71] = cfg.COLOR_RUSSIAN
}

for id = 0, 999 do
if sampIsPlayerConnected(id) then
local currentColor = sampGetPlayerColor(id)

-- Сохраняем оригинальный цвет при первом обнаружении
if not playerOriginalColors[id] then
playerOriginalColors[id] = currentColor
end

local originalColor = playerOriginalColors[id]

-- Если оригинальный цвет есть в маппинге
if colorMapping[originalColor] then
local targetColor = colorMapping[originalColor]

if currentColor ~= targetColor then
emul_rpc('onSetPlayerColor', { id, abgr2argb(targetColor) })
print(targetColor)
end
end
else
-- Очищаем при отключении игрока
playerOriginalColors[id] = nil
end
end
end

Которая по какой-то причине подставляет другой цвет, не тот который надо
 

ch0upp

Участник
32
8
попробуй так конвертировать цвет из имгуи, может поможет
Код:
function rgba_to_hex(r, g, b, a)
    return bit.bor(
        a or 255,
        bit.lshift(r, 24),
        bit.lshift(g, 16),
        bit.lshift(b, 8)
    )
end

function rgba_to_argb(color)
    local r = bit.rshift(bit.band(color, 0xFF000000), 24)
    local g = bit.rshift(bit.band(color, 0x00FF0000), 16)
    local b = bit.rshift(bit.band(color, 0x0000FF00), 8)
    local a = bit.band(color, 0x000000FF)

    return bit.bor(
        b,
        bit.lshift(g, 8),
        bit.lshift(r, 16),
        bit.lshift(a, 24)
    )
end

rgba_to_argb(rgba_to_hex(
    color_float_russian[0] * 255,
    color_float_russian[1] * 255,
    color_float_russian[2] * 255,
    color_float_russian[3] * 255
))
 

игрок сампа

Участник
Автор темы
121
14
попробуй так конвертировать цвет из имгуи, может поможет
Код:
function rgba_to_hex(r, g, b, a)
    return bit.bor(
        a or 255,
        bit.lshift(r, 24),
        bit.lshift(g, 16),
        bit.lshift(b, 8)
    )
end

function rgba_to_argb(color)
    local r = bit.rshift(bit.band(color, 0xFF000000), 24)
    local g = bit.rshift(bit.band(color, 0x00FF0000), 16)
    local b = bit.rshift(bit.band(color, 0x0000FF00), 8)
    local a = bit.band(color, 0x000000FF)

    return bit.bor(
        b,
        bit.lshift(g, 8),
        bit.lshift(r, 16),
        bit.lshift(a, 24)
    )
end

rgba_to_argb(rgba_to_hex(
    color_float_russian[0] * 255,
    color_float_russian[1] * 255,
    color_float_russian[2] * 255,
    color_float_russian[3] * 255
))
не помогло к сожалению
 

chromiusj

модерирую шмодерирую
Модератор
5,965
4,293
цвет клистов если что в формате ргба
разбей цвет и получи составляющие,и вставь в эмуляцию цвета
а колорпикер в формате аргб,и функция у тебя под руками как раз лежит
ну и вот ещё
 

игрок сампа

Участник
Автор темы
121
14
цвет клистов если что в формате ргба
разбей цвет и получи составляющие,и вставь в эмуляцию цвета
а колорпикер в формате аргб,и функция у тебя под руками как раз лежит
ну и вот ещё
function convertU32ToRRGGBBAA(color_u32)
local a = bit.rshift(bit.band(color_u32, 0xFF000000), 24)
local r = bit.rshift(bit.band(color_u32, 0x00FF0000), 16)
local g = bit.rshift(bit.band(color_u32, 0x0000FF00), 8)
local b = bit.band(color_u32, 0x000000FF)

return string.format("0x%02X%02X%02X%02X", r, g, b, a)
end

Конвертирую в RGBA всё равно цвета другие какие-то
 

Winstаl

Известный
1,003
415
function convertU32ToRRGGBBAA(color_u32)
local a = bit.rshift(bit.band(color_u32, 0xFF000000), 24)
local r = bit.rshift(bit.band(color_u32, 0x00FF0000), 16)
local g = bit.rshift(bit.band(color_u32, 0x0000FF00), 8)
local b = bit.band(color_u32, 0x000000FF)

return string.format("0x%02X%02X%02X%02X", r, g, b, a)
end

Конвертирую в RGBA всё равно цвета другие какие-то
А нахуя в строку то переводить
 

игрок сампа

Участник
Автор темы
121
14
А нахуя в строку то переводить
function explode_argb(argb)
local a = bit.band(bit.rshift(argb, 24), 0xFF)
local r = bit.band(bit.rshift(argb, 16), 0xFF)
local g = bit.band(bit.rshift(argb, 8), 0xFF)
local b = bit.band(argb, 0xFF)
return a, r, g, b
end

function join_argb(a, r, g, b)
local argb = b -- b
argb = bit.bor(argb, bit.lshift(g, 8)) -- g
argb = bit.bor(argb, bit.lshift(r, 16)) -- r
argb = bit.bor(argb, bit.lshift(a, 24)) -- a
return argb
end

function argb_to_rgba(argb)
local a, r, g, b = explode_argb(argb)
return join_argb(r, g, b, a)
end

function convertU32ToRRGGBBAA(color_u32)
return argb_to_rgba(color_u32)
end

local playerOriginalColors = {}
function applyNewColors()
local colorMapping = {
[0xAA09A400] = cfg.COLOR_GROVE,
[0xAAC515FF] = cfg.COLOR_BALLAS,
[0xAAFFDE24] = cfg.COLOR_VAGOS,
[0xAA2EA07B] = cfg.COLOR_RIFA,
[0xAA0DEDFF] = cfg.COLOR_AZTEC,
[0xAAF4C400] = cfg.COLOR_LCN,
[0xAAFF0606] = cfg.COLOR_YAKUZA,
[0xAA114D71] = cfg.COLOR_RUSSIAN
}

for id = 0, 999 do
if sampIsPlayerConnected(id) then
local currentColor = sampGetPlayerColor(id)

-- Сохраняем оригинальный цвет при первом обнаружении
if not playerOriginalColors[id] then
playerOriginalColors[id] = currentColor
end

local originalColor = playerOriginalColors[id]

-- Если оригинальный цвет есть в маппинге
if colorMapping[originalColor] then
local targetColor = colorMapping[originalColor]
if currentColor ~= targetColor then
emul_rpc('onSetPlayerColor', { id, convertU32ToRRGGBBAA(targetColor) })
print(convertU32ToRRGGBBAA(targetColor))
end
end
else
-- Очищаем при отключении игрока
playerOriginalColors[id] = nil
end
end
end

после этого некоторые цвета норм, но жёлтый показывается как голбуой не понимаю почему
 

dmitry.karle

Известный
410
108
Lua:
function convertU32ToRRGGBBAA(argb_color)
    return bit.bor(bit.band(bit.rshift(argb_color, 8), 0xFFFFFF00), bit.band(bit.rshift(argb_color, 24), 0xFF))
end

альтернатива мейби

попробуй этот вариант еще

Lua:
function explode_argb(argb)
    local a = bit.band(bit.rshift(argb, 24), 0xFF)
    local r = bit.band(bit.rshift(argb, 16), 0xFF)
    local g = bit.band(bit.rshift(argb, 8), 0xFF)
    local b = bit.band(argb, 0xFF)
    return a, r, g, b
end

function join_rgba(r, g, b, a)
    local rgba = a -- a (alpha)
    rgba = bit.bor(rgba, bit.lshift(b, 8)) -- b
    rgba = bit.bor(rgba, bit.lshift(g, 16)) -- g 
    rgba = bit.bor(rgba, bit.lshift(r, 24)) -- r
    return rgba
end

function convertU32ToRRGGBBAA(argb_color) --альтернативка
    local a, r, g, b = explode_argb(argb_color)
    return join_rgba(r, g, b, a)  -- Формат: 0xRRGGBBAA
end

local playerOriginalColors = {}
function applyNewColors()
    local colorMapping = {
        [0xAA09A400] = cfg.COLOR_GROVE,
        [0xAAC515FF] = cfg.COLOR_BALLAS,
        [0xAAFFDE24] = cfg.COLOR_VAGOS,
        [0xAA2EA07B] = cfg.COLOR_RIFA,
        [0xAA0DEDFF] = cfg.COLOR_AZTEC,
        [0xAAF4C400] = cfg.COLOR_LCN,
        [0xAAFF0606] = cfg.COLOR_YAKUZA,
        [0xAA114D71] = cfg.COLOR_RUSSIAN
    }
    for id = 0, 999 do
        if sampIsPlayerConnected(id) then
            local currentColor = sampGetPlayerColor(id)
            if not playerOriginalColors[id] then
                playerOriginalColors[id] = currentColor
            end
            local originalColor = playerOriginalColors[id]
            if colorMapping[originalColor] then
                local targetColor = colorMapping[originalColor]
                if currentColor ~= targetColor then
                    local convertedColor = convertU32ToRRGGBBAA(targetColor)
                    emul_rpc('onSetPlayerColor', { id, convertedColor })
                    local a, r, g, b = explode_argb(targetColor)
                    print(string.format("ID %d: ARGB: %02X%02X%02X%02X -> RGBA: %08X", id, a, r, g, b, convertedColor))
                end
            end
        else
            playerOriginalColors[id] = nil
        end
    end
end