Portal SAMP
[Ajuda] Retornar no jogador clicado - 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] Retornar no jogador clicado (/showthread.php?tid=4051)



Retornar no jogador clicado - L10motos - 09/10/2023

Eu estou tentando fazer um dialog que quando o jogador clica no jogador que está com contrato retorna aquele jogador que ele clicou, mais está retornando o ultimo jogador da lista, quero que retorna o jogador que eu cliquei, abaixo está exemplo, porem não funcional, está retornando ao ultimo jogador da lista, qual função posso usar e como devo usar?

Código:
new showcontract[MAX_PLAYERS];

CMD:teste(playerid)
{
    new megastring[2000], string[256], cont;
   
    format(string, sizeof(string), " \tOrganização:\n");
    strcat(megastring, string);

    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(PlayerInfo[i][pHeadValue] > 0)
        {
            if(gTeam[i] == 0)
            {
                showcontract[playerid] = i;

                format(string, sizeof(string), "%s(%d) - $%d\n", Name(i), i, PlayerInfo[i][pHeadValue]);
                strcat(megastring, string);
            }
            else
            {
                showcontract[playerid] = i;
               
                format(string, sizeof(string), "%s(%d) - $%d\t(%s)\n", Name(i), i, PlayerInfo[i][pHeadValue], TeamName(gTeam[i]));
                strcat(megastring, string);
            }
            FORMAT_SSTR "%s", TeamName(gTeam[playerid]));
        }
    }
    return ShowPlayerDialog(playerid, DIALOG_ASSASSINOS_4, DIALOG_STYLE_TABLIST_HEADERS, sstring, megastring, "Fechar", "");
}

    if(dialogid == DIALOG_ASSASSINOS_4 && response)
    {
       FORMAT_STR "debug %s.", Name(showcontract[playerid]));
       SCM(playerid, -1, string);
    }
 



RE: Retornar no jogador clicado - pushline - 09/10/2023

Claro que vai retornar o último player da lista...
seu "Name(showcontract[playerid])" está sendo sempre substituido no loop do comando, e o último jogador sempre vai ser o último da lista, por causa do "showcontract[playerid] = i;".

Você deveria salvar isso numa outra variável que seja per-player, mas que possa ter vários valores.
Tipo:

Código PHP:
new showcontract[MAX_PLAYERS][MAX_PLAYERS];

CMD:teste(playerid)
{
  new megastring[2000], string[256], cont;
  
  format
(stringsizeof(string), " \tOrganização:\n");
  strcat(megastringstring);

  for(new 0MAX_PLAYERSi++)
  {
    if(PlayerInfo[i][pHeadValue] > 0)
    {
      showcontract[playerid][i] = i;

      if(gTeam[i] == 0)
      {
        format(stringsizeof(string), "%s(%d) - $%d\n"Name(i), iPlayerInfo[i][pHeadValue]);
      }
      else
      {        
        format
(stringsizeof(string), "%s(%d) - $%d\t(%s)\n"Name(i), iPlayerInfo[i][pHeadValue], TeamName(gTeam[i]));
      }

      strcat(megastringstring);
    }
  }

  FORMAT_SSTR "%s"TeamName(gTeam[playerid]);
  return ShowPlayerDialog(playeridDIALOG_ASSASSINOS_4DIALOG_STYLE_TABLIST_HEADERSsstringmegastring"Fechar""");
}

