SA-MP Forums Archive
[Include] Procesamiento instantaneo de dialogos - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: Non-English (https://sampforum.blast.hk/forumdisplay.php?fid=9)
+--- Forum: Languages (https://sampforum.blast.hk/forumdisplay.php?fid=33)
+---- Forum: Español/Spanish (https://sampforum.blast.hk/forumdisplay.php?fid=29)
+----- Forum: Lanzamientos/Releases (https://sampforum.blast.hk/forumdisplay.php?fid=59)
+----- Thread: [Include] Procesamiento instantaneo de dialogos (/showthread.php?tid=266801)



Procesamiento instantaneo de dialogos - clavador - 06.07.2011

Este include es similar al de Gamer_Z lanzado en la comunidad inglesa, solo que mas simple.

Hice este include porque el de Gamer_Z no me funciono con JunkBuster.

Es mucho mas simple y va directamente al grano:

Les dejo el post original: https://sampforum.blast.hk/showthread.php?tid=266799

UPDATE 07/07: Reemplazar el script que hayan bajado por este ultimo. Se arreglo un bug que hacia que el codigo se ejecutase varias veces.

Y el include en version espaсol:

pawn Код:
//
//   Hecho por Clavador
//  idea original por
//       gamer_Z (Gracias)
//    encontralo aca:
// https://sampforum.blast.hk/showthread.php?tid=260298

new DialogToCall[24]; // Debe estar afuera

// REMOVE ESTE CALLBACK DE TODOS TUS FILTERSCRIPTS Y GAMEMODES Y DEJALO SOLAMENTE ACA
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{  
        format(DialogToCall,24,"DialogResponse_%d",dialogid);  // NO USAR DIALOGIDS NEGATIVOS
        if(isnull(inputtext))format(inputtext,2,"\1");
        if(funcidx(DialogToCall) != -1)
    return CallLocalFunction(DialogToCall,"iiis",playerid,response,listitem,inputtext);
       
        return 0;
}

// DEFINIMOS LA FUNCION
#define Dialog(%1) forward DialogResponse_%1(playerid, response, listitem, inputtext[]); \
                   public DialogResponse_%1(playerid, response, listitem, inputtext[])

/*

// ESTA ES LA FUNCION QUE DEBERIAS USAR. COPIALA DE ACA Y PEGALA DONDE MAS TE GUSTE

SOLO HAY QUE REEMPLAZAR dialogid POR EL ID DEL DIALOGO QUE PUSISTE EN ShowPlayerDialog y listo!

si usaramos: ShowPlayerDialog(playerid,201,DIALOG_STYLE_LIST,"Banco de San Andreas","Depositar\nRetirar","Aceptar","Salir");

Deberiamos reemplazar el dialogid en la funcion por 201 por ejemplo.

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

Dialog(dialogid) // (playerid,response,lisitem,inputtext[]) are passed as always
{
   if(response)
   {
       new pinnumber[5];
       format(pinnumber,sizeof(pinnumber),"%i",djInt(UserName(playerid),"player/pinnumber"));

       if (!strcmp(inputtext, pinnumber, true))
       {
           TextDrawShowForPlayer(playerid, BANK_BOX);
           TextDrawShowForPlayer(playerid, BANK_USUARIO);
           TextDrawShowForPlayer(playerid, BANK_BALANCE);
           UpdateBankStats(playerid);

           ShowPlayerDialog(playerid,201,DIALOG_STYLE_LIST,"Banco de San Andreas","Depositar\nRetirar","Aceptar","Salir");
       }
       else ShowPlayerDialog(playerid,200,DIALOG_STYLE_INPUT,"Banco de San Andreas ATM","PIN incorrecto.\nPor favor, ingrese su PIN","Aceptar","Cancelar");
   }
   else
   {
      ShowPlayerDialog(playerid,32000,DIALOG_STYLE_MSGBOX,"Banco de San Andreas","Gracias por utilizar nuestros servicios!","Cerrar","");
   }
   return 1;
}

*/
Cual es la ventaja de esto?

Si usan el metodo convencional, se van a llenar de switch o if y si tienen 100 dialogos, el servidor va a tener que procesar uno por uno hasta dar con el busca.

Con este metodo directamente se llama al dialogo solicitado, sin necesidad de buscarlo entre una larga lista.


Que lo disfruten!!!


Re: Procesamiento instantaneo de dialogos - ZeQualX - 07.07.2011

el include es innecesario, para eso usa IDs el callback de OnDialogResponse lol para llamar directamente el dialog y no como OnPlayerCommand que tiene que revisar todo el callback, poreso se hizo zcmd y poreso no es necesario este include.


Respuesta: Procesamiento instantaneo de dialogos - Jovanny - 07.07.2011

en realidad con esto si se procesa mas rapido
en vez de leer todos los if solo llama al necesario y es mas rapido que si revisa uno por uno asta encontrarlo


Respuesta: Procesamiento instantaneo de dialogos - RcoN! - 07.07.2011

como lo notaste?


Re: Respuesta: Procesamiento instantaneo de dialogos - MrDeath537 - 07.07.2011

Quote:
Originally Posted by josta
Посмотреть сообщение
en realidad con esto si se procesa mas rapido
en vez de leer todos los if solo llama al necesario y es mas rapido que si revisa uno por uno asta encontrarlo
Eso es porque las personas no saben cuando aplicar switch, un switch para la ID del diбlogo en OnDialogReponse es la manera mбs rбpida de hacerlo.

EDIT: Post #2000.


Respuesta: Procesamiento instantaneo de dialogos - clavador - 07.07.2011

Quote:
Originally Posted by ZeQualX
Посмотреть сообщение
el include es innecesario, para eso usa IDs el callback de OnDialogResponse lol para llamar directamente el dialog y no como OnPlayerCommand que tiene que revisar todo el callback, poreso se hizo zcmd y poreso no es necesario este include.
Quote:
Originally Posted by MrDeath537
Посмотреть сообщение
Eso es porque las personas no saben cuando aplicar switch, un switch para la ID del diбlogo en OnDialogReponse es la manera mбs rбpida de hacerlo.

EDIT: Post #2000.

Un switch en DialogResponse NO es la manera mas rapido de hacerlo.

Un swtich reemplaza a muchos "if if if if". El switch se usa para que el codigo quede mejor presentado, nada mas.

Si vos tenes switch(dialogid ==1, 2, 3 .... 100) cada vez que vos respondas un dialogo, el server tiene que iterar por todos los case hasta dar con el que busca. Con este include directamente se crea una funcion y vos llamas a la funcion sin buscar por ningun lado. Es mas rapido y directo.

Saludos.


Re: Respuesta: Procesamiento instantaneo de dialogos - Miguel - 07.07.2011

Quote:
Originally Posted by clavador
Посмотреть сообщение
Un switch en DialogResponse NO es la manera mas rapido de hacerlo.

Un swtich reemplaza a muchos "if if if if". El switch se usa para que el codigo quede mejor presentado, nada mas.

Si vos tenes switch(dialogid ==1, 2, 3 .... 100) cada vez que vos respondas un dialogo, el server tiene que iterar por todos los case hasta dar con el que busca. Con este include directamente se crea una funcion y vos llamas a la funcion sin buscar por ningun lado. Es mas rapido y directo.

Saludos.
Lamento decirlo, pero tienes toda la razуn. Es mбs fбcil (y mбs rбpido) que el servidor use una funciуn a que se tenga que comprobar ID por ID. Es exactamente el mismo caso que los comandos. Yo pensaba hacer esto, pero no me dio la cabeza para idear como crear una funciуn por cada dialogo.

Sugerencia: puedes pasar datos de cualquier tipo por la funciуn, їpor quй no ayudar a aquellos que tienen varios diбlogos enlazados entre si? Tipo lista de casas o parecidos. Puede ser un array de tamaсo limitado.

P.D: el resultado se ve cuando hay muchos diбlogos. Cuando hay pocos, switch funcionarб mejor.


Respuesta: Re: Respuesta: Procesamiento instantaneo de dialogos - clavador - 07.07.2011

Quote:
Originally Posted by Miguel
Посмотреть сообщение
P.D: el resultado se ve cuando hay muchos diбlogos. Cuando hay pocos, switch funcionarб mejor.
No realmente. Con este metodo es indiferente si hay 1 o 2 dialogos. Siempre va a ser mas rapido ir a buscar un libro donde sabes que esta que abrir una caja y tener dos y tener que mirar cual es el que necesitas vos.

Aparte de esta manera yo creo que se ve mas prolijo el script. Tiene un doble beneficio.


Re: Procesamiento instantaneo de dialogos - MrDeath537 - 07.07.2011

El switch no es como un if else-if -.-
Con 950 diбlogos, switch me resultу un poco mбs rбpido, les dejo el test como archivo adjunto.

Quote:
Originally Posted by Resultado
[18:40:16] switch: 719ms
[18:40:17] switch: 982ms
[18:40:18] switch: 715ms
[18:40:19] switch: 874ms
[18:40:20] switch: 917ms
[18:40:21] switch: 1287ms
[18:40:22] switch: 1287ms
[18:40:23] switch: 812ms
[18:40:24] switch: 777ms
[18:40:25] switch: 1242ms
[18:40:25] ++ switch: 961ms
[18:40:26] CallLocalFunction: 1070ms
[18:40:27] CallLocalFunction: 1103ms
[18:40:28] CallLocalFunction: 1072ms
[18:40:29] CallLocalFunction: 1103ms
[18:40:31] CallLocalFunction: 1108ms
[18:40:32] CallLocalFunction: 1092ms
[18:40:33] CallLocalFunction: 1091ms
[18:40:34] CallLocalFunction: 1111ms
[18:40:35] CallLocalFunction: 1113ms
[18:40:36] CallLocalFunction: 1106ms
[18:40:36] ++ CallLocalFunction: 1096ms
Nota: Al include le puse de nombre "dialog" y lo copie exactamente como estб acб (07/07/11).


Respuesta: Procesamiento instantaneo de dialogos - TheChaoz - 07.07.2011

switch es mejor q if, aca la prueba:
Usando switch
Usando if+else if

en un test de 10000 items, switch resulto ser 312ms mas rapido, sin mencionar que el archivo se compilo mucho mas rapido.

edit: lol MrDeath, no vi tu respuesta.