[Ajuda] Dialog com foreach
#1

A ideia й simples, eu estou tentando fazer uma funзгo pra vender item, que consiste em ver quem estб prуximo do vendedor, aparecer uma lista de pessoas ao redor, e, ao clicar, automaticamente armazenar o id dessa pessoa para dar procedimento ao dialog.

O cуdigo tб assim:
pawn Код:
new vString[128];
foreach(Player, i)
{
    if(ProxDetectorS(5.0, playerid, i))
    {
        MEGAString[0] = EOS;
        format(vString, sizeof(vString), "%s (ID: %d)", PlayerName(i), i);
        strcat(MEGAString, vString);
    }
    return 1;
}
if(playerProx == 0) return SendClientMessage(playerid, COLOR_GRAD1, " Ninguйm estб prуximo de vocк.");
ShowPlayerDialog(playerid, DIALOG_SELLITEM, DIALOG_STYLE_LIST, "Vender item", MEGAString, "Selecionar", "Voltar");
Reply
#2

Vк se й isso mano

PHP код:
// This is a comment
// uncomment the line below if you want to write a filterscript
#define FILTERSCRIPT
#include <a_samp>
#include <foreach>
#include <zcmd>
#define MAX_SLOT            (5) // atй cinco jogadores armazenados
#define DIALOG_SELLITEM     (1)
new vString[128], MEGAString[512];
new 
PegarID[MAX_PLAYERS][MAX_SLOT],
    
PegarLista[MAX_PLAYERS][MAX_SLOT]
;
stock PlayerName(playerid)
{
    new 
pName[MAX_PLAYER_NAME];
    
GetPlayerName(playeridpNameMAX_PLAYER_NAME);
    return 
pName;
}
stock ResetPlayerVars(playerid)
{
    for(new 
slotslot MAX_SLOTslot++)
    {
        
PegarID[playerid][slot] = -1;
        
PegarLista[playerid][slot] = -1;
    }
    return 
1;
}
public 
OnDialogResponse(playeriddialogidresponselistiteminputtext[])
{
    if(
dialogid == DIALOG_SELLITEM)
    {
        if(
response)
        {
            if(
listitem == PegarLista[playerid][listitem])
            {
                new 
PegarID[playerid][listitem];
                
format(vString128"Vocк clicou em: %s[%d]"PlayerName(i), i);
                
SendClientMessage(playerid,-1vString);
                return 
1;
            }
        }
        
// reset caso click em cancelar
        
ResetPlayerVars(playerid);
    }
    return 
1;
}
CMD:teste(playeridparams[])
{
    new 
Float:xFloat:yFloat:zplayerProx;
    
GetPlayerPos(playeridxyz);
    
ResetPlayerVars(playerid)
    foreach(
Playeri)
    {
        if(
IsPlayerInRangeOfPoint(i5.0xyz))
        {
            
MEGAString[0] = EOS;
            
format(vStringsizeof(vString), "%s (ID: %d)"PlayerName(i), i);
            
strcat(MEGAStringvString);
                
playerProx++;
            for(new 
slot 0slot MAX_SLOT; ++slot)
            {
                if(
PegarLista[playerid][slot] != -1)
                {
                    
PegarLista[playerid][slot] = slot;// Aqui ele pegara a listitem
                    
PegarID[playerid][slot] = i;// aqui pegara o ID
                    
break;
                }
            }
        }
        if(
playerProx == 0) return SendClientMessage(playerid, -1" Ninguйm estб prуximo de vocк.");
        
ShowPlayerDialog(iDIALOG_SELLITEMDIALOG_STYLE_LIST"Vender item"MEGAString"Selecionar""Voltar");
        return 
1;
     }
     return 
1;
}
public 
OnFilterScriptInit()
{
    print(
"\n--------------------------------------");
    print(
" Blank Filterscript by your name here");
    print(
"--------------------------------------\n");
    return 
1;
}
public 
OnFilterScriptExit()
{
    return 
1;

@edit
Reply
#3

A lуgica me parece correta, no entanto ela nгo estб funcionando. A ideia й pegar id de x pessoas prуximas de mim. Isso vai dar um loop e vai pegar somente o primeiro id, nгo vai pular pro prуximo id.
Reply
#4

Fiz ontem de madrugada rapidгo, kk...
Vou analisar o codigo e dou um edit no primeiro post!
Reply
#5

Olha o edit que eu dei no post anterior. Quando vocк dб break, ele vai parar no primeiro id, ele nгo vai pro prуximo.
Reply
#6

Mais a ideia й esta mesmo, o PegarLista[playerid][slot] e para pegar em que parte o player aparece na lista, quando ele pega temos que dar o break; para ele nгo substituir.

Enfim aguarda um pouco, porque o sistema ta todo errado atй o nome da variбvel ta errada. vou ajeitar aqui!
Reply
#7

Precisa nгo. Eu jб resolvi o seu cуdigo, deu certo aqui. Nгo necessitava mais um loop para pegar o id do cara, apenas um bastava. Ficou assim:

PHP код:
foreach(Playeri)
{
    if(
ProxDetectorS(8.0playeridi))
    {
        
format(vStringsizeof(vString), "%s (ID: %d)\n"PlayerName(i), i);
        
strcat(MEGAStringvString);
        if(
vListitem[playerid][i] != -1)
        {
            
PegarLista[playerid][i] = i;
            
PegarID[playerid][i] = i;
        }
    }

Reply
#8

Ok,
De qualquer forma deu um edit no meu cуdigo acima!

Quote:
Originally Posted by pWesley
Посмотреть сообщение
Precisa nгo. Eu jб resolvi o seu cуdigo, deu certo aqui. Nгo necessitava mais um loop para pegar o id do cara, apenas um bastava. Ficou assim:

PHP код:
foreach(Playeri)
{
    if(
ProxDetectorS(8.0playeridi))
    {
        
format(vStringsizeof(vString), "%s (ID: %d)\n"PlayerName(i), i);
        
strcat(MEGAStringvString);
        if(
vListitem[playerid][i] != -1)
        {
            
PegarLista[playerid][i] = i;
            
PegarID[playerid][i] = i;
        }
    }

Me explique como vocк o fez? nгo entendir seu codigo ja que nesta parte[...]
PHP код:
    PegarLista[playerid][i] = i;
    
PegarID[playerid][i] = i
[...]vocк esta armazenando o id do jogador em duas variбveis.

Como vai fazer para pegar o listitem no OnDialogResponse

PHP код:
if(listitem == PegarLista[playerid][i]) ??? 
Reply
#9

Como estou trabalhando com loop, nгo necessita o uso do condicional if(listitem ...

A linha onde destaquei i, seria o slot (id) do cara.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)