if(
dialogid == DIALOG_ASSASSINOS_4 && response)
{
  FORMAT_STR "debug %s."Name(showcontract[playerid][listitem]);
  SCM(playerid, -1string);


é o que eu penso, pelo menos.


RE: Retornar no jogador clicado - L10motos - 09/10/2023

Ainda não funciona, fiz do jeito que você fez. A mensagem retorna ao jogador próximo e não o jogador que cliquei.


RE: Retornar no jogador clicado - pushline - 09/10/2023

Não entendi o que você quis dizer com "jogador próximo"


RE: Retornar no jogador clicado - L10motos - 09/10/2023

Tipo, eu clico no jogador 4, aparece que eu cliquei no jogador 3, eu clico no jogador 3, aparece que eu cliquei no jogador 2 sendo que cliquei no jogador 3.


RE: Retornar no jogador clicado - leonardos08bt - 09/10/2023

Código:

Código:
new showcontract[MAX_PLAYERS][MAX_PLAYERS]; // 1º parametro = playerid | 2º parametro = listitem

CMD:teste(playerid)
{
    new megastring[2000], string[256], cont = 0;

    format(string, sizeof(string), " \tOrganização:\n");
    strcat(megastring, string);

    for(new i = 0; i < MAX_PLAYERS; i++) //Use foreach para otimizar o loop.
    {
        if(!IsPlayerConnected(i))
            continue;

        if(PlayerInfo[i][pHeadValue] > 0) {
            showcontract[playerid][i] = i; //Se tiver sistema de ID FIXO, o valor que a variavel vai receber deve ser o ID FIXO do "i" (facilita muito mais na hora de encontrar o pj).
            cont ++;

            if(gTeam[i] == 0) {
                format(string, sizeof(string), "%s(%d) - $%d\n", Name(i), i, PlayerInfo[i][pHeadValue]);
                strcat(megastring, string);
            }
            else {
                format(string, sizeof(string), "%s(%d) - $%d\t(%s)\n", Name(i), i, PlayerInfo[i][pHeadValue], TeamName(gTeam[i]));
                strcat(megastring, string);
            }

            FORMAT_SSTR "%s", TeamName(gTeam[playerid]));
        }
    }
    if(cont) return ShowPlayerDialog(playerid, DIALOG_ASSASSINOS_4, DIALOG_STYLE_TABLIST_HEADERS, sstring, megastring, "Fechar", "");
    else return SCM(playerid, 0xFF0000FF, "Erro: {FFFFFF}Nao ha contratos online.");
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG_ASSASSINOS_4:
        {
            if(response) {
               FORMAT_STR "[DEBUG]: %s", Name(showcontract[playerid][listitem]));
               SCM(playerid, -1, string);
            }
            return 1;
       }
    }
    return 1;
}

(09/10/2023 16:30)L10motos Escreveu: Tipo, eu clico no jogador 4, aparece que eu cliquei no jogador 3, eu clico no jogador 3, aparece que eu cliquei no jogador 2 sendo que cliquei no jogador 3.

Se esse for o problema.. 
no dialog response adicione o "istitem+1", isso deve resolver o problema, mas o listitem começa do 0 então é meio estranho isso..


RE: Retornar no jogador clicado - L10motos - 09/10/2023

Resolvido, vocês foram reputados!


RE: Retornar no jogador clicado - zBreno - 09/10/2023

(09/10/2023 16:34)leonardos08bt Escreveu: Código:

Código:
for(new i = 0; i < MAX_PLAYERS; i++) //Use foreach para otimizar o loop.


palavras do autor

[Imagem: bJw3zFn.png]

https://github.com/pawn-lang/YSI-Includes
https://github.com/pawn-lang/YSI-Includes/blob/5.x/YSI_Data/y_iterate.md
https://github.com/pawn-lang/YSI-Includes/blob/5.x/YSI_Data/y_foreach/quick-start.md


RE: Retornar no jogador clicado - pushline - 09/10/2023

(09/10/2023 19:25)zBreno Escreveu:
(09/10/2023 16:34)leonardos08bt Escreveu: Código:

Código:
for(new i = 0; i < MAX_PLAYERS; i++) //Use foreach para otimizar o loop.


palavras do autor

[Imagem: bJw3zFn.png]

https://github.com/pawn-lang/YSI-Includes
https://github.com/pawn-lang/YSI-Includes/blob/5.x/YSI_Data/y_iterate.md
https://github.com/pawn-lang/YSI-Includes/blob/5.x/YSI_Data/y_foreach/quick-start.md

Foreach faz parte do y_iterate..., foreach era uma antiga include do Y-Less que ele fez port pro YSI.

(09/10/2023 16:34)leonardos08bt Escreveu: Código:

Código:
new showcontract[MAX_PLAYERS][MAX_PLAYERS]; // 1º parametro = playerid | 2º parametro = listitem

CMD:teste(playerid)
{
    new megastring[2000], string[256], cont = 0;

    format(string, sizeof(string), " \tOrganização:\n");
    strcat(megastring, string);

    for(new i = 0; i < MAX_PLAYERS; i++) //Use foreach para otimizar o loop.
    {
        if(IsPlayerConnected(i))
            continue;

        if(PlayerInfo[i][pHeadValue] > 0) {
            showcontract[playerid][i] = i; //Se tiver sistema de ID FIXO, o valor que a variavel vai receber deve ser o ID FIXO do "i" (facilita muito mais na hora de encontrar o pj).
            cont ++;

            if(gTeam[i] == 0) {
                format(string, sizeof(string), "%s(%d) - $%d\n", Name(i), i, PlayerInfo[i][pHeadValue]);
                strcat(megastring, string);
            }
            else {
                format(string, sizeof(string), "%s(%d) - $%d\t(%s)\n", Name(i), i, PlayerInfo[i][pHeadValue], TeamName(gTeam[i]));
                strcat(megastring, string);
            }

            FORMAT_SSTR "%s", TeamName(gTeam[playerid]));
        }
    }
    if(cont) return ShowPlayerDialog(playerid, DIALOG_ASSASSINOS_4, DIALOG_STYLE_TABLIST_HEADERS, sstring, megastring, "Fechar", "");
    else return SCM(playerid, 0xFF0000FF, "Erro: {FFFFFF}Nao ha contratos online.");
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG_ASSASSINOS_4:
        {
            if(response) {
               FORMAT_STR "[DEBUG]: %s", Name(showcontract[playerid][listitem]));
               SCM(playerid, -1, string);
            }
            return 1;
       }
    }
    return 1;
}

