Nanashi Posted May 6, 2013 Group: Members Topic Count: 15 Topics Per Day: 0.00 Content Count: 59 Reputation: 19 Joined: 01/03/13 Last Seen: August 27, 2024 Share Posted May 6, 2013 [NPC] Tienda del Viajero Autor: @Nanashi Idioma: Castellano (Spanish) Versión: 1.0 Descripción del Script El NPC consiste en un sistema de una tienda portátil, con los recursos básicos (pociones, lupas, alas de mosca, etc) de un Tool Dealer. Se puede activar desde cualquier lugar por lo que es muy útil en servidores donde hay que moverse mucho o permanecer mucho tiempo sin visitar una ciudad. Funcionamiento del Script El NPC utiliza un sistema llamado "OnWhisperGlobal" en el cual se whispea al npc para activar su función. Para activar la tienda hay que enviar un Mensaje (whispear) a Oakka con el texto viajero (npc:Oakka | viajero). Ejemplo de Mensaje a Oakka (Activar la Tienda) Una vez enviado el mensaje Oakka nos hablará sobre lo importante que es ir siempre equipado, acto después abrirá la tienda. Código del Script // |----------------------------------------------------------| // |--------------------[rAthena Script]----------------------| // |----------------------------------------------------------| // |------------------ Tienda del Viajero --------------------| // |----------------------------------------------------------| // |------------------------[Autor]---------------------------| // |----------------------------------------------------------| // |----------------------- Nanashi --------------------------| // |----------------------------------------------------------| // |---------------------[Versión Actual]---------------------| // |----------------------------------------------------------| // |---------------------- Version 1.0 -----------------------| // |----------------------------------------------------------| // |---------------------[Comienzo del NPC]-------------------| // |----------------------------------------------------------| - script Oakka -1,{ OnWhisperGlobal: set .@nombre$,"[^0065DF Oakka ^000000]"; if (@whispervar0$ == "viajero") { goto help; } help: mes "-^008888 Información ^000000-"; mes "Sientes la presencia de un espíritu a tu alrededor..."; next; mes .@nombre$; mes "Hola ^008888" + strcharinfo(0) + "^000000,"; mes "llevo tiempo vagando por estas tierras desde los inicios de Midgard."; next; mes .@nombre$; mes "Aunque aún me queda mucho por explorar,"; mes "durante mis viajes he aprendido lo importante que es ir siempre bien equipado."; next; mes .@nombre$; mes "Yo puedo proporcionarte lo básico."; mes "¿Te interesa ver mis mercancías?"; next; switch (select("Si:^000088Salir^000000")){ Case 1: mes .@nombre$; mes "Esta bien, dame un segundo."; next; callshop "oakkashop",0; end; Case 2: mes .@nombre$; mes "Como quieras ^008888" + strcharinfo(0) + "^000000,"; mes "que tengas suerte en tus aventuras."; next; mes "-^008888 Información ^000000-"; mes "La presencia del espíritu se desvanece..."; close; } } // -- Tienda de Oakka // =========================================================================================== - shop oakkashop -1,611:40,601:60,602:300,501:50,503:550,502:200,645:800. // =========================================================================================== Descargas oakka.txt Notas Adicionales Si encuentran algún error no duden en decírmelo ya sea en este post o por pm. Saludos, espero que les sirva. 1 Quote Link to comment Share on other sites More sharing options...
jaBote Posted May 10, 2013 Group: Members Topic Count: 1 Topics Per Day: 0.00 Content Count: 182 Reputation: 36 Joined: 01/26/12 Last Seen: October 6, 2021 Share Posted May 10, 2013 Tengo varias críticas constructivas que hacer a tu script. No lo he probado, pero creo que deberías echarle un ojo a tu script en los siguientes apartados: Cualquier cosa que whispees a Oakka acabará abriendo la tienda, dado que no hay nada que termine el script en caso de que @whispervar0$ no sea "viajero" (me refiero a un end después del goto). En caso de que no haya nada, el flujo de ejecución del script continúa hasta entrar en la etiqueta help. Nunca entendí por qué, pero según criticaron muy duramente a la persona de la que aprendí scripting, los goto son malvados y han de ser evitados a toda costa. Yo habría usado callsub que funciona igual de bien, aunque es posible evitar su uso y concentrar algo más el NPC. Me refiero a que puedes simplemente quitar ese goto y poner el contenido de dicha etiqueta ahí y el NPC funcionará igual de bien, o incluso mejor (más rápido, aunque no se note en una ejecución, a las millones de ejecuciones sí se nota) e incluso hará tu script más sencillo de leer por humanos. Es muy correcto y respetable usar switch para un menú de select, pero para un menú de solo dos opciones siempre sale mejor usar una estructura if-else. Esto es solo una minucia proveniente de una persona quisquillosa. No estoy seguro, pero parece que el script no termina cuando decides abrir la tienda: next prepara el NPC para abrir un nuevo cuadro de texto aún después de la tienda. Lo más apropiado sería usar close2, que cierra apropiadamente la ventana para que puedas usar luego end. Recuerda que close es básicamente close2 + end. En cuanto al apartado visual del código (que da totalmente igual a efectos prácticos), el sangrado del mismo es prácticamente correcto pero en mi opinión has abusado mucho de las líneas vacías blanco. Esto no importa absolutamente nada salvo que quieras darle buena apariencia. Se te han escapado un par de pequeñas erratas de tildes, pero tampoco es nada importante: muchas veces pasa Aquí te ofrezco una versión con las correcciones planteadas anteriormente. Un comentario con un número significa alguno de los puntos que comenté anteriormente: // |----------------------------------------------------------| // |--------------------[rAthena Script]----------------------| // |----------------------------------------------------------| // |------------------ Tienda del Viajero --------------------| // |----------------------------------------------------------| // |------------------------[Autor]---------------------------| // |----------------------------------------------------------| // |----------------------- Nanashi --------------------------| // |----------------------------------------------------------| // |---------------------[Versión Actual]---------------------| // |----------------------------------------------------------| // |---------------------- Version 1.0 -----------------------| // |----------------------------------------------------------| // |---------------------[Comienzo del NPC]-------------------| // |----------------------------------------------------------| - script Oakka -1,{ OnWhisperGlobal: set .@nombre$,"[^0065DF Oakka ^000000]"; if (@whispervar0$ == "viajero") { // Puntos 1 y 2, especialmente el 2: goto innecesario. mes "-^008888 Información ^000000-"; mes "Sientes la presencia de un espíritu a tu alrededor..."; next; mes .@nombre$; mes "Hola ^008888" + strcharinfo(0) + "^000000,"; mes "llevo tiempo vagando por estas tierras desde los inicios de Midgard."; next; mes .@nombre$; mes "Aunque aún me queda mucho por explorar,"; mes "durante mis viajes he aprendido lo importante que es ir siempre bien equipado."; next; mes .@nombre$; mes "Yo puedo proporcionarte lo básico."; mes "¿Te interesa ver mis mercancías?"; next; if(select("Sí:^000088Salir^000000") == 1){ // Punto 3, si el select == 1 entonces se ha escogido sí. mes .@nombre$; mes "Está bien, dame un segundo."; close2; // Punto 4 callshop "oakkashop",0; end; } // Aquí podría venir un else, pero como nos hemos encargado de acabar el script en el caso anterior, nos da igual ponerlo o no. mes .@nombre$; mes "Como quieras ^008888" + strcharinfo(0) + "^000000,"; mes "que tengas suerte en tus aventuras."; next; mes "-^008888 Información ^000000-"; mes "La presencia del espíritu se desvanece..."; close; } end; // Punto 1 otra vez, faltaba un end y en caso de que ahora no se ponga no pasaría nada, pero los scripts nunca acabarían. } // -- Tienda de Oakka // ======================================================================================================== - shop oakkashop -1,611:40,601:60,602:300,501:50,503:550,502:200,645:800. // ======================================================================================================== He mantenido la misma estructura de flujo que tu NPC, pero yo personalmente habría comenzado el NPC así porque es más limpio: - script Oakka -1,{ OnWhisperGlobal: if (@whispervar0$ != "viajero") end; // El PJ no ha dicho viajero, no nos molestamos con el resto del NPC set .@nombre$,"[^0065DF Oakka ^000000]"; // Resto del NPC aquí Espero haber sido de ayuda con esto. ¡Un saludo! Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.