[Tutorial] How to: ShowPlayerDialog & Callback: OnDialogResponse
#1

Olб pessoal,
venho hoje tentar esclarecer as dъvidas de muitos sobre ShowPlayerDialog e a callback de responses.
Vamos comeзar vendo os conceitos de um Dialog, oque й um Dialog?
R: Pode ser considerado uma janela box com opзхes e listas dependendo do que o Scripter faзa.

Como eu posso entender o cуdigo do Dialog?
R: Muito simples, ele vem com 7 parвmetros:
Код:
playerid	-	ID do player para qual o dialog abrirб
dialogid	-	ID do dialog, sempre alternado, para nгo haver conflitos com outros dialogs
style		-	Estilo do dialog, (0, 1, 2, 3)
caption[]	-	Titulo do dialog, й como um header que fica bem na ponta em cima do dialog.
info[]		-	Informaзхes que virгo a aparecer quando o dialog й aberto.
button1[]	-	Botгo 1, com um texto afirmando uma opзгo.
button2[]	-	Botгo 2, afirmando uma opзгo oposta ao botгo 1

-----------------------------------------------------------------------------------------

Style: temos como style, a interface ao todo de um dialog.

0 = DIALOG_STYLE_MSGBOX, uma janela de mensagem apenas.
1 = DIALOG_STYLE_INPUT, uma janela de escrita, ъtil para pegar valores.
2 = DIALOG_STYLE_LIST, uma janela de lista, vбrias opзхes em um dialog.
3 = DIALOG_STYLE_PASSWORD, uma janela semelhante ao INPUT, mas ъtil para senhas e cуdigos secretos.

-------------------------------------------------------------------------------------------

Assim origina-se o cуdigo nativo de um dialog:

ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[]);
DIALOG_STYLE_MSGBOX:


DIALOG_STYLE_INPUT:


DIALOG_STYLE_LIST:


DIALOG_STYLE_PASSWORD


Cуdigos usados na SS:
pawn Код:
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "Tнtulo", "Este й um dialog estilo: DIALOG_STYLE_MSGBOX\n","Botгo 1", "Botгo 2");
ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Tнtulo", "Este й um dialog estilo: DIALOG_STYLE_INPUT\n", "Botгo 1", "Botгo 2");
ShowPlayerDialog(playerid, 3, DIALOG_STYLE_LIST, "Tнtulo", "DIALOG_STYLE_LIST\nopзгo 1\nopзгo 2\nopзгo 3", "Botгo 1", "Botгo 2");
ShowPlayerDialog(playerid, 4, DIALOG_STYLE_PASSWORD, "Tнtulo", "Este й um dialog estilo: DIALOG_STYLE_PASS, semelhante ao INPUT\n", "Botгo 1", "Botгo 2");
Vamos pular para a parte mais importante:
pawn Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    return 1;
}
Todo dialog sem exceзгo, precisa da Callback OnDialogResponse, a nгo ser que vocк nгo tenha a intenзгo
de fazer com que os botхes do dialog levem o dialog a outro passo...

pawn Код:
playerid    -   ID do player para qual o dialog dб a resposta
dialogid    -   ID do dialog que executarб a resposta para o playerid
response    -   Resposta do dialog, true(1) = botгo 1, false(0) = botгo 2
listitem    -   ID da opзгo de um dialog caso seja DIALOG_STYLE_LIST.
inputtext[] -   Valor digitado entre DIALOG_STYLE_INPUT & DIALOG_STYLE_PASSWORD

-----------------------------------------------------------------------------------------

Exemplo de como eu criaria um dialog de boas-vindas:

public OnPlayerSpawn(playerid)
{
    ShowPlayerDialog(playerid, 1, DIALOG_STYLE_MSGBOX, "Seja bem vindo", "Olб, seja bem vindo ao server \"Nome do Server\" \nSe precisar de ajuda procure um de nossos admins", "Continuar", "Cancelar");
    return 1;
}

Como foi meu primeiro dialog, usei 1 por nгo ter outro dialog com o mesmo valor...

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == 1) //Para responder as opзхes do dialog, fiz uma comparaзгo entre dialogid e o valor do dialog que eu criei.
    {
        if(response) //if(response) condiзгo true, poderia ser if(response == true) ou if(response == 1), como visto mais acima true(1) = botгo 1
        {
            SendClientMessage(playerid, -1, "Vocк clicou em continuar.");
            return 1;
        }
        if(!response) //if(!response) condiзгo false, poderia ser if(response == false) ou if(response == 0), como visto mais acima false(0) = botгo 2
        {
            SendClientMessage(playerid, -1, "Vocк clicou em cancelar.");
            return 1;
        }
        return 1;
    }
    return 1;
}

