21.03.2012, 16:22
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?venho hoje tentar esclarecer as dъvidas de muitos sobre ShowPlayerDialog e a callback de responses.
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_INPUT:
DIALOG_STYLE_LIST:
DIALOG_STYLE_PASSWORD
Cуdigos usados na SS:
Vamos pular para a parte mais importante: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");
pawn Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
return 1;
}
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.");
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.
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);
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
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;
}
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)
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;
}
Espero ter ajudado novatos e/ou aqueles que tinham difнculdades com dialogs.