Portal SAMP
[Ajuda] Caracteres aleatórios. - 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] Caracteres aleatórios. (/showthread.php?tid=4770)



Caracteres aleatórios. - RamossFx - 15/05/2024

Código:
CMD:daritem(playerid, params[]){
    if(sscanf(params, "us[30]d", params[0], params[1], params[2])) return SendClientMessage(playerid, -1, "Uso: /daritem [playerid] [item] [quantidade]");
    printf("Debug [1]");
    if(!IsPlayerConnected(params[0])) return 1;
    printf("Debug [2]");

    printf("playerid: %d | item: %s | quantidade: %d", params[0], params[1], params[2]);

    new itemName[30];
    for(new i = 0; i < sizeof(ItensArray); i++){
        if(strcmp(params[1], ItensArray[i][item_name]) == 0){
            format(itemName, sizeof(itemName), "%s", ItensArray[i][item_name]);
            break;
        }
    }

    if(isnull(itemName)){
        SendClientMessage(playerid, -1, "{FFFFFF}* Item nao encontrado.");
        return 1;
    }

    SendClientMessagef(playerid, -1, "{FFFFFF}* Voce deu {E84F33}%d{FFFFFF} unidades do item {E84F33}%s{FFFFFF} para o(a) {E84F33}%s(%d)", params[2], itemName, PegarNome(params[0]), params[0]);
    givePlayerItem(params[0], params[1], params[2]);
    return 1;
}

A intenção desse comando é dar um item a um player, mas não está achando o nome correto na lista (Array), fui printar os parâmetros passados, quando passei como parametro item o nome "Mochila". Mas me retornou isso: "M☺chila".

No segundo caractere, está retornando esse caractere aleatório. E no jogo, o caractere não aparece, fica vazio.


RE: Caracteres aleatórios. - BitSain - 15/05/2024

Nos forneça essa array para podermos ajudar.

Isso pode ser devido a uma variedade de razões, incluindo codificação de caracteres ou manipulação de strings incorreta. Apesar de que "Mochila" não tem acento.
Também verifique se a matriz ItensArray está sendo populada corretamente e se os nomes dos itens estão armazenados corretamente, sem caracteres extras.


RE: Caracteres aleatórios. - RamossFx - 15/05/2024

(15/05/2024 12:36)BitSain Escreveu: Nos forneça essa array para podermos ajudar.

Isso pode ser devido a uma variedade de razões, incluindo codificação de caracteres ou manipulação de strings incorreta. Apesar de que "Mochila" não tem acento.
Também verifique se a matriz ItensArray está sendo populada corretamente e se os nomes dos itens estão armazenados corretamente, sem caracteres extras.
Código:
enum i_array {   
    item_name[30],
    item_id,
    item_type,

    item_max,
};

enum i_type {
    ITEM_TYPE_MEDICAL,
    ITEM_TYPE_MECANIC,
    ITEM_TYPE_MILITAR,
    ITEM_TYPE_INDUSTRIAL,
};

stock const ItensArray[][i_array] = {
    { "Bandagem",                   11736,          ITEM_TYPE_MEDICAL,        15       },
    { "Galao de Gasolina",          1650,           ITEM_TYPE_MECANIC,        1        },
    { "Colete Militar",             19142,          ITEM_TYPE_MILITAR,        1        },
    { "Mochila",                    19559,          ITEM_TYPE_INDUSTRIAL,     1        }
};



RE: Caracteres aleatórios. - BitSain - 15/05/2024

(15/05/2024 12:16)RamossFx Escreveu:
Código:
CMD:daritem(playerid, params[]){
    if(sscanf(params, "us[30]d", params[0], params[1], params[2])) return SendClientMessage(playerid, -1, "Uso: /daritem [playerid] [item] [quantidade]");
    printf("Debug [1]");
    if(!IsPlayerConnected(params[0])) return 1;
    printf("Debug [2]");

    printf("playerid: %d | item: %s | quantidade: %d", params[0], params[1], params[2]);

    new itemName[30];
    for(new i = 0; i < sizeof(ItensArray); i++){
        if(strcmp(params[1], ItensArray[i][item_name]) == 0){
            format(itemName, sizeof(itemName), "%s", ItensArray[i][item_name]);
            break;
        }
    }

    if(isnull(itemName)){
        SendClientMessage(playerid, -1, "{FFFFFF}* Item nao encontrado.");
        return 1;
    }

    SendClientMessagef(playerid, -1, "{FFFFFF}* Voce deu {E84F33}%d{FFFFFF} unidades do item {E84F33}%s{FFFFFF} para o(a) {E84F33}%s(%d)", params[2], itemName, PegarNome(params[0]), params[0]);
    givePlayerItem(params[0], params[1], params[2]);
    return 1;
}

A intenção desse comando é dar um item a um player, mas não está achando o nome correto na lista (Array), fui printar os parâmetros passados, quando passei como parametro item o nome "Mochila". Mas me retornou isso: "M☺chila".

No segundo caractere, está retornando esse caractere aleatório. E no jogo, o caractere não aparece, fica vazio.
Faz o Debug também após a formatação do itemName e manda o resultado aqui.


RE: Caracteres aleatórios. - RamossFx - 16/05/2024

