Portal SAMP
[Ajuda] Armazenar cores HEX em MySQL - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Armazenar cores HEX em MySQL (/showthread.php?tid=3964)

Páginas: 1 2


RE: Armazenar cores HEX em MySQL - leonardos08bt - 02/10/2023

(27/09/2023 21:11)MateusCandido Escreveu:
(27/09/2023 11:45)pushline Escreveu: Pelo o que vejo nisso não tem nada de errado... Como você tá salvando esse color[playerid] ?
Esse seu código deveria se transformar nisso: (se estiver correto o método de salvamento)

Código PHP:
format(stringsizeof(string), "{%06x}Mensagem!"0x0080FFFF >>> 8); 

Se você salvar o hexadecimal com o alpha no final (os dois últimos números), não precisará usar o setalpha para transformá-lo em hexadecimal, pois seria a mesma coisa em sistemas diferentes (decimal e hexadecimal). Você só precisaria usá-la se precisasse alterar o alpha do hexadecimal. Em outras palavras, a função que forneci raramente pode ser usada.

Se você salvar o hexadecimal sem o alpha (por exemplo, 0xAABBCC), poderá usá-lo em strings normais e, em SendClientMessage, ele terá o alpha bugado no final (0x00AABBCC).
O motivo do bug é porque você está tentando passar a cor em um formato inválido, como se você tivesse uma cor RGB, mas a função espera RGBA ou ARGB, portanto, ela supõe que, se for RGBA, R é 0 ou A é 0

Para resolver isso, você poderia fazer o seguinte:
- "0xAABBCC << 8" para gerar um 00 no final
- Poderia usar SetAlpha antes de usar a cor no SendClientMessage.

Estou salvando da seguinte forma:
Código PHP:
mysql_format(connectquerysizeof(query), "UPDATE `contas` SET `cor` = %d WHERE `nome` = '%e'"color[playerid], nome[playerid]);
mysql_pquery(connectquery); 

Porém quando insiro a cor "0x0080FFFF" o mysql ignora as letras deixando apenas o 0080.
A coluna "cor" criei no formato INT do mysql como disse

Seria melhor salvar a cor usando varchar.
( '%e' - varchar(10) )


RE: Armazenar cores HEX em MySQL - MateusCandido - 04/10/2023

(02/10/2023 11:16)pushline Escreveu: Eu sei mano, eu quero saber como que você tá criando a variável.

Foi o que eu disse '-' , estou criando ela normal, sem nenhuma tag:

Código PHP:
new color[MAX_PLAYERS]; 



RE: Armazenar cores HEX em MySQL - PT_Player - 04/10/2023

Cara

O exemplo que o nosso amigo le deu e um numero nao uma string....


use;

Código:
new color;


seu code


Código:
//0x0080FFFF - cor de exemplo

new string[64];
format(string, sizeof(string), "{%06x}Mensagem!", color>>>8);

mysql_format(connect, query, sizeof(query), "UPDATE `contas` SET `cor` = %e WHERE `nome` = '%e'", color, nome[playerid]);
mysql_pquery(connect, query);


e se quer usar por playerid algo assim:
Código:
SetAlpha(color, alpha)
{
  return color & ~0xFF | clamp(alpha, 0, 255);
}

new colorsql, color[MAX_PLAYERS], string[64];
cache_get_value_int(0, "colordosql", colorsql);
color[playerid] = SetAlpha(colorsql, 75);
format(string, sizeof(string), "{%06x}Mensagem!", color[playerid]>>>8);



RE: Armazenar cores HEX em MySQL - pushline - 05/10/2023

(04/10/2023 20:05)PT_Player Escreveu: Cara

O exemplo que o nosso amigo le deu e um numero nao uma string....


use;

Código:
new color;


seu code


Código:
//0x0080FFFF - cor de exemplo

new string[64];
format(string, sizeof(string), "{%06x}Mensagem!", color>>>8);

mysql_format(connect, query, sizeof(query), "UPDATE `contas` SET `cor` = %e WHERE `nome` = '%e'", color, nome[playerid]);
mysql_pquery(connect, query);


e se quer usar por playerid algo assim:
Código:
SetAlpha(color, alpha)
{
  return color & ~0xFF | clamp(alpha, 0, 255);
}

new colorsql, color[MAX_PLAYERS], string[64];
cache_get_value_int(0, "colordosql", colorsql);
color[playerid] = SetAlpha(colorsql, 75);
format(string, sizeof(string), "{%06x}Mensagem!", color[playerid]>>>8);