response, !response, й onde comeзa a diferenзa de quando o player clica no botгo 1 ou botгo 2.

Caso clique no botгo 1, SendClientMessage(playerid, -1, "Vocк clicou em continuar.");
Caso clique no botгo 2, SendClientMessage(playerid, -1, "Vocк clicou em cancelar.");
Exemplo 1 - ZCMD, escolher skins:
pawn Код:
CMD:skin(playerid)
{
    ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Escolha de skins", "Digite o valor de uma skin.", "Confirmar", "Cancelar");
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == 2)
    {
        if(response)
        {
            new skinValor = strval(inputtext);
            SetPlayerSkin(playerid, skinValor);
            return 1;
        }
        return 1;
    }
    return 1;
}

//new skinValor = strval(inputtext); variбvel nova cujo valor й oque o player digitou no inputtext,
// strval( ) foi apenas para transformar o que ele digitou para integer, nъmero inteiro.
Exemplo 2 - ZCMD, escolher vida determinada para o player determinado:
pawn Код:
CMD:vida(playerid)
{
    ShowPlayerDialog(playerid, 3, DIALOG_STYLE_INPUT, "Escolha o id", "Digite o id do player que desejas setar vida", "Confirmar", "Cancelar");
    return 1;
}

new id;

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == 3)
    {
        if(response)
        {
            id = strval(inputtext);
            new strLocal[60];
            format(strLocal, sizeof(strLocal), "Digite o valor da vida que desejar setar para o ID:[%d]", id);
            ShowPlayerDialog(playerid, 4, DIALOG_STYLE_INPUT, "Escolha vida", strLocal, "Confirmar", "Cancelar");
            return 1;
        }
        return 1;
    }
    if(dialogid == 4)
    {
        if(response)
        {
            new Float:Vida = strval(inputtext);
            SetPlayerHealth(id, Vida);
            return 1;
        }
        return 1;
    }
    return 1;
}

//Da mesma forma do exemplo anterior, sendo que agora podemos escolher o ID para qual iremos dar vida...
// new id = strval(inputtext); Transformamos o inputtext em integer e atribuimos o valor а nova Variбvel (id)
//a variбvel foi definida globalmente para nгo ter problema para pegar o valor novamente quando for escolher  o valo da vida
//new Float:Vida = strval(inputtext); transformamos o inputtext em integer e atribuimos а Float Vida.
//o format que eu fiz nгo й necessбrio caso seja algo mais simples que nгo mostre o ID do player e etc.
//format(strLocal, sizeof(strLocal), "Digite o valor da vida que desejar setar para o ID:[%d]", id);
Como podem ter notado, nos dois exemplos acima eu nгo usei if(!response) - botгo 2, pois
o botгo 2 sу tinha a funзгo de cancelar...
E como nгo foi aplicado nenhuma funзгo а ele, quando clicado ou pressionado (esc)
a dialog se fecharia...
mas de ambas as formas se nгo me engano, poderia usar:
pawn Код:
else return false; //Apуs todo if(response), pois else й o contrбrio de if, logo o contrбrio do botгo 1 й o 2
Exemplo 3 - ZCMD e agora utilizarei o botгo 2, simples teleport:
pawn Код:
CMD:teleportar(playerid)
{
    ShowPlayerDialog(playerid, 5, DIALOG_STYLE_MSGBOX, "Teleport", "Para onde desejar ir ?", "LS", "LV");
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == 5)
    {
        if(response)
        {
            SetPlayerPos(playerid, 1243.2365,-1692.5746,16.1976);
            SendClientMessage(playerid, -1, "Vocк foi teleportado para Los Santos");
            return 1;
        }
        if(!response)
        {
            SetPlayerPos(playerid,1958.3783, 1343.1572, 15.3746);
            SendClientMessage(playerid, -1, "Vocк foi teleportado para Las Venturas");
            return 1;
        }
        return 1;
    }
    return 1;
}
OBS: Muitas pessoas se atrapalham entre o tamanho da info no dialog.
Quando vocк ultrapassar o tamanho mбximo, podes formatar a mensagem com uma string maior e aplica-lб ao dialog dб forma que eu fiz no exemplo 2.