(09/10/2023 16:30)L10motos Escreveu: Tipo, eu clico no jogador 4, aparece que eu cliquei no jogador 3, eu clico no jogador 3, aparece que eu cliquei no jogador 2 sendo que cliquei no jogador 3.

Se esse for o problema.. 
no dialog response adicione o "istitem+1", isso deve resolver o problema, mas o listitem começa do 0 então é meio estranho isso..

Se ele colocou a parte do if(IsPlayerConnected(i)) continue; - Ele deveria mudar pra if(!Is...) com um ! na frente pra caso for falso, por que se atual índice estiver conectado, vai dar um skip no loop atual e ir pro próximo 
 


RE: Retornar no jogador clicado - leonardos08bt - 09/10/2023

(09/10/2023 20:38)pushline Escreveu:
(09/10/2023 19:25)zBreno Escreveu:
(09/10/2023 16:34)leonardos08bt Escreveu: Código:

Código:
for(new i = 0; i < MAX_PLAYERS; i++) //Use foreach para otimizar o loop.


palavras do autor

[Imagem: bJw3zFn.png]

https://github.com/pawn-lang/YSI-Includes
https://github.com/pawn-lang/YSI-Includes/blob/5.x/YSI_Data/y_iterate.md
https://github.com/pawn-lang/YSI-Includes/blob/5.x/YSI_Data/y_foreach/quick-start.md

Foreach faz parte do y_iterate..., foreach era uma antiga include do Y-Less que ele fez port pro YSI.

(09/10/2023 16:34)leonardos08bt Escreveu: Código:

Código:
new showcontract[MAX_PLAYERS][MAX_PLAYERS]; // 1º parametro = playerid | 2º parametro = listitem

CMD:teste(playerid)
{
    new megastring[2000], string[256], cont = 0;

    format(string, sizeof(string), " \tOrganização:\n");
    strcat(megastring, string);

    for(new i = 0; i < MAX_PLAYERS; i++) //Use foreach para otimizar o loop.
    {
        if(IsPlayerConnected(i))
            continue;

        if(PlayerInfo[i][pHeadValue] > 0) {
            showcontract[playerid][i] = i; //Se tiver sistema de ID FIXO, o valor que a variavel vai receber deve ser o ID FIXO do "i" (facilita muito mais na hora de encontrar o pj).
            cont ++;

            if(gTeam[i] == 0) {
                format(string, sizeof(string), "%s(%d) - $%d\n", Name(i), i, PlayerInfo[i][pHeadValue]);
                strcat(megastring, string);
            }
            else {
                format(string, sizeof(string), "%s(%d) - $%d\t(%s)\n", Name(i), i, PlayerInfo[i][pHeadValue], TeamName(gTeam[i]));
                strcat(megastring, string);
            }

            FORMAT_SSTR "%s", TeamName(gTeam[playerid]));
        }
    }
    if(cont) return ShowPlayerDialog(playerid, DIALOG_ASSASSINOS_4, DIALOG_STYLE_TABLIST_HEADERS, sstring, megastring, "Fechar", "");
    else return SCM(playerid, 0xFF0000FF, "Erro: {FFFFFF}Nao ha contratos online.");
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DIALOG_ASSASSINOS_4:
        {
            if(response) {
               FORMAT_STR "[DEBUG]: %s", Name(showcontract[playerid][listitem]));
               SCM(playerid, -1, string);
            }
            return 1;
       }
    }
    return 1;
}

(09/10/2023 16:30)L10motos Escreveu: Tipo, eu clico no jogador 4, aparece que eu cliquei no jogador 3, eu clico no jogador 3, aparece que eu cliquei no jogador 2 sendo que cliquei no jogador 3.

Se esse for o problema.. 
no dialog response adicione o "istitem+1", isso deve resolver o problema, mas o listitem começa do 0 então é meio estranho isso..

Se ele colocou a parte do if(IsPlayerConnected(i)) continue; - Ele deveria mudar pra if(!Is...) com um ! na frente pra caso for falso, por que se atual índice estiver conectado, vai dar um skip no loop atual e ir pro próximo 
 

Esqueci do detalhe, irei fazer a correção.