Nem precisa ser %e pra salvar a cor, se for %d (decimal), funciona tbm. É esse método que eu faço pra colocar cores nas minha gangzones.


RE: Armazenar cores HEX em MySQL - MateusCandido - 05/10/2023

(04/10/2023 20:05)PT_Player Escreveu: Cara

O exemplo que o nosso amigo le deu e um numero nao uma string....


use;

Código:
new color;


seu code


Código:
//0x0080FFFF - cor de exemplo

new string[64];
format(string, sizeof(string), "{%06x}Mensagem!", color>>>8);

mysql_format(connect, query, sizeof(query), "UPDATE `contas` SET `cor` = %e WHERE `nome` = '%e'", color, nome[playerid]);
mysql_pquery(connect, query);


e se quer usar por playerid algo assim:
Código:
SetAlpha(color, alpha)
{
  return color & ~0xFF | clamp(alpha, 0, 255);
}

new colorsql, color[MAX_PLAYERS], string[64];
cache_get_value_int(0, "colordosql", colorsql);
color[playerid] = SetAlpha(colorsql, 75);
format(string, sizeof(string), "{%06x}Mensagem!", color[playerid]>>>8);

Como eu faria para um jogador inserir esta cor em um DIALOG_INPUT e a cor ser armazenada nessa variavel "color[playerid]" para depois armazenar no MySQL?
Se eu uso "color[playerid] = strval(inputtex);" a cor que vai pro MySQL usando o exemplo é a 8000, porém na hora de carregar a cor as letras da string ficam todas pretas.
O código esta exatamente igual acima


RE: Armazenar cores HEX em MySQL - pushline - 06/10/2023

Código PHP:
case dialog_hex:
{
  if(!response)
    return 0;

  if(strlen(inputtext) < || strlen(inputtext) > 8)
      return SendClientMessage(playerid, -1"msg 1");

  if(!IsHex(inputtext)) // IsHex existe no y_utils do YSI Includes, e caso você inclua qualquer coisa de YSI, já vai existir por padrão no seu código. E caso você não use YSI, tem uma função abaixo pra você adicionar no seu código
    return SendClientMessage(playerid, -1"msg 2");
  
  strtoupper
(inputtext);
  color[playerid] = HexToInt(inputtext);

  return true;
}

HexToInt(const str[])
{
    new 
ret;
    
unformat(str"x"ret);
    return 
ret;
}

strtoupper(const string[])
{
    new 
upperString[256];
    for (new 
character 0character strlen(string); character++)
    {
        
upperString[character] = toupper(string[character]);
    }
    return 
upperString;
}

stock IsHex(str[])
{
    new icur;
    
    
if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) 
        i 2;

    while (str[i])
    {
        cur str[i++];
        if (!(('0' <= cur <= '9') || ('A' <= cur <= 'F') || ('a' <= cur <= 'f'))) 
            return 0;
    }
    return 1;




RE: Armazenar cores HEX em MySQL - MateusCandido - 07/10/2023

(06/10/2023 11:13)pushline Escreveu:
Código PHP:
case dialog_hex:
{
  if(!response)
    return 0;

  if(strlen(inputtext) < || strlen(inputtext) > 8)
      return SendClientMessage(playerid, -1"msg 1");

  if(!IsHex(inputtext)) // IsHex existe no y_utils do YSI Includes, e caso você inclua qualquer coisa de YSI, já vai existir por padrão no seu código. E caso você não use YSI, tem uma função abaixo pra você adicionar no seu código
    return SendClientMessage(playerid, -1"msg 2");
  
  strtoupper
(inputtext);
  color[playerid] = HexToInt(inputtext);

  return true;
}

HexToInt(const str[])
{
    new 
ret;
    
unformat(str"x"ret);
    return 
ret;
}

strtoupper(const string[])
{
    new 
upperString[256];
    for (new 
character 0character strlen(string); character++)
    {
        
upperString[character] = toupper(string[character]);
    }
    return 
upperString;
}

stock IsHex(str[])
{
    new icur;
    
    
if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) 
        i 2;

    while (str[i])
    {
        cur str[i++];
        if (!(('0' <= cur <= '9') || ('A' <= cur <= 'F') || ('a' <= cur <= 'f'))) 
            return 0;
    }
    return 1;


Finalmente deu certo, o problema estava nessa conversão do dialog para salvar no MySQL.
Muito obrigado!