26.07.2015, 14:36
(
Последний раз редактировалось Locky_; 02.08.2015 в 03:54.
)
Criaзгo de Pбginas em Dialog
A utilizaзгo de pбginas em Dialog, й muito ъtil em casos de vocк querer resultados melhor organizados, e usar menos strings enormes para exibir tantos resultados e as vezes nem conseguindo exibir todos eles.
Para poder criar, й necessбrio usar variaveis. Pode se usar 2, uma para ficar guardado quando iniciou o нtem, e outra para guardar o prуximo нtem (que serб usado para a prуxima pбgina).
Forma Dinamica
Dinamica й quando vocк precisa filtrar os resultados para serem mostrado na lista. Serб necessбrio filtrar na exibiзгo da Dialog e quando clicou em algum нtem da Dialog.
Exemplo: Quero fazer uma lista de jogadores, que sгo VIP, usando uma dialog de listagem.
Lembrando que, os ids comeзam em 0, e terminam no mбximo de slots (ou no caso ultimo id conectado);
Terei que filtrar os resultados, para obter apenas aqueles que sгo VIP;
Terei que contar quantos tem, para quando atingir um certo nъmero, guardar o resultado para a prуxima pбgina.
Lembrando de tudo isso, vamos aos cуdigos
PHP код:
new bool:PlayerVIP[MAX_PLAYERS]; // False nгo й VIP & True й VIP
// Um comando bбsico
CMD:vervips(playerid) {
SetPVarInt(playerid,"inicio_lista",0);
abrir_listaVips(playerid);
return 1;
}
// Nas dialogs
if(dialogid == DialogVips) {
if(!response) return DeletePVar(playerid,"inicio_lista"),DeletePVar(playerid,"proxima_lista"); // Apaga as informaзхes
if(listitem >= 10) {// Onde estб para abrir a prуxima lista
SetPVarInt(playerid,"inicio_lista",GetPVarInt(playerid,"proxima_lista")); //Agora vai iniciar da onde parou
abrir_listaVips(playerid);
return 1;
}
new vips, msg[144];
for(new i = GetPVarInt(playerid,"inicio_lista"); i <= GetPlayerPoolSize(); i++) { // LOOP novamente para checar em qual jogador clicou
if(!IsPlayerConnected(i)) continue;
if(PlayerVIP[i] == false) continue;
if(listitem == vips) {
format(msg,sizeof(msg),"vocк clicou no vip id %i",i);
SendClientMessage(playerid,-1,msg);
break;
}
vips++;
}
DeletePVar(playerid,"inicio_lista");
DeletePVar(playerid,"proxima_lista");
return 1;
}
// Stock
abrir_listaVips(playerid) {
new vips,str[1000];
for(new i = GetPVarInt(playerid, "inicio_lista"); i <= GetPlayerPoolSize(); i++) {
if(!IsPlayerConnected(i)) continue; // Se nгo estiver conectado, continua o LOOP
if(PlayerVIP[i] == false) continue/ Se nгo for VIP, continua o LOOP
if(vips >= 10) { // Jб mostrou 10 VIPs, agora irб aparecer o 'prуxima pбgina' na lista
strcat(str,"{FFFF00}Prуxima Lista");
SetPVarInt(playerid,"proxima_lista",i);
break; // Para o LOOP
}
format(str,sizeof(str),"%sPlayer ID %i\n",str,i);
vips++; //Contando os VIPs
}
ShowPlayerDialog(playerid,DialogVips,DIALOG_STYLE_LIST,"VIPs",str,"Ok","Cancelar");
}
Й Confuso? nгo. Entenda melhor agora:
Ao usar o comando /vervips, foi iniciado um LOOP a partir do jogador id 0.
Й checado se o ID estб conectado, e se й VIP.
Se for VIP e estiver conectado, irб contar, e adicionar na string.
Se passar de 10 VIPs, irб adicionar a opзгo na Dialog "Prуxima Pбgina", e irб parar o LOOP.
Assim irб mostrar a Dialog conforme vocк queria.
Ao clicar no jogador, irб aparecer a mensagem "vocк clicou no vip id **"
Ao clicar em 'prуxima pбgina' vocк irб ver a prуxima pбgina, mostrando a partir do ID que iria mostrar.
Vamos supor que os ids 0,1,2,4,5,7,8,10,11,12,14,16,18 sгo VIPs. Na primeira lista, mostrou:
Код:
Player ID 0 Player ID 1 Player ID 2 Player ID 4 Player ID 5 Player ID 7 Player ID 8 Player ID 10 Player ID 11 Player ID 12 Prуxima pбgina
Код:
Player ID 14 Player ID 16 Player ID 18
Forma estбtica
Esta forma й quando as variaveis nгo precisam ser filtradas. Isto й mais usado quando sгo definidos as variaveis jб no servidor.
Exemplo: Lista de comandos.
PHP код:
new Comandos[][] = {
"/oi", "/bem", "/mp", "/relato", "/ajuda", "/admins", "/ir", "/carros", "/motos", "/vips",
"/morrer", "/armas", "/comandos", "/status", "/tele", "/casas", "/duelar", "/abrir", "/entrar"
};
// Stock
exibir_listaComandos(playerid) {
new str[1000], cmds;
for(new i = GetPVarInt(playerid, "inicio_lista"); i < sizeof(Comandos); i++) {
if(cmds >= 10) {
SetPVarInt(playerid, "proxima_lista",i);
strcat(str,"{FFFF00}Prуxima lista");
break;
}
cmds++;
format(str,sizeof(str), "%s%s\n",str,Comandos[i]);
}
ShowPlayerDialog(playerid,DialogComandos,DIALOG_STYLE_LIST,"Comandos",str,"Ok","Cancelar");
return 1;
}
//Comando bбsico
CMD:comandos(playerid) {
SetPVarInt(playerid, "inicio_lista", 0);
exibir_listaComandos(playerid);
return 1;
}
// Dialog
if(dialogid == DialogComandos) {
if(!response) return DeletePVar(playerid,"inicio_lista"),DeletePVar(playerid,"proxima_lista");
if(listitem >= 10) { // Clicou em prуxima
SetPVarInt(playerid,"inicio_lista",GetPVarInt(playerid,"proxima_lista"));
exibir_listaComandos(playerid);
return 1;
}
new cmd = GetPVarInt(playerid,"inicio_lista") + listitem, msg[144];
format(msg,144,"{a9c4e4}Comando: %s",Comandos[cmd]);
SendClientMessage(playerid,-1,msg);
DeletePVar(playerid,"inicio_lista");
DeletePVar(playerid,"proxima_lista");
return 1;
}
O primeiro comando da lista й /oi. se comeзou do 0 e clicou na opзгo 0 (0 + 0 = 0) e irб exibir
Код:
Comando: /oi
Код:
Comando: /vips
Код:
Comando: /entrar
MySQL
Em MySQL os resultados ficam ainda mais fбceis, pois ele prуprio jб tem um sistema de limitar os resultados.
Consulta:
PHP код:
SELECT * FROM usuarios LIMIT 0,30
PHP код:
SELECT * FROM usuarios LIMIT 30,30
Mas й possнvel fazer isso com as dialogs? Sim, da mesma maneira. Podemos utilizar 1 var.
(Retirado do FS Sistema de Mensagem Privada em MySQL)
PHP код:
carregar_MsgEnviadas(playerid) {
new str[250], Cache:en;
mysql_format(con_mysql, str, sizeof(str), "SELECT `mp_msgs`.`Mensagem`,`mp_contas`.`user` FROM `mp_msgs` INNER JOIN `mp_contas` ON `mp_msgs`.`para_contaid` = `mp_contas`.`id` WHERE `mp_msgs`.`de_contaid` = %i ORDER BY `mp_msgs`.`id` DESC LIMIT %i,20", pData[playerid][mID], pData[playerid][pagList]); // Consulta, limitando de 0 a 20 inicialmente.. O valor recebe +20 quando clicado em 'prуxima pбgina'
en = mysql_query(con_mysql, str, true);
if(cache_num_rows(con_mysql) > 0) {
new Nome[24], Mensagem[64], Dialog[1500];
for(new i; i < cache_num_rows(con_mysql); i++) {
cache_get_field_content(i, "user", Nome, con_mysql, 24);
cache_get_field_content(i, "Mensagem", Mensagem, con_mysql, 64);
format(Dialog, sizeof(Dialog), "%s%s: %s%s\r\n", Dialog,Nome,Mensagem,(strlen(Mensagem) >= 63) ? ("...") : (""));
}
if(cache_num_rows(con_mysql) >= 20) // Se houver 20 registros
strcat(Dialog, "\r\n{FFFF00}Prуxima Pбgina"); //Opзгo prуxima pбgina
ShowPlayerDialog(playerid, DialogMsgEnviada, DIALOG_STYLE_LIST, "{FF0000}# {FFFFFF}Mensagens enviadas", Dialog, "Selecionar", "Cancelar");
}
else SendClientMessage(playerid, -1, "{FF0000}[MP] Nгo hб mensagens!");
cache_delete(en, con_mysql);
return 1;
}
//Dialog
case DialogMsgEnviada: {
if(!response) return cmd_minhasmp(playerid,"");
if(listitem >= 21) return pData[playerid][pagList] += 20, carregar_MsgEnviadas(playerid); // Recebendo +20
new query[220], Cache:info, Dialog[180], Nome[24], Mensagem[128], Data[20];
mysql_format(con_mysql, query, sizeof(query), "SELECT `mp_msgs`.*,`mp_contas`.`user` FROM `mp_msgs` INNER JOIN `mp_contas` ON `mp_msgs`.`para_contaid` = `mp_contas`.`id` WHERE `mp_msgs`.`de_contaid` = %i ORDER BY `mp_msgs`.`id` DESC LIMIT %i,20",pData[playerid][mID], pData[playerid][pagList]); // Consulta
info = mysql_query(con_mysql, query, true);
if(cache_num_rows(con_mysql) > 0 && listitem < cache_num_rows(con_mysql)) { // Se o valor de resultados for maior que 0 & a opзгo clicada й menor que o nъmero de resultados encontrados
cache_get_field_content(listitem, "Mensagem", Mensagem, con_mysql);
cache_get_field_content(listitem, "user", Nome, con_mysql, 24);
cache_get_field_content(listitem, "data", Data, con_mysql, 20);
format(Dialog, sizeof(Dialog), "Mensagem enviada para %s em %s\nMensagem: %s", Nome, Data, Mensagem);
ShowPlayerDialog(playerid, DialogMsgRetorno, DIALOG_STYLE_MSGBOX, "{FFFF00}# {FFFFFF}Visualizando mensagem enviada:", Dialog, "Ok", "");
}
else SendClientMessage(playerid, -1, "{FF0000}Ocorreu um erro!");
cache_delete(info, con_mysql);
return 1;
}
A opзгo 21, й 'Prуxima Pбgina', entгo ao clicar, irб exibir da mensagem 20 a 30 e no caso apenas 10 mensagens... Ou seja, as 30 mensagens foram exibidas, 20 em uma pбgina, em 10 em outra.
OBS: 21 pois adiciona 2 linhas a mais (\r\n) pois os resultados foram de 0 a 19, entгo na logica a opзгo para prуxima pagina seria a 20.
Veja mais como funciona no script: Aqui
Esta lуgica й semelhante usada em scripts PHP, para organizaзгo de pбgina. Vocк deve possuir um conhecimento em MySQL antes de tentar pensar em criar algo do tipo.
A intenзгo do tуpico nгo й dar cуdigos prontos, e sim encina-los a obter tal lуgica para criar sistemas/organizaзхes melhores de sistema.
Caso vocк queira algo semelhante para gerar em dialogs com STYLE_MSGBOX, veja isto. A lуgica apresentada acima й apenas funcional em STYLE_LIST/TABLIST/TABLIST_HEADERS.
Espero que tenham gostado, dъvidas sу comentar, e sugestхes de melhorias sгo aceitas.