¡Vota por nosotros!

Vota diariamente por XatiyaRO para mejorar nuestra reputación y ayudarnos a crecer.

RagnaTOP - Top Ragnarok Online en Español Ragnarok private server
private server TOP RO Hispano

Autor Tema: [NPCs]Explicando eA NPC/Scripting [Cap1 - Quest Irrepetible] EXTENSO  (Leído 9844 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Rokimoki

[NPCs]Explicando eA NPC/Scripting [Cap1 - Quest Irrepetible] EXTENSO
« en: 22 de Agosto de 2009, 21:11:17 pm »
Me presento soy Rokimoki en mucho sitios de internet y creo que soy el único (lo cual me gusta) y este primer capítulo voy a explicaros como hacer un NPC para hacer una quest muy sencilla la cual no se podrá repetir.

Aprobechando las guías que ya hay antes de seguir con la guía es aconsejable que lean:
Capítulo 1-1 de balfer: Leer
Capítulo 1-2 de balfer: Leer

Ahora continúa leyendo el mio. Sabiendo cómo configurar la posición, nombre y sprite de un script yo tomaré éste como ejemplo:

Código: [Seleccionar]
prontera,100,100,4<tab>script<tab>Quest1<tab>55,{
Eso sería la primera línea de mi NPC, "<tab>" habría que sustituirlo con un espacio de tabulador, resultando así:

Código: [Seleccionar]
prontera,100,100,4 script Quest1 55,{
Pero aquí en adelante lo escribiré <tab> para que se quede grabado que tiene que ser con tabulador obligatoriamente. Y recordar que cuando se abre un corchete "{" tiene que haber otro que cierre "}", podemos observar que la primera línea acaba en un "{" (open of script) y tendría que acabar en un "}" (end of script), ahora bien os aconsejo empezar un NPC así...

1.- Comentarios
Código: [Seleccionar]
prontera,100,100,4 script Quest1 55,{
  // Empezar a codear aquí
} // End script

Ahora aprovecho para explicarles la "//" que significa que lo que vaya después de esas doble barras no se ejecutará ni será interpretada por el compilador, que en este caso es el emulador eAthena, en otros lenguajes se utilizan otras cosas y otros métodos, aquí es la doble barra que se escribe con shift+7, al quedarse inservible lo que se escriba después, se suele utilizar para documentar el código, escribir comentarios como he hecho yo en ese ejemplo.

NOTA: Los comentarios tienen tanta importancia como el código en si.

2.- Crear un menú
Seguramente habréis visto que para hacer un menú con la función menu "texto",etiqueta1,"texto,etiqueta2; pues bien, nosotros vamos a omitir esa función y vamos a usar las funciones switch y select.
Primero os voy a explicar que es un switch, es una estructura de control que funciona con variables de tipo integer (números enteros) y que actúa según el valor de la variable. Porque sería inútil hacer:

Uso del switch, incorrecto.

Código: [Seleccionar]
switch(5) {
 case 1:
 case 2:
 case 3:
 case 4:
 case 5:
 default:
} // End switch

Porque siempre saltaría al case 5, por eso se pone una variable que dice, ¿cuánto vale la variable? pues por ejemplo, 110... si hay un case 110: salta ahí, sino va a donde esté el default: si no existe un default habrá un problema y se cerrará el programa con un error, no por ello siempre hay que escribir un default. Ahora un ejemplo correcto con una variable integer...

Uso del switch, correcto.

Con una variable integer:
Código: [Seleccionar]
set var, rand(1,10);
switch (var) {
case 1:
mes "Tomó el valor uno.";
close;

case 2:
mes "Tomó el valor dos.";
close;

case 3:
mes "Tomó el valor tres.";
close;

default:
mes "Bueno creo que no sé que valor tomó, dejame pensar un poco más...";
next;
break;
} // End switch
mes "Ah sí, ya sé. La variable tomó el valor " +var;
close;

La función break; juega un valor muy importante porque por ejemplo si en el case 1: no hubiera close; saltaría al case 2: y lo ejecutaría, y en realidad no estaría bien puesto que la variable nunca tomó el valor dos si estuvo en el case 1:.

Ahora explicaré para qué funciona el select. Éste sirve para mostrar un menú en el juego y jugar un poco con él... un ejemplo sin usar el select con el switch.

Código: [Seleccionar]
if (select("¿Quieres continuar?:¿O quieres salir?") == 2) {
   mes "Vale, adiós...";
   close;
} // End if
mes "Pues continuemos...";
next;
// Seguimos con lo que estuvieramos haciendo

Si cojemos la opción 2, el select toma valor dos, entonces al hacer una comparación... decimos, si el select vale 2 entonces hacemos lo que está dentro del if, y como elejiste salir pues cerramos la conversación. Si no pues seguimos con el NPC.

Ahora un ejemplo con el switch.

Código: [Seleccionar]
switch (select("Hola, ¿cómo estas?:No te conozco no quiero hablar contigo:¿Perdón? ¿Qué necesitas?")) {
case 1: // Si elijes la primera opción
mes "Pues yo bien, gracias por preguntar espero que tú también estés bien =]";
break;

case 2: // Si elijes la segunda opción
if (sex == 1) { // Comparamos si es masculino o femenino. Sex == 1 masculino
mes "Adiós antipático, espero que te vaya mal todo,";
} else { // Si no es Sex == 1 es otra cosa, pero como Sex sólo es 0 ó 1, pues éste siempre valdrá 0
// En este caso es Sex == 0 female
mes "Adiós antipática, espero que no te quiera ningún hombre.";
} // End if
break;

case 3: // Si elijes la tercera opción
mes "Gracias por preguntar, pero no te molestes ahora no necesito ayuda, muchísimas gracias.";
break;
} // End switch
close;

Cómo veis es sencillo, y documentado para una mejor comprensión, y ya con un ejemplo con un if que usaremos muchos para las quests...

NOTA: Es importante que el script tenga un código a buen ver, y con sus espacios bien puestos y bien documentado.

3.- Hacer una quest - variables
En primer lugar, esto será una quest que sólo se hará una vez, entonces debe haber algo que identifique que la quest ha terminado y la separación de las partes de la quest, puede ser sólo una parte o varias, ésta sólo será de una parte. Aún así habrá que decir cómo hemos terminado la quest, para ello usaremos una variable, de tipo integer y character.

¿Ésto que significa? Pues verás, una variable es un valor en memoria que se va cambiando a nuestro antojo mediante el script, pero como es de tipo character se queda guardado en el character y no afectará a nada en el servidor ni en lagg ni en procesador puesto que la consulta a la variable no costará nada al procesador, puesto que estará en el disco duro del servidor y en contacto permanente mientras el servidor esté encendido.

Las variables en eAthena script no hay que declararlas, en el momento que crees una tendrá el valor 0 por defecto, puedes definirla con un valor inicial si lo prefieres, añadiendo información sobre las variables hay que nombrar que en el script tienen un nombre, el nombre deberá ser identificativo al uso, es decir si la quest es la que controla las partes de la quest podríamos llamarla "Control_Quest" ó por ejemplo si se llama la quest, kiel quest pues "KielQuest". En éste ejemplo la llamaremos "EventoIzlude"

NOTA: Las variables integer de tipo character no tienen prefijo, ni sufijo, es decir, es el nombre y ya está, se identificará como variable porque no se escribirá entre comillas NUNCA.

Para esta quest de ejemplo no necesitaremos más variables por lo tanto el tema de variables en este capítulo concluye aquí, hago hincapié, lean las NOTAS...

PD: Yo sí usaré una variable más por meticulosidad, pondremos en la segunda línea del script set .nombre$, "[Nombre del NPC]"; pues así tenemos una variable de tipo NPC string, es la más optimizada para ésto.

4.- Hacer una quest - estructura
Tenemos que pensar en cómo vamos a hacer la quest, yo pensé para una inicial en la típica de entregar unos items, dar recompensa y finalizar y no poder hacerla más, para ello debemos pensar en alguna mini historieta, por ejemplo la que tengo en mi servidor, hice una invasión en Izlude y los mobs la destruyeron (como satan morroc) y puse un NPC reconstructor que pide items a los usuarios y les da una recompensa, esos items son para reconstruir la infraestructura de Izlude, en mi servidor se puede hacer varias veces pero aquí la haremos irrepetible. Dicho esto vamos a hacer el script, primero pensamos en los items que vamos a pedir, en mi caso pediré "60 trunk, 40 steel, 30 iron, 50 scell, 1 elunium y 1 oridecon" y luego pensaremos en la recompensa, yo decidí "3 speed potion, 1 libro de 100% + de exp y 1000 exp base y job"

Una vez decidido la mini historieta y los items que pediremos y la recompensa que daremos lo escribiremos como script:

Código: [Seleccionar]
izlude,122,109,4 script Reconstructor 52,{
set .nombre$, "[Reconstructor de Izlude]";
mes .nombre$;
switch (EventoIzlude) {
case 0:
mes "Hola veo que quieres  colaborar en la reconstrucción de Izlude, necesitarás traerme algunos objetos que necesito para reparar la infraestructura de Izlude.";
next;
mes .nombre$;
mes "60 Trunk";
mes "40 Steel";
mes "30 Iron";
mes "50 Scell";
mes "1 Elunium";
mes "1 Oridecon";
next;
mes .nombre$;
mes "Cuando los traigas, te compensaré....";
set EventoIzlude, 1;
break;

case 1:
mes "¿Ya me has traido los objetos?";
next;
switch (select("Sí:No...")) {
case 1:
mes .nombre$;
if (countitem(1019) >= 60 && countitem(999) >= 40 && countitem(998) >= 30 && countitem(911) >= 50 && countitem(985) >= 1 && countitem(984) >= 1) {
mes "OH!! Muchísimas gracias por traer los objetos !!!";
if (Sex == 0) {
announce "La heroina [" +strcharinfo(0) +"] ha contribuido en la reconstrucción de Izlude tras la invasión del pasado martes, Izlude estará eternamente agradecido !",bc_yellow|bc_all;
} else {
announce "El caballero [" +strcharinfo(0) +"] ha contribuido en la reconstrucción de Izlude tras la invasión del pasado martes, Izlude estará eternamente agradecido !",bc_yellow|bc_all;
} // End if
set EventoIzlude, 2;
delitem 1019,60;
delitem 999,40;
delitem 998,30;
delitem 911,50;
delitem 985,1;
delitem 984,1;
getitem 12016,3;
getitem 14532,1;
getexp 1000,1000;
} else {
mes "No tienes aún todos los items necesarios para la recompensa, por favor vuelve cuando los tengas !!";
mes "60 Trunk";
mes "40 Steel";
mes "30 Iron";
mes "50 Scell";
mes "1 Elunium";
mes "1 Oridecon";
} // End if
break;

case 2:
mes .nombre$;
mes "Bueno pues vuelve cuando los tengas para la recompensa ^^";
break;
} // End switch
break;

case 2:
mes "Gracias por ayudar a la reconstrucción de Izlude, gracias a ti hemos podido mejorar la infraestructura, eres un héroe ejemplar.";
break;
} // End switch
close;
} // End script

Una ves desarrollado el script, lo analizamos para los novatos. Tenemos un switch inicial que controlará las partes de la quest, como hemos dicho una variable sin definir por defecto tiene valor 0, entonces vamos al case 0: del switch, que sería el inicio de la quest que nos dice qué items necesitamos, y que cuando los tengas que vuelvas a hablarle, entonces ya definimos la variable controladora al valor 1, lo hacemos por orden para no perdernos, podrías poner el valor que quisieras, pero 1 sería el más adecuado.

Si se nos olvida qué había que recolectar, le damos de nuevo y el switch detecta que la variable controladora ahora vale 1, entonces va al case 1: del switch y nos pregunta que sí tenemos el item, con un switch + select como ya he explicado, si le decimos que sí, va al case 1: si le decimos que no, va al case 2: porque sería la segunda opción.

Una vez dentro del case 1: hacemos un if que nos compruebe los items del inventario, eso se hace con la función countitem(id del objeto) por ejemplo:

Código: [Seleccionar]
mes "Tienes " +countitem(909) +"jellopy en el inventario.;

La función devuelve en integer el valor de la ID que pongas dentro del paréntesis del inventario. (Espero que se haya entendido eso xD), sobre el if como lo tengo hecho no creo que haya que explicar mucho. De todos modos cualquier duda, escriban directamente una respuesta al post.

Después de verificar que efectivamente tenemos los items, hacemos un broadcast con la función announce a todo el servidor. (La función strcharinfo() con el valor 0 devuelve el nombre del PJ en cuestión), luego colocamos la variable controladora en valor 2, para que cuando volvamos a clicar al NPC salte al case 2: que sería que nos felicida por terminar y no podamos repetir la quest. Como vemos al anunciar que hemos contribuido a la reconstrucción de Izlude, nos quita del inventario los objetos que nos pedía, nos da la recompensa y la exp y terminamos con la quest.

Guía desarrollada completamente por Rokimoki, ejemplos incluidos, espero comentarios y dudas de la gente, aprender es gratis. ;)


Este trabajo está bajo la licencia: Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License
« Última modificación: 22 de Agosto de 2009, 21:25:33 pm por Rokimoki »