Jump to content

ElRaulxX

Miembro
  • Contador contenido

    49
  • Ingreso

  • Última visita

  • Días ganados

    12

Todo lo publicado por ElRaulxX

  1. Podrías haber echo que la quest coja automáticamente la raza y el grupo de habilidades. Tanta elección es un incordio para el usuario.
  2. El problema de esto es que la función mysql no viene incluida por defecto en los servidores, así que para la mayoría de usuarios de este foro, esta quest les será bastante inútil.
  3. Estás confundiendo muchos conceptos.A lo que te refieres de catacumbas, es una variable global declarada en el questlib. Y no, variable no es lo mismo que función.
  4. A ver cuando hacemos en el curso esta sección... que sino... xd Puedes crear funciones en una quest para usarlas únicamente en esa quest. Para que el servidor reconozca que esa función está creada en esa misma quest y no es otra declarada en el quest_functions, se sigue la sintaxis: nombredelaquest.nombredelafuncion() En cambio, las quests creadas en questlib y declaradas en el quest_functions son funciones globales que puedes utilizar en cualquier quest son las que has utilizado hasta ahora. Por ejemplo say_title()
  5. Sinceramente, no sé porqué no te funciona TheSanto. En mi servidor funciona perfectamente, pues no hay ningún error en la quest. Me fijé que la quest de iluavatar no te funcionaba tampoco. Quizá sea algo de tus files... Santy, las funciones declaradas en una quest no hace falta añadirlas en el quest_functions. Para que las acepte, debe tener el nombre de la quest seguido de un punto. Las otras, sino están añadidas, no hace falta decir que hay que añadirlas.
  6. Esto me lo pidieron ayer mismo, pues la verdad es que nunca ha sido publicado en un foro español. Si os habéis fijado, a partir de los files 2010, beran-setaou (id 2493) adquiere nuevas habilidades. El único problema de ellas es que, normalmente, no hacen daño. La explicación es muy sencilla, pues el daño proviene del propio game y, por lo tanto, debemos activar esas habilidades. Para hacerlo, debemos ir al directorio (/usr)/home/game/share/locale/germany y abrir con un editor de texto el archivo settings.lua En este archivo, a parte de haber configuraciones de sonido, arena y /go de mapas, a partir de ahora se encontrará las configuraciones del mob 2493. ¿Como hacerlo? Fácil, tenemos que ir al final del archivo y copiar el siguiente código: Como podéis ver, ahí encontraremos los daños y bonus de las habilidades de nuestro mob. Además, también están las configuraciones de los metines que afectan al estado de nuestro mob en la sala del dragón (no me preguntéis como funciona eso, pues en este momento lo desconozco). Todo esto podemos modificarlo a nuestro antojo (la sintaxis creo que la podemos entender fácilmente). Post original: http://www.elitepvpe...-und-neuer.html Autor: .Nova. Y creo que eso es todo. Un saludín!
  7. Si cambias el nombre de la quest, tienes que cambiar el nombre a todas las funciones declaradas en ella y incluidas en la misma quest.
  8. Utilizo la función os.execute() con el siguiente comando: mysql -u 'user' --password='pass' --execute='UPDATE account.account SET coins = coins + cantidadcoins WHERE id = idcuenta;Con esta función puedes realizar cualquier comando del sistema operativo (os = operating system). Es decir, estás haciendo lo mismo que si introdujeras ese comando en la consola de freebsd. Al tener instalado el mysql en el servidor, no es necesario nada más para conectar a la database.
  9. Buenas zone! Hoy, para distraerme, me ha dado por hacer alguna quest (que raro en mi... ). Bueno, al lío! ¿de qué se trata? Se trata de una sencilla quest realizada en un ratito, con la intención de hacer un comercio ingame de coins para la ItemShop. La he echo con la intención de que sea sencilla de editar: añadiendo menos de dos líneas de código puedes añadir un nuevo objeto a la quest o incluso cambiar el nombre del objeto que saldrá en la quest. La quest modifica directamente el valor coins de account.account a través de mysql, así que no hace falta decir que deberéis configurar con los datos de vuestro servidor. Y como conozco a la gente demasiado bien y sé que harías cualquier cosa por conseguir coins gratis, he añadido un pequeño sistema de revisión a través de function true/false... por si se me escapa algo... Aquí la tenéis: La quest Como editarla y hacerla funcionar Para hacerla funcionar, lo primero que tenéis que hacer es sustituir id_item1, id_item2 y id_item3 por las ids del objeto de vuestro servidor (recordar que debe tener type 18 para que funcione la quest). Podéis utilizar ctrl+h en el notepadd... Lo único que quedará por hacer es poner vuestros datos de la db donde veáis esto: No hace falta decir que los datos va entre las comillas. Os lo he señalizado todo bien... para los mancos de vista Para editarla, debéis buscar esto: Y añadir una nueva línea: Después buscais esto: Y añadís el item que habéis puesto antes: Y eso es todo. Saludines
  10. Sí que se pueden utilizar, en los say claro. Lo único que no se puede hacer es escribir una letra con acento al final de un say. Sino, la quest no funcionará. Sobre la aplicación, no hay nada mejor que el notepad para hacer quests pero buen trabajo
  11. Buenas foreros de Metin2 Zone! Os vengo a traer la quinta entrega de nuestro fantástico curso de quests. En este capítulo trataremos los states, algo básico que tenéis que tener en cuenta a la hora de crear una quest. La verdad es que esto formaría parte del capítulo II, pues los states estructuran las quests, pero hemos aplazado este capítulo para que lo podáis entender mejor ahora que ya habéis avanzado un poco. Supongo que habréis visto ya en todas las quests la estructura state start begin. Efectivamente, eso es un state. Pero antes de todo debemos entender qué es realmente un state. 1 - ¿Qué es un state? Podríamos decir que un state es la "división" de una quest. Las acciones de cada quest se dividen en bloques independientes: los states. Cuando el usuario inicia la quest empezará en el state inicial (start). A partir de entonces el creador de la quest puede ir cambiando de states a su conveniencia. De esta manera podemos hacer que el usuario sufra diferentes acciones en cada uno de los states. Algo importante a saber es que los states son totalmente independientes los unos de los otros. Las acciones que ocurren dentro de un state sólo ocurrirán en este state, es decir, cuando el usuario se encuentre dentro de este state. Un ejemplo, para que lo entendáis, son las misiones de búsqueda de un npc o de matar un determinado mob, las misiones de toda la vida que utiliza ymir. Cuando empieza la quest aparece un determinado pergamino. Conforme vamos avanzando la quest, este pergamino irá cambiando; en un state podemos abrir un determinado texto en un npc, en otro no. Esto no lo podríamos hacer sin nuestros states. Podemos entender mejor los states si los comparamos con un conjunto de habitaciones unidas a través de puertas. Empezamos entrando a la primera habitación (state start - inicio de la quest). En ella nos encontramos una alfombra y una silla. Por lo tanto podemos caminar sobre la alfombra y sentarnos en la silla. Ahora decidimos ir a una segunda habitación. En esta segunda habitación nos encontramos un sillón y una mesa. En esta habitación podemos sentarnos en el sillón y poner una baso sobre la mesa, pero no podemos caminar sobre la alfombra ni sentarnos en la silla ya que eso pertenece a la habitación anterior. De esta manera podemos entender los states. Cada state es independiente de los otros; podemos realizar las acciones que se encuentran dentro de un state independientemente de los otros. Para cambiar de state deberemos atravesar una puerta que, en términos de quest, correspondería a una función para cambiar el state en que se encuentra el usuario. Una quest puede tener un número indeterminado de states. Eso, como ya dije, va a conveniencia del creador de la quest. Cuando compilemos la quest (implementamos en el servidor) aparecerá en object la quest dividida/fragmentada. Esa división será en función de los states. Por ejemplo, si implementamos la quest tutorial.quest que contiene los states start, run y final, en object nos aparecerán los archivos tutorial.start, tutorial.run y tutorial.final (todo dividido en mobs, timers..., claro está). Esto lo trataremos a fondo en otro capítulo. 2 - ¿Cómo cambiamos de state? El state del jugador puede cambiarse a partir de funciones creadas para ello. Los states se almacenan en la db y permanecerán hasta que sea modificado con cualquiera de las funciones creadas para ello. Existen dos maneras de cambiar un state: internamente o remotamente. Internamente: La función de cambio de state principal es la función set_state() o setstate(). Su uso es muy sencillo: tan solo debemos introducir como único argumento el nombre del state al que queremos cambiar cuando queramos realizar el cambio de state interno de la quest (por si no se entiende, entre paréntesis tenemos que poner el nombre del state al que queremos ir). set_state(string $state) Ejemplo: quest tutorial begin state start begin when 9012.chat."Aprendamos los states 1" begin say("Actualmente te encuentras en el state start") say("¿Quieres cambiar de state?") local s = select("Si","No") if s == 1 then say("Has cambiado de state correctamente") set_state("run") end end end state run begin when 9012.chat."Aprendamos los states 2" begin say("Actualmente te encuentras en el state run") say("¿Quieres cambiar de state?") local s = select("Si","No") if s == 1 then say("Has cambiado de state correctamente") set_state("start") end end endend Como veis en el ejemplo, cada state es independiente de los otros. También debo recordar que TODOS los states se cierran con un end. Los states pueden tener cualquier nombre, el que queramos. Aún así, para evitar cualquier tipo de error, es aconsejable utilizar nombres sencillos sin caracteres especiales. Remotamente: Los states de una quest también podemos cambiarlos remotamente, es decir, desde otra quest ajena. ¿Cómo hacemos eso? Pues con la función: set_quest_state(). Esta función toma dos argumentos: el primer argumento debe ser el nombre de la quest a la que queramos cambiar el state (IMPORTANTE: el nombre de la quest es el definido en la primera línea quest x begin donde x es el nombre de la quest; no confundir con el nombre del archivo quest) y el segundo el nuevo state al que queremos ir. set_quest_state(string $quest, string $state) Ejemplo: Quest1: quest tutorial1 begin state start begin when 9012.chat."Aprendamos los states 1" begin say("Actualmente te encuentras en el state start") end end state run begin when 9012.chat."Aprendamos los states 2" begin say("Actualmente te encuentras en el state run") end endend Quest2: quest tutorial2 begin state start begin when 9012.chat."Aprendamos los states - cambiar state" begin say("¿A que state quieres cambiar?") local s = select("start","run") if s == 1 then say("Has cambiado de state correctamente") set_quest_state("tutorial1", "start") elseif s == 2 then say("Has cambiado de state correctamente") set_quest_state("tutorial1", "run") end end endend 3 - States en los when - enter y leave Existen dos maneras de activar un when a través de los states: enter y leave. Enter: Se ejecutará el when cuando entremos en el state. Leave: Se ejecutará el when cuando salgamos del state. A través de estos dos whens podemos aumentar mucho la funcionalidad de una quest en las ocasiones en que podamos cambiar los states. He visto programadores quest que utilizan mucho esta táctica para conseguir solucionar problemas que de otra manera serían mucho más difíciles de solucionar, ¡incluso lo utiliza nuestra madre ymir! Aquí tenéis un ejemplo explicativo: quest tutorial begin state start begin when 9012.chat."Aprendamos los states - 1" begin say("¿Realmente quieres cambiar de state?") local s = select("si","no") if s == 1 then say("Has cambiado de state correctamente") set_state("run") end end end state run begin when enter begin chat("Has entrado al state.") end when leave begin chat("Has salido del state.") end when 9012.chat."Aprendamos los states - 2" begin say("¿Realmente quieres cambiar de state?") local s = select("si","no") if s == 1 then say("Has cambiado de state correctamente") set_state("start") end end endend Cuando entremos al state run se ejecutará chat("Has entrado al state.") y cuando salgamos del mismo chat("Has salido del state."). Este ejemplo es muy sencillo pero estoy seguro que de aquí os pueden salir grandes ideas que mejorarán mucho vuestro código. Con todo esto podemos ir jugando con los states y hacer miles de cosas. Algo muy útil es poner un state sin ninguna acción. Así podemos dar por finalizada la quest, ¡muy útil para quests con recorrido! Recordar que los states es lo principal de las quest. Si sabéis utilizarlos serán buenos aliados, sino tan solo serán neutrales. Siempre es mejor tener aliados, ¿no creéis? Changelog 31/07/12 20:18 - Primera publicación oficial del capítulo. 04/09/13 11:35 - Correcciones varias. 04/09/13 14:33 - Correcciones varias. 04/09/13 15:31 - Correcciones varias, Añadida sección 3 - States en los when - enter y leave
  12. Aún no han acabado de leerse mi capítulo y les pones el tuyo xD ¡Les estallará la cabeza de tanta información! El próximo me toca a mí, a ver que tal se os dan los states :fuckyeah:
  13. En el anterior capítulo, keko os explico más o menos como podemos estructurar una quest. En este capítulo nos centraremos en el cuerpo, exactamente en los whens. El uso de los whens es lo más básico dentro de una quest. A partir de aquí podremos desarrollar cualquier acción de una quest. Estructura básica de un when. Antes de todo, tenemos que recordar la estructura de un when: when [x] begin -- end *Esta es la estructura básica. Podemos añadirle muchísimas más cosas que explicaré en este capítulo, pero de momento, no nos avancemos. Llamaremos [x] a una variable que nos sirva para todos los casos. ¿Qué pasaría si no siguiéramos esta estructura? Pues que nos saltaría este error: Debéis recordar siempre que todos los whens siguen esa estructura. Sino, no funcionará y no la reconocerá el servidor. Pero como la variable [X] que nos hemos inventado no existe, tendremos que poner algo en su lugar, ¿no? Podemos poner muchas acciones que puede realizar el usuario (pc) dentro del servidor. Voy a listarlas todas (o casi todas). Las pondré en orden de uso y dificultad. Es posible que algunas de ellas ahora no les encontréis utilidad en este momento. Es recomendable que dentro de un tiempo las volváis a repasar para acabar de entenderlas y poder darles su debido uso. *Lo que está en cursiva puede ser sustituido. idnpc.chat."texto" : Al utilizarlo se abrirá un dialogo con opciones. Al dar click al texto empieza el contenido del when. idnpc.click : Al hacer click en el npc, empieza el contenido del when. kill : Cuando el jugador mata un enemigo, comienza el contenido del when. idmob.kill : Cuando el jugador mata al enemigo con idmob empieza el contenido del when. party_kill : Cuando un miembro del grupo mata a un enemio, comienza el contenido del when. idmob.party_kill : Cuando un miembro del grupo mata a aun enemigo con idmob, empieza el contenido del when. login : Cuando el jugador se logea, empieza el contenido del when. logout : Cuando el jugador se deslogea, empieza el contenido del when. letter : Relacionado con las letters (explicación en otro capitulo). button : Relacionado con las letters (explicación en otro capitulo). info : Relacionado con las letters (explicación en otro capitulo). nombre.timer : Cuando el timer llamado con nombre llega a 0, empieza el contenido del when. nombre.server_timer : Cuando el server_timer llamado con nombre llega a 0, empieza el contenido del when. nombre.target.click : Cuando haces click al tarjet nombre empieza el contenido del when. nombre.target.arrive : Cuando llegas al punto con el tarjet nombre empieza el contenido del when. ( ) Unos cuantos ejemplos: quest cap3_1 begin state start begin when login begin --cuando te logeas say("¡Hola mundo!") -- muestra en dialogo end end end quest cap3_2 begin state start begin when 9012.chat."Quest de prueba" begin --cuando hablas con el npc 9012 say("¡Hola mundo!") --muestra en dialogo end end end quest cap3_3 begin state start begin when 101.kill begin --cuando matas al mob con id 101 say("¡Hola mundo!") --muestra en dialogo end end end Sabiendo todo esto que acabo de explicar ya tenemos una gran parte avanzada, pero ¡aquí no acaba toda la información de los whens! Hasta ahora he puesto tan solo un when por quest ¿no se pueden poner más? ¡Claro que sí! Veamos: (recordar cerrar todos los whens!) quest cap3_4 begin state start begin when 9012.chat."Quest de prueba 1" begin --cuando hablas con el npc haciendo click a Quest de prueba 1 9012 say("¡Hola mundo!") --muestra en dialogo end when 9012.chat."Quest de prueba 2" begin --cuando hablas con el npc haciendo click a Quest de prueba 2 9012 say("¡Hola mundo!") --muestra en dialogo end end end quest cap3_5 begin state start begin when 9012.chat."Quest de prueba" begin --cuando hablas con el npc 9012 say("¡Hola mundo!") --muestra en dialogo end when login begin --cuando te logeas say("¡Hola mundo!") -- muestra en dialogo end end end En este momento ya deberíais empezar a entender el funcionamiento básico de las quests. Si no es así, revisa estos 3 capitulos de nuevo antes de continuar el capítulo y el curso restante. Es importante que nunca escribáis algo que no entendáis. Si no, (me cito a mí mismo) pasaría esto en un futuro: [/size][/font] Expandiendo la estructura básica de un when. Como dije antes, esa tan solo era la estructura básica de un when. Esta estructura podemos complicarla tanto como queramos añadiendo condiciones o juntando varias acciones de distintos whens. Partiremos de la quest básica: (A partir de ahora tan solo pondré la parte del when. No os olvidéis nunca de poner el inicio de la quest y los states, igual que su correspondiente cierre) when 101.kill begin --cuando matas al mob con id 101 say("¡Hola mundo!") --muestra en dialogo end Empezaremos poniendo una condición. En este caso, que el usuario sea mayor de nivel 5. when 101.kill with pc.get.level() > 5 begin --cuando matas al mob con id 101 + con nivel mayor de 5 say("¡Hola mundo!") --muestra en dialogo end De esta manera (utilizando with) podemos añadirle una condición. Si el usuario no coincide con la condición, el servidor omitirá el when en el que estamos trabajando. Esto nos puede ahorrar escribir codigo. En vez de poner una condición dentro del when, la ponemos en el propio when (más información sobre las condiciones en el capítulo IV de keko). Más ejemplos: when 101.kill with pc.get_map_index == 41 begin --cuando matas al mob con id 101 + estando en el mapa con index 41 say("¡Hola mundo!") --muestra en dialogo end when 101.kill with pc.get_max_hp > 5000 begin --cuando matas al mob con id 101 + teniendo un valor de HP mayor de 5000 say("¡Hola mundo!") --muestra en dialogo end when 101.kill with pc.is_mount begin --cuando matas al mob con id 101 + estando montado en una montura say("¡Hola mundo!") --muestra en dialogo end Hasta ahora hemos trabajado con una sola condición ¿podemos añadir más? Claro! Cogemos nuestro ejemplo anterior. when 101.kill with pc.get.level() > 5 begin --cuando matas al mob con id 101 + con nivel mayor de 5 say("¡Hola mundo!") --muestra en dialogo endAhora queremos que, demás de ser mayor de nivel 5, posea el item con vnum 19: when 101.kill with pc.get.level() > 5 and pc.count_item(19) > 1 begin --cuando matas al mob con id 101 + con nivel mayor de 5 + en posesión del item con id 19 say("¡Hola mundo!") --muestra en dialogo endDe esta manera (utilizando and) podemos añadirle todas las condiciones que queramos, poniendo siempre antes un with. Partiremos de nuevo (aunque ahora algo diferente) de dos whens básicos. when 101.kill begin --cuando matas al mob con id 101 say("¡Hola mundo!") --muestra en dialogo end when login begin --cuando te logeas say("¡Hola mundo!") --muestra en dialogo end Podemos juntarlos? Claro! Veamos: when login or 101.kill begin --cuando matas al mob con id 101 / te logeas say("¡Hola mundo!") --muestra en dialogo endDe esta manera (utilizando or) podemos poner que la acción se efectúe en diversas situaciones o con diferentes condiciones.Todo lo que hemos visto hasta ahora podemos combinarlo como queramos. when 101.kill or 102.kill or 103.kill begin say("¡Hola mundo!") --muestra en dialogo end when login with pc.get_map_index == 41 or 101.kill with pc.get.level() > 5 and pc.count_item(19) > 1 begin say("¡Hola mundo!") --muestra en dialogo end when 101.kill with pc.get_map_index == 1 or 101.kill with pc.get_map_index == 41 begin say("¡Hola mundo!") --muestra en dialogo end Podemos hacer tantas combinaciones de whens como queramos. Tan solo es saber entender el funcionamiento de las quests. Y lo más importante! Sin práctica no se aprende! La mejor manera de aprender quest es mirar otras quests ya echas e intentar imitarlo, hacer pruebas y pruebas hasta ver el funcionamiento, o leer este curso. Pero claro! Solo con este curso no vais a aprender. Recordar que, sin práctica, nada se aprende!
  14. ¡Buenas zone! Como ya os han dicho, nos dedicaremos keko y yo un tiempo a hacer juntos este graaaaan curso de quests (ya veréis como se os hará corto ). Keko me ha concedido el honor de ser el que abra el curso, así que eso haré jeje Los que me conozcan ya sabrán que lo que se me da mejor en cuanto a servidores de metin2 son las quests. Así que aquí estoy... dando un curso a unos cuantos ineptos de lenguaje quest (espero que la palabra inepto la dejemos de lado cuando acabéis este curso, mientras tanto, para mi seréis ineptos xd) para ver si alguien más aprende este lenguaje y dejáis tranquilo al pobre keko xdd A mi parecer, este lenguaje os empezará siendo bastante sencillo. Aún así, esta sencillez puede ir complicándose hasta llegar al punto de que sino entendéis realmente el funcionamiento básico de las quests no entenderéis nada. Aunque, por mucha complicación de una quest, si la analizas detalladamente y entiendes su funcionamiento, cualquier quest puede sernos fácil. Como para eso aún falta mucho, empezaremos por el principio. Algo importante que tenéis que tener en cuenta es que esto no se aprende en un día. Tenemos que recordar que estamos escribiendo en el lenguaje que habla nuestro servidor. El servidor hará lo que nosotros le digamos que haga. Es por eso que es importante que aprendáis a hablar y pensar en lenguaje informático. Ejemplo: 1 - Pienso en levantarme. 2 - ¿Estoy levantado? Si es así, se cancela la acción. Sino, paso al siguiente punto. 3 - Si tengo ganas de andar, pasaré al siguiente punto. Sino, no haré nada. 4 - Acción de levantarse: ¿se ha ejecutado correctamente? Si es así, voy al siguiente punto. Sino, vuelvo al primer punto. 5 - Andar = mover las piernas 6 - Cuando muevo las piernas me desplazo, doy una vuelta y vuelvo a sentarme. 7 - Vuelvo al primer punto. 8 - No sé si entenderéis eso, cuando os vayáis familiarizando entenderéis porqué pongo eso y que utilidad tiene. Creo que lo más lógico antes de aprender algo, es decir que es ese algo. Por eso empezaré definiéndoos lo que es una quest. Qué es una quest? Podríamos decir que una quest es cualquier archivo que utilice el lenguaje quest. Digo "podríamos" ya que no es un lenguaje de programación propiamente dicho. El lenguaje quest es una derivación de LUA (que sí que es un lenguaje informático) con muchas modificaciones con la intención de adaptarlo a Metin2. Es por eso, que si nos fijamos, el servidor utiliza archivos lua. A mi parecer, no es el lenguaje más importante del servidor. Aún así, con este podemos realizar cientos de cosas muy variadas y interesantes. Lo más común de una quest son las típicas tipo trama (ves a tal sitio, haz esto, haz lo otro...) pero las quests dan muchísimas más opciones a parte de eso, me atrevería a decir que eso es lo menos usado. Con las quests podemos crear dungeons (como la Torre de demonios), podemos corregir bugs (como el bug de hp negativo), podemos informar a la gente (por ejemplo, anuncios automáticos),... podría decir muchísimas más cosas pero tengo una guía que acabar Funciones Lo más importante de una quests son las funciones, pues las quests trabajan con ellas, pero ¿qué es una función? Una función es un carácter o grupo de carácter que corresponden a una acción del servidor o sustituyen un código determinado. La función "caminar" (del anterior ejemplo) equivale a mover las piernas con la intención de cambiar de lugar. Si en una quest tuviéramos que desplazarnos (caso hipotético), deberíamos utilizar la función "caminar" para movernos. Pero si tengo que definir una función dentro de nuestro lenguaje quest, lo dividiría en dos partes (sería lo mismo, pero uno más visual que el otro): ·Funciones definidas por el servidor. Serían aquellas funciones que, al ponerlas en nuestra quest, haría una acción. Un ejemplo real, un tipo de estas funciones sería la función "pc.give_item2(19,1)". Al utilizar esta función en una quest, el usuario (al que llamaremos pronto como pc) obtendrá una unidad del objeto con la id 19. Esta función sustituye la acción interna del servidor de dar un objeto al usuario. ·Funciones no definidas por el servidor. Son aquellas funciones que hemos definido a parte, en un archivo que más adelante del curso diremos, o en la propia quest. Estas funciones sustituye a varias acciones del servidor o de lua. Por ejemplo, si tenemos que escribir varias veces en la quest que se muestre en pantalla un mensaje de error, podemos poner estas funciones para ahorrarnos código. En concepto, podríamos pensar que son muy distintas, pero vienen a ser lo mismo. Object - Quest ¿Lo mismo? Lo que es una quest creo que ya lo hemos definido, pero ¿object? El object es lo que lee el servidor. El servidor no reconoce nuestra quest, sino que lee fragmentos de nuestra quest (en lenguaje lua). Existe un compilador que nos transforma nuestras quests y las deposita en la carpeta object para que las lea el servidor. El compilador crea un directorio con unas ids determinadas que corresponden al item, mob, timer... y al interior nos la separa en states y en la acción que se realiza. De esta manera, el servidor puede hacer uso de las quests. Este compilador se llama qc (quest compilator) y se encuentra en el directorio quest de nuestro servidor. Por lo tanto, para implementar las questa tendremos que hacer uso de él. Aquí os dejo un TIP que os ayudará: http://metin2zone.net/index.php?/topic/5-tip-meter-nuevas-quests/ Este capitulo ha sido el más teórico de todos y quizá tenga que añadir más información. Los siguientes capítulos serán más prácticos. Poco a poco empezareis a descifrar todos los secretos de las quests.
  15. Tengo una exactamente igual en mi servidor. Deberías especificar en el post que la quest está traducida con los textos del .es Buen trabajo!
  16. Estoy casi seguro que ese será tu error.Debes compilar el item_proto y mob_proto para que tengan la nueva LZO y los reconozca el cliente. Un saludo!
  17. Hace un rato vi esta guía, aporte (o como queráis llamarlo) que me pareció muy interesante. Se trata de los errores más comunes en la inserción de quests en nuestros servidores (errores de sintaxis, errores de compilación...). Esta guía la veo yo más enfocada hacia los más novatos, pues con la práctica aprendes el significado de estos errores y su solución. Aún así, estoy seguro que muchas personas aprenderán algo que no sabían. RECALCO que esta guía no es creada por mí, sino que tan solo es traducida al español y un poco ampliada con mis conocimientos. Aquí os dejo el post original de .Alessa en elitepvpers: http://www.elitepvpe...fehler-etc.html Bueno, pues vamos al lío xd Antes de empezar: Como esta guía es general para cualquier quest, utilizaremos variables [X]. Es decir, esta variable puede ser diferente en cada caso y substituida por cualquier cosa. 1. when doesn't have begin-end clause Error de sintaxis: when doesn't have begin-end clause. ([X]) [X]:[X]: Error occured on compile [X] Significado: "when" no sigue la estructura begin-end Análisis: Este error se produce cuando el conjunto del "when" no sigue la sintaxis apropiada. Seguramente, la razón de este error es un error de escritura o falta de un "begin". Es también común intercambiar un "begin" por un "then". Debemos recordar siempre que un when sigue la estructura: when [X] begin - end. Corrección: Buscar los "when" en nuestra quest y asegurarnos que sigue la sintaxis apropiada. when [X] begin [acción] end Imagen ejemplo: Imagen ejemplo - solución: Hemos cometido un error de escritura: ha sido intercambiado el "begin" por "begn" 2.`[X]' expected near `[X]' Error de sintaxis: syntax error : [string "[X]"]:[X]: `[X]´ expected near `[x]´ [X]:[X]: Error occured on compile [X] Significado: No ha sido especificado algo requerido por la sintaxis (acostumbra a ser especificado en el lugar de nuestras variables [X]). Análisis: Este error es similar anterior, pero acostumbra a darse en condiciones (if). La sintaxis es incorrecta: el servidor espera encontrar un "then" después de la condición, pero no lo encuentra. Como en el caso anterior, acostumbra a darse por fallos en la escritura o intercambio del "then" por "begin". Corrección: Corregir la sintaxis. Podemos saber aproximadamente donde esta el error por "expected near". Estos errores acostumbran a estar relacionados con los "if". Recordemos que la sintaxis apropiada es: if [X] == [X] then [acción] end *A veces es posible que los operadores estén invertidos. Recuerda que en todos los operadores que utilizamos que contienen más de un signo (>=, <=, !=, ==,...), el último signo siempre es es el "=". Imagen ejemplo: Imagen ejemplo - solución: Hemos cometido un error de sintaxis: el servidor espera encontrar un "then", pero no lo encuentra. La solución sería especificar el "then" junto a nuestra condición. 3. Calls undeclared function! Error de sintaxis: Calls undeclared function! [X] Error occured on compile [X].[X] Significado: El servidor no detecta una función. Análisis: El servidor ha encontrado en nuestra quest una función que no ha sido especificada. Por lo tanto, no posee esa información y no puede realizar ninguna acción. Corrección: Debemos revisar la sintaxis: es posible que la función no esté bien escrita. También debemos revisar que nuestra función se encuentre en el archivo quest_functions (recordemos que si queremos crear una nueva función, debemos crearla en questlib.lua y especificarla en quest_functions para que la reconozca el servidor). Si queremos especificar una función que ha sido escrita dentro de una quest, tenemos que utilizar la siguiente sintaxis: nombredelaquest.nombredelafuncion (en vez de escribir tan solo la función) Imagen ejemplo: Imagen ejemplo - solución: Debemos especificar en el archivo quest_functions la función say_item_vnum 4. assertion failure Error de sintaxis: assertion failure : nested==0 [X]:[X]:Error occured on compile [X] Significado: Estructura equivocada. Análisis:La sintaxis general de la quest no es correcta. Este error puede darse en muchas ocasiones. Por ejemplo, este error se da cuando hay demasiados "end" o falta alguno. Corrección: Revisar que la sintaxis "quest [X] begin" está cerrada con un "end". Revisar que todos los "when" están cerrados con un "end". Revisar que todas las condiciones (if) están cerradas por un "end". Revisar que todos los "state" están cerrados por un "end". Imagen ejemplo: Imagen ejemplo - solución: Nuestro "when" no está cerrado con un "end". 5. expecting state Error de sintaxis: expecting 'state' [X]:[X]:Error occured on compile [X] Significado: Es necesario un state: la estructura de "state" no es correcta. Análisis: Hay un error de sintaxis o es necesario un state. Este error sucede, por ejemplo, cuando un "when" está fuera de un "state". Corrección: Revisar que todos los "when" y "if" están dentro de un state. Revisar que los "state" están bien colocados y cerrados con un "end". Imagen ejemplo: 6. state name not found Error de sintaxis: [X]:[X]:state name not found : [X] Error occured on compile [X] Significado: El servidor no encuentra un "state". Análisis: El uso o búsqueda de un "state" no es encontrado. Este error se da, por ejemplo, cuando utilizamos la función "set_state()" y el "state" definido en esta función no se encuentra dentro de la quest. Corrección: Asegúrate que todos los "state" definidos son correctos, la función que los utiliza está el "state" bien escrito y que todos los "state" están cerrados con un "end". Imagen ejemplo: 7. must start with 'quest' Error de sintaxis: must start with 'quest' [X]:[X]:Error occured on compile [X] Significado: La quest debe empezar con 'quest'. Análisis: Toda quest debe ser iniciada con "quest [X] begin" y cerrada con un "end". Corrección: Asegúrate que la quest empieza con la sintaxis "quest [X] begin". Asegúrate que no hay nada fuera de el bloque "quest [X] begin" - end. Asegúrate que no has cometido un error de escritura en la forma típica de inicio de la quest. Imagen ejemplo: 8. Trying/attempt to compare number with nil Error de sintaxis: Trying/attempt to compare number with nil (se muestra en el Syserr) Significado: Al servidor le es imposible comparar un dato con nil. Análisis: Nil es lo que se le da a algo que no tiene valor. Es similar al 0, es decir, la nada, algo que no existe. Teniendo esto en cuenta, es lógico pensar que el servidor no pueda comparar algo con la nada. Corrección: Revisar que todas las variables o funciones que se comparen (a través de una sentencia if) tengan un valor definido previamente. Y eso es todo. Si os aparece algún otro error relacionado con quest, decírmelo. Ampliaré la guía sin ayuda de Alessa xd Un saludo
  18. Esto no es un questlib, son nuevas funciones totalmente a parte de las funciones del questlib. Deberías haber dejado el archivo lua. Para implementarlo, hay que añadir el nuevo archivo lua (el original se llama questing.lua) y añadir la siguiente línea al questlib: dofile("locale/germany/quest/questing.lua")
  19. Esto es un object (o como queráis llamarlo), es decir, un modelo gr2 para colocar en un mapa. Con solo esto ni mucho menos vais a hacer un mapa. Primero debéis crear el "mapa" en si y colocar el object en él. Y ahora mi pregunta es, si no sabéis lo que es o no estáis seguros, ¿porque lo posteais?... ¿Nos hemos olvidado de esto?:
  20. ElRaulxX

    [QUEST] Auto-Rates

    Buenas gente fea del foro, Os vengo a traer esta quest que hice hace unas semanas y que utilizamos actualmente en el servidor Metin2 Panamera. ¿No estáis cansados que se acaben los rates? ¿Tienes miedo a olvidarte de poner los rates? Esta quest lo soluciona todo Cada 20 horas, el servidor actualizará los rates. El timer pondrá los rates que hayas colocado con una duración de 24 horas (por si las moscas...). Lo único que tienes que hacer es activarlos después de cada reinicio del servidor. También he incluido una función para desactivarlos. Sí, se puede poner una query en el mob_proto para aumentar la experiencia permanentemente pero... creo que todos sabemos que un servidor con rates de evento atraerá mucha más gente que uno sin. -------------------------------------- -- Quest Rates Automaticos ------ -- Creada por ElRaulxX -------------- -- Exclusiva de Metin2Panamera ------ -- y Metin2 Zone -------------- -------------------------------------- quest panamera_rates begin state start begin when 11000.chat."GM: Activar Rates Automáticos" or 11002.chat."GM: Activar Rates Automáticos" or 11004.chat."GM: Activar Rates Automáticos" with pc.is_gm() begin say_title("Guardián:") say("Aquí podrás activar los Rates del servidor.") say("Cada 20 horas se actualizarán. Por lo tanto,") say("ya no vas a necesitar de preocuparte si están") say("activos o no.") say("") say_reward("¿Qué quieres hacer?") local s = select("Activar Rates","Desactivar Rates","Salir") if s == 1 then say_title("Guardián:") say("¿Quieres activar los rates?") local a = select("Si", "No") if 1 == a then say("Los Rates han sido activados.") server_loop_timer("autorates", 20*60*60) __give_empire_priv(0, 1, 100, 24*60*60) __give_empire_priv(0, 2, 200, 24*60*60) __give_empire_priv(0, 4, 200, 24*60*60) end end if s == 2 then say_title("Guardián:") say("Los Rates han sido desactivados.") clear_server_timer("autorates") end end when autorates.server_timer begin __give_empire_priv(0, 1, 100, 24*60*60) __give_empire_priv(0, 2, 200, 24*60*60) __give_empire_priv(0, 4, 200, 24*60*60) end end end Sino sabeis como implementarla, KeKo os lo soluciona en este post: http://metin2zone.ne...-nuevas-quests/ Espero que os sea de utilidad. Un saludo ¡Di NO al copy-paste!
  21. Buenas gente Quiero estrenar mi estancia en el foro con una pequeña y sencilla quest que he echo hace un ratillo. Como sabéis, pertenezco al Panamera y por lo tanto lo mio es el Old Style. Mientras estaba traduciendo alguna quest para conseguir una similitud más grande al Metin2 ES me di cuenta que la quest skillreset2 que todos tenemos es muy antigua. Lo que he echo es actualizarla y hacerla 100% igual a GameForge. Sé que este aporte es muy pequeño y habrá muchos que no lo sabrán apreciar, aun así tengo la esperanza que aún haya gente Old Style. El funcionamiento y los comentarios son calcados al ES. Bueno, pues aquí la quest quest skill_reset2 begin state start begin when oldwoman.chat."Restablecer habilidades" begin if pc.get_level() > 30 then say_title("Anciana:") say("Tu nivel es "..pc.get_level()..". No puedo ayudarte. Con este") say("nivel, no puedes cambiar más tus habilidades.") say("Sólo si estás por debajo del nivel 30 puedes") say("escoger otra habilidad.") return end if pc.get_skill_group() == 0 then say_title("Anciana:") say("¡Todavía no has empezado ningún entrenamiento!") say("Mientras no gastes ningún punto de habilidad, no") say("podrás restablecerlas. Vuelve cuando") say("hayas echo algún error durante tu entrenamiento,") say("entonces sí estaré encantada de ayudarte.") return end local coste = pc.level * 4000 say_title("Anciana:") say("Hola, has venido al sitio correcto. Tus ojos") say("muestran mucho dolor. Permito a las personas") say("olvidar sus habilidades para que puedan empezar") say("de nuevo. ¿Quieres olvidar tus habilidades y") say("empezar de nuevo? Cuesta "..coste.." Yang.") local s = select("Restablecer habilidades","No restablecer") if s == 1 then if pc.money < coste then say_title("Anciana:") say("No tienes suficiente Yang. No puedo ayudarte;") say("necesito el dinero para sobrevivir.") else pc.changegold(-coste) pc.set_skill_group(0) end end if s == 2 then say_title("Anciana:") say("Si cambias de opinión, vuelve a visitarme.") end end end end Y como me sabe a poco, voy a explicaros el funcionamiento de la quest para los que están aprendiendo a hacerlas. La quest empieza con una opción de chat a oldwomen. El npc oldwomen pertenece a a la id 9006, es decir, la anciana. Justo empezar nos encontramos la condición pc.get_level > 30, es decir, si el jugador es mayor de nivel 30 nos mostrará un texto y el when quedará cerrado con el return. La siguiente condición, solo se alcanzará si el jugador no cumple la primera condición, es pc.get_skill_group() == 0. Si el número de las habilidades del jugador es 0, no tiene habilidades, nos mostrará otro texto y el when quedará cerrado con el return. Si el jugador no cumple ninguna de las anteriores condiciones, podríamos decir que puede utilizar la quest. Lo primero que hace la quest es asignar un número a "coste" que será el nivel del pj multiplicado por 4000 (pc.level * 4000). Nos mostrará un texto y una selección. Si seleccionamos la primera opción y la cantidad de yang del usuario es mayor al número que hemos asignado con "coste", nos asignará nuestras habilidades a 0 y nos restará el coste, es decir, podremos volver a elegir habilidades. Pues eso es todo, espero que aprendáis algo con esto los que están iniciando. Un saludo
  22. Esta quest es mía, no cuesta nada poner créditos... En realidad es el típico npc multifunción pero adaptado a quest para reducir problemas. pd: creo que te olvidaste esto... ---------------------------------- -- Quest adaptada por ElRaulxX -- -- para DestroyerMt2 ---------- -- UniversoJuegos.es ---------- ----------------------------------
×
×
  • Crear nuevo...