Dialogs e mais dialogs, dialogs tambйm contйm um valor mбximo de ID...
No caso 32767, entгo para aqueles que gostam de usar #define Valor_Do_Dialog (1000000000)
tomem cuidado com o valor mбximo dos dialogs ids

Dica dб qual fui percebendo ao longo dб minha passada por este fуrum.
Toda comparaзгo exige dois membros а ser comparados, logo а cada dialogid comparado.
pawn Код:
if(dialogid == x)
O compilador pode demorar mais a compilar, e o dialog pode perder sua velocidade.
Porque toda vez que o dialog for chamado ele passarб de comparaзгo em comparaзгo atй achar o dialogid
que foi chamado, assim tambйm com comandos. Por isso usamos ( eu uso pelo menos ) ZCMD.
Em todos os casos o aconselhбvel me foi passado а usar switch.

Tнtulo ou Caption[], tambйm contйm um valor mбximo = 64 caracteres...
Caso ultrapasse oque estiver passado de 64 nгo aparecerб no dialog quando for testar /usar.

pawn Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case 1:
        {
            switch(response)
            {
                case 0:
                {
                    //...
                    return 1;
                }
                case 1:
                {
                    //...
                    return 1;
                }
            }
            return 1;
        }
    }
    return 1;
}
Eu nгo dei explicaзхes durante o tutorial sobre este fato, porque nгo tenho certeza e o porque exato. Mas tб ai, se estiver errado ou faltando algum conteъdo espero ser corrigido pelos que entendem mais. Obrigado !


Espero ter ajudado novatos e/ou aqueles que tinham difнculdades com dialogs.
Reply
#2

Muito Bom (:
Reply
#3

Bem explicado. Parabйns.
Reply
#4

Bom trabalho.
Reply
#5

Parabйns, уtima explicaзгo.
Reply
#6

excelente tutorial cara, vai ajudar mtos novatos
Reply
#7

muito bom tuto bem explicado como disse o vini muito bom msm
Reply
#8

Estou esperando que seja ъtil mesmo, ultimamente tem sido criado muitos tуpicos por questхes de dialogs.
Reply
#9

Muito bom, Levou meu resp +


Quizer por uma corzinha .-. {Codico da cor [;}
Reply
#10

Quote:
Originally Posted by Sampizito
Посмотреть сообщение
Muito bom, Levou meu resp +


Quizer por uma corzinha .-. {Codico da cor [;}
Obrigado !

(...)Cor pra que? Nem sempre beleza convйm com eficiкncia.

Estou trabalhando em um plugin, entгo por enquanto nгo vou modificar nem adicionar cores.

@EDIT, tas a falar de adicionar cores em dialog ou na escrita do meu tutorial? Acho que me confundi...
Reply
#11

Cor na Dialog, na escrita dela ._.
Reply
#12

isso й o de menos, jб vi tutoriais ensinando tal coisa como botar cores em dialogs. Acho que expliquei sу oque batia dъvida mesmo.
Reply
#13

E para infeitar hehe, mais teu tuto tб explendido!
Reply
#14

Quote:
Originally Posted by Sampizito
Посмотреть сообщение
E para infeitar hehe, mais teu tuto tб explendido!
Que isso, sгo seus olhos. Mesmo assim obrigado !

Estou aceitando crнticas e dicas, ao todo obrigado !
Reply
#15

O fуrum tava precisando de um tutorial assim para novatos, tanto й que pensei que seria o Jonathan Feitosa
o criador do tуpico.

Parabйns, уtima explicaзгo vai ajudar muito, +rep para servir de Incentivo!
Reply
#16

Quote:
Originally Posted by StrondA_
Посмотреть сообщение
O fуrum tava precisando de um tutorial assim para novatos, tanto й que pensei que seria o Jonathan Feitosa
o criador do tуpico.

Parabйns, уtima explicaзгo vai ajudar muito, +rep para servir de Incentivo!
Obrigado ! (:
Reply
#17

Bem Explicado Muito bom
Reply
#18

Otimo tutorial, parabens !
Reply
#19

Уtimo tutorial.
Bem explicado.
Reply
#20

Quote:
Originally Posted by 4LiSs0N
Посмотреть сообщение
Bem Explicado Muito bom
Quote:
Originally Posted by Johnny Klebitz
Посмотреть сообщение
Otimo tutorial, parabens !
Quote:
Originally Posted by Đeagle
Посмотреть сообщение
Уtimo tutorial.
Bem explicado.
Obrigado.
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)