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(string, sizeof(string), " \tOrganização:\n"); strcat(megastring, string);
for(new i = 0; i < MAX_PLAYERS; i++) { if(PlayerInfo[i][pHeadValue] > 0) { showcontract[playerid][i] = i;
if(gTeam[i] == 0) { format(string, sizeof(string), "%s(%d) - $%d\n", Name(i), i, PlayerInfo[i][pHeadValue]); } 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]); 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][listitem]); SCM(playerid, -1, string); }
é 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
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
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
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.
|