SSGamers - 13 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

Participe do fórum, é rápido e fácil

SSGamers - 13 Anos online por você.

#SSGamers - A Comunidade que mais crescer no brasil!

SSGamers - 13 Anos online por você.

Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.
Chegou o novo tema 6.5.5 - SSGamers - Servidores online de qualidade - Aproveite e entre para nossa comunidade, inscreva-se já! - Ouça nossa web radio - Veja nossas novidades - Participe dos nossos setores de jogos online - Parcerias aberta fale já com um administrador.

    [Tutorial] Criação de páginas em Dialog

    Weslley_Script
    Weslley_Script
    SS - Fundador
    SS - Fundador


    Steam Steam : WeslleySSGames
    Zello : WeslleySSGames
    Mensagens : 11643
    Moedas : 1032951
    Data de inscrição : 06/10/2011
    Idade : 29
    Localização : Brasil

    [Tutorial] Criação de páginas em Dialog Empty [Tutorial] Criação de páginas em Dialog

    Mensagem por Weslley_Script Seg 10 Abr 2023 - 9:07

    Criação de Páginas em Dialog

    A utilização de páginas em Dialog, é muito útil em casos de você querer resultados melhores organizados, e usar menos strings enormes para exibir tantos resultados e as vezes nem conseguir exibir todos eles.
    Para poder criar, é necessário usar variáveis. Pode se usar 2, uma para ficar salvo quando iniciado o ítem, e outro 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 mostrados na lista. Será necessário filtrar na exibição da Dialog e quando clicar em algum ítem da Dialog.

    Exemplo: Quero fazer uma lista de jogadores, que são VIP, usando uma caixa de diálogo de listagem.

    Lembrando que, os ids começam em 0, e terminam no máximo de slots (ou no caso de 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, salve o resultado para a próxima página.
    Lembrando de tudo isso, vamos aos cуdigos

    PHP como:

    Código:
    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;


    }



    Código:
    // 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;


    }



    Código:
    // 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, vá adicionar a opção na caixa de diálogo "Próxima página", e vá 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:
    Код:

    Código:
    ID do jogador 0


    ID do jogador 1


    ID do jogador 2


    ID do jogador 4


    ID do jogador 5


    ID do jogador 7


    ID do jogador 8


    ID do jogador 10


    ID do jogador 11


    ID do jogador 12


    Próxima página
    Cliquei na próxima página, e agora mostrei
    Код:

    Código:
    Identificação do jogador 14


    Identificação do jogador 16


    ID do jogador 18


    Pareceu tudo ok


    Forma esttica
    Esta forma й quando as variaveis nгo precisam ser filtradas. Isto é mais usado quando são definidos como variáveis ​​já no servidor.

    Exemplo: Lista de comandos.

    PHP como:

    Código:
    new Comandos[][] = {


        "/oi", "/bem", "/mp", "/relato", "/ajuda", "/admins", "/ir", "/carros", "/motos", "/vips",


    "/morrer", "/armas", "/comandos", "/status", "/tele", "/casas", "/duelar", "/abrir", "/entrar"


    };



    Código:
    // 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;


    }



    Código:
    //Comando bбsico


    CMD:comandos(playerid) {


        SetPVarInt(playerid, "inicio_lista", 0);


        exibir_listaComandos(playerid);


        return 1;


    }



    Código:
    // 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;


    }


    De forma estética, é só pensar um pouco. Tudo já está definido em ordem, logo os resultados irão aparecer da maneira e ordem que você os define.

    O primeiro comando da lista é /oi. se comeзou do 0 e clicou na opзгo 0 (0 + 0 = 0) e irб exibir
    Код:

    Código:
    Comando: /oi


    O dйcimo comando da lista й /vips. Se você fizer 0, e clicar na opção 9 (0 + 9 = 9) irá exibir


    Код:

    Código:
    Comando: /vips


    O último comando da lista é /entrar. Se comeзou do 10, e clicou na opзгo 9 (10 + 9 = 19) irб exibir (pois apуs o comando /vips foi mostrado 'prуxima pбgina' e assim comeзou do 10 em diante).


    Код:

    Código:
    Comando: /entrar


    Assim tudo está Ok!



    MySQL
    Em MySQL os resultados ficam ainda mais fáceis, pois ele prуprio jб tem um sistema de limitar os resultados.

    Consulta:
    PHP como:

    Código:
    SELECT * FROM usuarios LIMIT 0,30


    Serгo 30 resultados, estб mostrando como se fosse uma pбgina do inicio 0...


    PHP como:


    SELECT * FROM usuarios LIMIT 30,30


    Serгo 30 resultados, e estб mostrando da onde parou anteriormente.



    Mas é possível fazer isso com os diálogos? Sim, da mesma maneira. Podemos usar 1 var.

    (Retirado do FS Sistema de Mensagem Privada em MySQL)
    PHP como:

    Código:
    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;


    }


    /
    Código:
    /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;


            }


    Pense assim. Vamos imaginar o seguinte, que você recebeu 30 mensagens. Exibição 20 na primeira página, correto?
    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 diálogos 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.

    Creditos: Locky_



    [Tutorial] Criação de páginas em Dialog D07Xwqb
    [Tutorial] Criação de páginas em Dialog Yjab9HN

      Data/hora atual: Seg 25 Nov 2024 - 22:32