(15/05/2024 21:52)BitSain Escreveu:
(15/05/2024 12:16)RamossFx Escreveu:
Código:
CMD:daritem(playerid, params[]){
    if(sscanf(params, "us[30]d", params[0], params[1], params[2])) return SendClientMessage(playerid, -1, "Uso: /daritem [playerid] [item] [quantidade]");
    printf("Debug [1]");
    if(!IsPlayerConnected(params[0])) return 1;
    printf("Debug [2]");

    printf("playerid: %d | item: %s | quantidade: %d", params[0], params[1], params[2]);

    new itemName[30];
    for(new i = 0; i < sizeof(ItensArray); i++){
        if(strcmp(params[1], ItensArray[i][item_name]) == 0){
            format(itemName, sizeof(itemName), "%s", ItensArray[i][item_name]);
            break;
        }
    }

    if(isnull(itemName)){
        SendClientMessage(playerid, -1, "{FFFFFF}* Item nao encontrado.");
        return 1;
    }

    SendClientMessagef(playerid, -1, "{FFFFFF}* Voce deu {E84F33}%d{FFFFFF} unidades do item {E84F33}%s{FFFFFF} para o(a) {E84F33}%s(%d)", params[2], itemName, PegarNome(params[0]), params[0]);
    givePlayerItem(params[0], params[1], params[2]);
    return 1;
}

A intenção desse comando é dar um item a um player, mas não está achando o nome correto na lista (Array), fui printar os parâmetros passados, quando passei como parametro item o nome "Mochila". Mas me retornou isso: "M☺chila".

No segundo caractere, está retornando esse caractere aleatório. E no jogo, o caractere não aparece, fica vazio.
Faz o Debug também após a formatação do itemName e manda o resultado aqui.

Mas então, não está nem chegando nessa parte. Pois como o caractere está trocado, aquela condição nunca vai ser válida.


RE: Caracteres aleatórios. - BitSain - 16/05/2024

Vou pegar esses códigos e compilar pra ver como que ocorre esse problema.
Eu vou achar uma solução decente pra isso


RE: Caracteres aleatórios. - BitSain - 16/05/2024

Eu testei diferentes formas, e a única coisa que achei mais simples foi criar uma variável pra usar no sscanf na parte do nome do item.

Eu levantei uma hipótese, mas não sei se faz sentido pois nunca vi nada parecido.
Como você está acessando o conteúdo do params[1], eu acho que qnd você tá acessando a matriz 1 o 2⁰ caractere está sendo deletado, pois a posição 1 é o caractere 2...
Não faz muito sentido isso, mas só fiz criar a variável 'item' e funcionou.

Código PHP:
CMD:daritem(playeridparams[]){
    new item[30];
    if(sscanf(params"us[30]d"params[0], itemparams[2])) return SendClientMessage(playerid, -1"Uso: /daritem [playerid] [item] [quantidade]");
    printf("Debug [1]");
    if(!IsPlayerConnected(params[0])) return 1;
    printf("Debug [2]");

    printf("playerid: %d | item: %s | quantidade: %d"params[0], itemparams[2]);

    new itemName[30];
    for(new 0sizeof(ItensArray); i++){
        if(strcmp(itemItensArray[i][item_name]) == 0){
            format(itemNamesizeof(itemName), "%s"ItensArray[i][item_name]);
            break;
        }
    }

    if(isnull(itemName)){
        SendClientMessage(playerid, -1"{FFFFFF}* Item nao encontrado.");
        return 1;
    }

    SendClientMessagef(playerid, -1"{FFFFFF}* Voce deu {E84F33}%d{FFFFFF} unidades do item {E84F33}%s{FFFFFF} para o(a) {E84F33}%s(%d)"params[2], itemNamePegarNome(params[0]), params[0]);
    givePlayerItem(params[0], itemNameparams[2]);
    return 1;


A única coisa que fiz foi substituir o "params[1]" por "item".


RE: Caracteres aleatórios. - RamossFx - 17/05/2024

(16/05/2024 20:25)BitSain Escreveu: Eu testei diferentes formas, e a única coisa que achei mais simples foi criar uma variável pra usar no sscanf na parte do nome do item.

Eu levantei uma hipótese, mas não sei se faz sentido pois nunca vi nada parecido.
Como você está acessando o conteúdo do params[1], eu acho que qnd você tá acessando a matriz 1 o 2⁰ caractere está sendo deletado, pois a posição 1 é o caractere 2...
Não faz muito sentido isso, mas só fiz criar a variável 'item' e funcionou.

Código PHP:
CMD:daritem(playeridparams[]){
    new item[30];
    if(sscanf(params"us[30]d"params[0], itemparams[2])) return SendClientMessage(playerid, -1"Uso: /daritem [playerid] [item] [quantidade]");
    printf("Debug [1]");
    if(!IsPlayerConnected(params[0])) return 1;
    printf("Debug [2]");

    printf("playerid: %d | item: %s | quantidade: %d"params[0], itemparams[2]);

    new itemName[30];
    for(new 0sizeof(ItensArray); i++){
        if(strcmp(itemItensArray[i][item_name]) == 0){
            format(itemNamesizeof(itemName), "%s"ItensArray[i][item_name]);
            break;
        }
    }

    if(isnull(itemName)){
        SendClientMessage(playerid, -1"{FFFFFF}* Item nao encontrado.");
        return 1;
    }

    SendClientMessagef(playerid, -1"{FFFFFF}* Voce deu {E84F33}%d{FFFFFF} unidades do item {E84F33}%s{FFFFFF} para o(a) {E84F33}%s(%d)"params[2], itemNamePegarNome(params[0]), params[0]);
    givePlayerItem(params[0], itemNameparams[2]);
    return 1;


A única coisa que fiz foi substituir o "params[1]" por "item".

Deu certinho! obrigado.