Jump to content

KeKo

Miembro
  • Contador contenido

    518
  • Ingreso

  • Última visita

  • Días ganados

    74

Todo lo publicado por KeKo

  1. Editado el post con mas info sobre el tema del error de las minusculas
  2. Buenas gente, hacia tiempo que no posteaba nada x mz asi que, aprovechando que me mude hace poquito y tuve que dejar casi todo mi material de metin2 pues coji algunas cosas que pensaba utilizar pero que al final me quedaron sin uso y que ire publicando aver si os gustan. Esta es un arma que tenia pensada para un set llamado set dragoniano así le deje ese nombre, aunq si quereis ponerle otro ponerselo sin problema alguno. Pongo una foto del granny porq en la casa nueva no tengo un local pa entrar y hacerle una foto (La descarga del arma del arma esta en adjunto) Aqui teneis el xml (yo uso de id la de un arma ya en uso, pero vosotros ponedle la que querais): <File archivedPath="d:/ymir work/item/weapon/00110.gr2" type="0"><![CDATA[item_descompilado\ymir work\item\weapon\00110.gr2]]></File> <File archivedPath="d:/ymir work/item/weapon/Metin2Elements/aion_sword6_2.tga" type="1"><![CDATA[item_descompilado\ymir work\item\weapon\Metin2Elements\aion_sword6_2.tga]]></File> Nota: el gr2 va en el item.epk en la ruta ymir work/weapon y el tga va en el mismo epk en la ruta ymir work/weapon/Metin2Elements (es decir teneis que crear una carpeta que se llame Metin2Elements en weapon) Nota2: Recordad que en el xml no puede haber nombres en mayusculas, asi que en el xml Metin2Elements va escrito en minusculas: metin2elements. Y lo siento pero icono no tengo :/ asi que tendreis que hacerle uno. Aun asi os dejo el item_list del arma que uso: 110 WEAPON icon/item/00110.tga d:/ymir work/item/weapon/00110.gr2 111 WEAPON icon/item/00110.tga d:/ymir work/item/weapon/00110.gr2 112 WEAPON icon/item/00110.tga d:/ymir work/item/weapon/00110.gr2 113 WEAPON icon/item/00110.tga d:/ymir work/item/weapon/00110.gr2 114 WEAPON icon/item/00110.tga d:/ymir work/item/weapon/00110.gr2 115 WEAPON icon/item/00110.tga d:/ymir work/item/weapon/00110.gr2 116 WEAPON icon/item/00110.tga d:/ymir work/item/weapon/00110.gr2 117 WEAPON icon/item/00110.tga d:/ymir work/item/weapon/00110.gr2 118 WEAPON icon/item/00110.tga d:/ymir work/item/weapon/00110.gr2 119 WEAPON icon/item/00110.tga d:/ymir work/item/weapon/00110.gr2 sable_dragoniano.zip
  3. No esta mal pero cojiste la de recompensa al 90 que te hice, mi quest de subir P y las juntaste cambiando el nivel xd
  4. Buenas zoneros y zoneras, de nuevo esta aqui el curso de creacion de quests (despues de un pequeño descanso por causas de mucho curro) para ayudaros en vuestro apasionante viaje por el mundo de las quest de metin2. En el capitulo de hoy os voi a hablar un poco sobre los popularmente llamados locales, que sera algo que utiliceis constantemente en vuestras quests. Y para que quiero yo un local? Pues eso tiene sencilla respuesta: un local nos sirve para trabajar con variables. Y aqui os estareis preguntando: um vale keko, pero que es una variable? Pues una variable (como su nombre indica) no es mas que el valor de una funcion que no es siempre el mismo. No me ha quedado muy claro eso, me pones un ejemplo? Venga va, os pondre un ejemplo: pensemos en una funcion que saque informacion del personaje, como puede ser pc.get_level. Esta claro que el resultado que muestre este funcion al recoger el nivel no va a ser siempre el mismo, ya que no siempre seremos un nivel fijo. He aqui entonces un resultado que es una variable, por lo que si queremos trabajar con ese resultado podremos usar un local. Veamos otro ejemplo por si aun no os ha quedado claro, con el más típico de todos los local: el local select local keko = select ("Hola" , "Adios") Ese es un local select de dos opciones. Para que os ambienteis los local select se usan cuando tenemos un dialogo, ya que como es obvio si vamos a hacer escojer entre diferentes opciones el dialogo no sera fijo, si no que tendra una variacion para escojer entre 2 nuevos dialogos que no son fijos, dependen de cada local select que hagamos. Ya voi entendiendo algo, explicame: como se estructura un local? Para usar un local siempre tendremos que escribirlo de la siguiente manera: local nombre = variable En el cual: - local se pone siempre igual. - nombre: ahi ponemos el nombre que queramos a nuestro local (local keko por ejemplo como puse yo arriba) - variable: ahi pondremos la variable con la queramos trabajar (select en el caso de los dialogos o pc.get_level() en el ejemplo anterior) Detalle MUY imporante: Teneis que tener MUY claro que un local no es lo mismo que una condicion, veamos un ejemplo: if pc.get_level() == 1 then local nivel = pc.get_level() Como veis tanto la condicion como el local trabajan con una variable (pc.get_level), pero ojo! hay una diferencia muy grande entre ambos: - La condicion no utiliza la variable, si no que da un valor fijo a la funcion (el nivel debe ser igual a 1) . - El local sí utliza la variable: si nosotros ponemos la palabra nivel en nuestra quest despues del local el resultado que mostrara en el juego sera nuestro nivel (es decir una variable). Y eso se nota en que (como espero que os hayais fijado) la condicion es una comparacion, por lo que lleva un == (que se usa en lua para comparar datos) y el local lleva un = Ya se hacer un local, ahora que hago con el?? Pues resulta que hay momentos en los que os encontrareis con cosas en vuestras quest que seran variables, y no podreis simplemente poner una funcion, veamos algunos ejemplos: quest expnegativa begin state start begin when login begin if pc.get_exp() < 0 then local exper = pc.get_exp() pc.give_exp2(-exper) chat("Anda, tenias exp negativa") chat("pero ya te la puse bien") end end end end En este ejemplo, si nos logeamos con exp menor que 0 (negativa) usaremos el local exper para que recoja la variable de nuestra exp (que como ya sabeis a estas alturas, no es un dato fijo) y lo use para darnos tanta exp como tenemos en negativo pasandola a positivo (es decir poniendole el - al exper ya que - por - es mas) y asi dejarla en 0 otra vez. Como acabo de explicar hemos usado un local ya que si lo hubieramos como pongo aqui abajo no funcionaria, ya que no podemos meter una funcion dentro de otra: y para eso usamos un local como habeis visto arriba. quest expnegativa begin state start begin when login begin if pc.get_exp() < 0 then pc.give_exp2(-pc.get_exp()) -- Linea mala chat("Anda, tenias exp negativa") chat("pero ya te la puse bien") end end end end Ademas, lo bueno que tienen los local es que no tienen que ser siempre una funcion, mirad un ejemplo: quest explicandolocales begin state start begin when 20094.chat."Quiero un local" begin say_title("Quiero un local") say("") say("Hola, si estas leyendo el curso") say("de quests del majo de keko") say(" te estara explicando los local") say("asi que toma este item") say("") local objeto = 27003 pc.give_item2(objeto, 1) end end end Anda! Podemos poner por ejemplo un numero en un local tmbn , pues si! De paso esto me sirve para deciros que no siempre el local es la unica opcion, ya que ahi podria haber puesto simplemente la id 27003 en el pc.give_item2 y no habria problema. Por lo tanto el detalle mas importante que debereis tener en cuenta es el de que no podemos meter una funcion dentro de otra, pero si un local: veamos otro ejemplo para que os quede claro: quest bonus begin state start begin when 70044.use begin local reino = pc.get_empire() affect.add_collect(apply,ATT_GRADE_BONUS,reino*1000, 60*30) end end end Como podeis ver este item es algo racista, dependiendo de tu reino (de nuevo otra variable) te dara mas o menos del bonus de ataque, de la siguiente forma: local reino = pc.get_empire() -- recojemos el dato del reino del pj reino*1000 -- Como veis usamos nuestro local, al ponerlo de esa manera os dara tanto ataque como vuestro reino (1, 2 o 3 que recordar que en quests no hay shinso, chunjoo ni jinno) multiplicado (el * sirve para multiplicar) por 1000 Y de nuevo, si hubierais puesto asi no os habria funcionado. affect.add_collect(apply,ATT_GRADE_BONUS,pc.get_empire()*1000, 60*30) Ya lo entiendo!!! , alguna cosa mas? Pues ahora que ya sabeis como funcionan y como usar los local ya poco me queda por deciros, nada mas que que hay una serie de funciones de quests que solo se utilizan en local como son: local texto = input() Que sirve para que el jugador introduzca un texto (lo que obviamente es una variable, no se va a escribir un mensaje fijo si no lo que ponga el pj). local numero = math.random(1,100) Que sirve para que el juego saque un numero aleatorio comprendido entre 1 y 100 (en este caso, ya que podeis poner los que querais en el parentesis) y que de nuevo es una variable (ya que el resultado va variando cada vez). *Nuestro amigo el local select* local elegir = select ("Me gusta" , "No me gusta") Ya que este es el local mas habitual que vais a usar en vuestras quests voi a centrarme un poco en el: cuando tenemos un dialogo que siempre es igual: say("Hola me llamo keko") say("estoi haciendo un curso de quests") say("que opinas de el?") cada vez que veamos ese dialogo siempre sera ese, mientras que si metemos un local select: say("Hola me llamo keko") say("estoi haciendo un curso de quests") say("que opinas de el?") local pregunta = select ("Me encanta" , "Me mola" , "Me gusta" , "Lo odio") ya no siempre pasara la mismo, el dialogo cambiara (variará, ya tenemos una variable de por medio) dando lugar a diferentes opciones. Ahi hay un detalle importante, vuestros locales (cualquier no solo el select) podeis usarlos para hacer una comparacion cpmo en el caso del select, ya que tenemos que asignar lo que queremos que pase en cada una de las nuevas variantes del dialogo: say("Hola me llamo keko") say("estoi haciendo un curso de quests") say("que opinas de el?") local pregunta = select ("Me encanta" , "Me mola" , "Me gusta" , "Lo odio") if pregunta == 1 then say("asi me gusta!") elseif pregunta ==2 then say("buen chico") elseif pregunta == 3 then say("deberias ponerle mas entusiasmo") elseif pregunta == 4 then say("baneado!") Como veis ahi hago que a cada una de las variantes se les haga una comparacion: if pregunta == 1 then Es decir, si de las opciones que hemos hecho en el dialogo elegimos la primera. Pues esto sirve para todos los locales: local sexo = pc.get_sex() if sexo == 1 then say("eres un tio") elseif sexo == 2 then say("eres una tia") Eso fue un ejemplo, poco a poco tendreis que ir viendo vosotros cuando usar vuestro propios locales. Y hasta aqui ha llegado este emocionante nuevo capitulo del curso de creacion de quests de KeKo y ElRaulxX, estad atentos a nuevos capitulos y recordad: Un saludo, KeKo
  5. Pues viendo siendo un temporizador que salta cada X segundos y dice un mensaje. Para que sea continuo le metio que cuando acabe el timer salte un segundo timer y despues del segundo vuelva al primero y asi constantemente.
  6. KeKo

    Quest mensaje global

    La proxima vez prueba las cosas antes de postear pls :tiocereales:
  7. En quests no puedes usar tildes porque saldran mal al verlas en el juego.
  8. Tienes razón, cuando le arreglé la quest le puse el == 1 pero no se por que lo cambio xd.
  9. Pues la verdad ni mire como tenias la parte anterior a la del problema asi que simplemente intente hacer lo que comentaras xd, pero si asi te iba mejor pos listo Me alegra ver comentarios como el tuyo es un placer compartir conocimiento y entre todos ir haciendo la comunidad cada vez mejor
  10. Pues sí, por desgracia no se pueden encadenar ifs con ands o ors (lo que es una pena la verdad) así que en tu caso yo probaria asi: if pc.count(item1) <=1 say:("te hace falta este item") elseif pc.count(item2) <=2 say:("te hace falta este item2") if pc.count(item3) <=9 say:("te hace falta este item") elseif pc.count(item1) => 2 then if pc.count(item1) =>3 then if pc.count(item) => 10 then say:("recibes estos items:") return end end end say("Lo siento no tienes los items") end No estoi seguro de que funcione que no tengo tiempo ahora para probarla y recuerda que el comando para ver si tienes un item es pc.count_item("item", cantidad) o si estas haciendo comparaciones pc.count_item("iditem") == cantidad.
  11. Buenas zoneros! Despues de unas pequeñas ( :menti: ) vacaciones sin hacer ningún capítulo vuelvo a la carga cn el curso de creación de quests. El capítulo de hoy es especial, ya que no sigue el recorrido que estamos haciendo raul y yo a la hora de enseñaros a hacer quests de metin2. Os hemos estado enseñando qué es una quest, como se estructura, cuales son los elementos que la forman, etc pero nos faltaba contaros un poco sobre las acciones que realiza una quest. Por lo tanto esta vez os explicaré como se utilizan unas cuantas funciones que usareis con mucha frecuencia mientras hagais quests básicas de metin2. Antes de nada: Qué es una función en una quest? Como tengo dicho en este curso: Por lo tanto: Una funcion es una accion que se desarrolla en una quest. Si lo pensais de esta manera, los otros elementos de una quest son como preposiciones, adverbios, etc que ayudan a enlazar o condicionar las funciones: que son como los verbos dentro del lenguaje de las quests (si os fijais la funcion say es como pensar en el verbo decir). En la lengua hay muchos verbos, hay muchas funciones de las quests tambien?? Por supuesto! La cantidad de funciones que nos permite utilizar un game de metin2 es enorme, y es como la tabla periódica de los elementos: os puede acojonar diciendo que hay que saberselos todos, pero no es necesario saberselos todos, sino entender como funcionan (saberse unos cuantos claros) y mediante la práctica y la revision de otras quests aprender a utilizarlos. Y cuando estoi haciendo una quest que funcion debo usar?? Eso depende de la quest, si tu quieres hacer una quest en la que un npc te habla pues usarás la funcion say, si quieres dar un item a un personaje utilizarás la funcion pc.give_item2, etc Cada quest es un mundo, pero vereis que hay una serie de funciones que se suelen utilizar con mas frecuencia. Por lo tanto, me dejo de explicaciones y vamos al rollo Funciones habituales y como utlizarlas: Funciones numero 1 - Say , chat y notice_all: La que para mi es la funcion más utilizada de todas es la funcion: say Esta funcion nos permite que el personaje que está jugando a nuestro servidor vea un diálogo en su pantalla, ya sea un diálogo empezado por un item, por un npc, en un momento concreto (logeandote, siendo cierto nivel, entrado a cierto mapa...). El funcionamiento básico de la funcion say es el siguiente: say("Texto") Como veis ponemos la funcion say, luego abrimos un partentesis y entre " " ponemos el texto que queremos que se vea en el juego. Ojo! Si se os cuela alguno de los " " al principio o al final del texto, la quest no irá correctamente. Cada vez que que pongais otro say os pondra la nueva linea debajo de la anterior, es decir: say("Hola keko") say("estas enseñando a usar el say") Este texto tendra 2 lineas, la primera dirá: hola keko, y la segunda estará justo debajo de la primera y dirá: estas enseñando a usar el say. Un pequeño detalle: cuando usamos un say es como cuando escribimos en una libreta, no podemos escribir infinitamente, sino que cada linea tiene una cantidad de letras en las que pasa a la siguiente linea aunque no pongamos otro say. Lo bueno es que el zonero Elite ha compartido un archivo para el root de vuestro cliente que os permite alagar ese número de palabras, y aqui lo teneis en el spoiler por si quereis ponerlo en vuestro cliente, si no tened en cuenta que muchas palabras en un say harán que se escriban en varias lineas. Ahora otro detalle: si queremos dejar una linea en blanco (seria como darle a enter si escribieramos normal) simplemente tendreis que poner un say sin nada dentro, de esta manera: say("") Es algo que yo os aconsejo como creador de quests, ya que quedan mucho mas ordenado un diálogo con espacios entre párrafos, y aunque puedes ponerlo todo seguido siempre queda más bonito esteticamente. Otra cosa a tener en cuenta es que hay varios tipos de says, que son los siguientes: say_title("Curso de quests: Capitulo especial") - El say_title nos permite escribir (como dice su nombre) el título de un diálogo, que se distingue porque sale de color blanco en la quest. say_reward("Enseña a metin2zone como usar el say") - El say_reward significa literalmente que es un say para una recompensa, y si lo ponemos en nuestra quests se verá de un color mas oscuro que el resto del diálogo. say_red("Metin2Zone curso de quests") say_blue("Metin2Zone curso de quests") say_yellow("Metin2Zone curso de quests") - El say_color se utiliza si antes habías añadido al questlib de vuestro servidor la libreria de BlackYuko que hace que las funciones say_red/blue/green/etc enlacen con la funcion que permite cambiar el color de un say y así poder ver en nuestros diálogos lineas de diferentes colores. En el spoiler teneis el post de BlackYuko por si quereis usar says en colores. Por último, puede haber casos en los que querais mostrar una variable en un say (el siguiente capi habla sobre las variables no os preocupeis si no os enterais mucho) lo hareis de la siguiente manera: say("Hola, me llamo "..pc.get_name().."") Como veis, para mostrar la variable del nombre teneis que ponerlo entre ".. .." con la funcion que quieres mostrar como texto entre ellos. La funcion chat funciona igual que la funcion say, pero simplemente os saldrá el dialogo escrito en la barra de chat en vez de una ventana. chat("Hola") Por ultimo otra funcion muy comun es la de notice_all("Texto"), que escribira el dialogo como si un gm hablara poniendo /n notice_all("Tonto el que lo lea") Esta funcion tiene una variante que es notice_in_map, que no se utiliza mucho pero que hace lo mismo que un notice_all pero solo en el mapa en el se activa el dialogo. quest ejemplo begin state start begin when 70045.use with pc.get_map_index() == 103 begin notice_in_map("los que esteis en este mapa me leereis") end end end Os habreis quedado pensando: tanto rollo para aprender a usar el say??? Pues sí, por mucho que parezca la funcion más básica tiene sus detalles que es bueno saber para utlizarla lo mejor posible. Funciones numero 2 : Los pc.algo En la ultima parte de la explicacion del say os habreis fijado (espero) que he usado la funcion pc.get_name() para explicaros como mostrar eso en una quest. Pues hay una serie de funciones que afectan al personaje al que va encaminada la quest: ya sea para cojer información del jugador al que afectan, para poner una condicion al personaje, o para añadir algo informacion al personaje. Esta serie de funciones son las que llamaremos pc.algo y son muy variadas (asi que solo os contaré como funcionan algunas que usareis habitualmente) - pc.get_name() , pc.get_level() , pc.get_empire() , pc.get_map_index() , pc.get_hp() , pc.get_sp() , pc.get_exp() , pc.get_job() , pc.get_sex() , pc.get_local_x , pc.get_local_y , etc : Cada una de estas funciones nos proporciona informacion del personaje al que afectan y en el orden en el que están: nos dan su nombre, nivel, reino, mapa en que esta, cantidad de hp, cantidad de sp, de exp, profesion (cuerpo/magia negra, etc) , sexo , cordes x en la que se encuentra y cordes y en las que se encuentra. Para usarlas simplemente debereis escribirlas asi como las puse. Ojo! No os olvideis nunca del parentesis en funciones que lo necesitan, o no funcionaŕan (pc.get_map_index == 240 esta mal escrito, tiene que ser pc.get_map_index() == 240). Se utiliza para 2 cosas: comparar el nivel del pj con el nivel que queramos a la hora de hacer una condicion, o para mostrarlo en un diálogo (recordad que es entre ".. .." en el segundo caso). Veamos ejemplos de algunas de ellas. quest nombre begin state start begin when login with pc.get_hp() <= 0 begin chat("jajajajaja estas muerto") end end end quest nombre2 begin state start begin when login begin chat("Bienvenido al servidor "..pc.get_name()..", que lo pases bien") end end end quest item begin state start begin when item.use begin if pc.get_empire() == 1 then notice_all("Soi del reino shinsoo") elseif pc.get_empire() == 2 then notice_all("Soi del reino chunjoo") elseif pc.get_empire() == 3 then notice_all("Soi del reino jinno") end end end end quest exp begin state start begin when login with pc.get_exp() < 0 begin local exppj = pc.get_exp() chat("Anda tienes exp negativa") chat("te la pondre en 0 otra vez") pc.give_exp2(-exppj) end end end quest nivel begin state start begin when levelup begin chat("Has subido a nivel "..pc.get_level()..", enorabuena") end end end Bien creo que ya os haceis una idea de como va la cosa, pasemos a otras funciones del tipo pc.algo muy utilizadas: - pc.give_item2("iditem" , cantidad) , pc.remove_item("iditem", cantidad) , pc.count_item("iditem", cantidad) : Otras de las funciones mas utlizadas de todas. Estas funcione nos permite dar un objeto, quitar un objeto o comprobar si tiene un objeto el jugador al que afecte la quest. La forma de escribir esta funcion es la que pongo ahi: especificando en el parentesis la id del item y la cantidad del mismo. Veamos algunos ejemplos: quest toma begin state start begin when 20095.chat."Regalitooo" begin say("Hola feo, quieres un item?") say("") local regalo = select ("Si" , "No") if regalo == 1 then pc.give_item2("27003", 200) -- aqui esta el que nos interesa chat("toma potas!") elseif regalo == 2 then return end end end end quest curso begin state start begin when 70044.use begin pc.give_item2("71042", 1) pc.remove_item("70044", 1) end end end quest hola begin state start begin when 20095.chat."Condiciones" begin if pc.count_item("27003") < 200 then say("Vaya no tienes lo que quiero") say("vente otro dia") return end say("Yupi tienes mis potas!") say("me las quedo y te doi unas peores muajaja") pc.remove_item("27003", 200) pc.give_item2("27002", 200) end end end Vamos con otras funcion muy habituales: - pc.warp(cordesx , cordesy) : Esta funcion nos permite llevar a un personaje a unas cordes concretas, que debemos especificar en el parentesis, poniendo al final de las cordes los dos ceros tipicos de un atlasinfo. quest porterdemano begin state start begin when 70045.use begin say_title("Porter") say("") say("Nos vamos a otro mapa?") local port = select ("Vale" , "Paso") if port == 1 then pc.warp(510400 , 408800) elseif port == 2 then return end end end end - pc.mount(idmontura, tiempo) : Esta funcion os servira para montar al personaje en un mob (que se suele ser uno que se pueda montar xd). Debemos poner en el parentesis la id de la montura y el tiempo que queremos que esté montado. Nota: el tiempo se puede escribir en segundos o multiplicando. Si lo hacemos en segundos pues ponemos por ejemplo 60 y durará un minuto, y si lo hacemos multiplicando 60*5 son 5 minutos, 60*60*5 son cinco horas y así. quest montura begin state start begin when 70044.use begin pc.mount(20110, 60*30) pc.remove_item("70044" , 1) end end end - pc.change_money(cantidad) y pc.give_exp2(cantidad): Estas dos funciones os sirven para dar yang (change_money) o exp a un personaje (give_exp2). Para usarlas simplemente debeis poner entre el parentesis la cantidad de yang o exp que quereis dar al personaje quest famoso begin state start begin when 20094.chat."Soi famoso" begin say_title("La fama") say("") say("Si quieres hablarme") say("tendras que darme 500k") local fama = select ("Lo hare" , "Paso") if fama == 1 then pc.change_money(-500000) say("Ala, ya hablaste conmigo") elseif fama == 2 then return end end end end quest expmas begin state start begin when 70042.use begin pc.give_exp2(100000) pc.remove_item("70042", 1) chat("Toma exp!") end end end - pc.is_gm() , pc.is_dead() , pc.is_guild_master() , pc.is_polimorphed() : Este tipo de funciones os permiten que tenga lugar la accion si el personaje cumple lo que dice la funcion, como puede ser ser gm, estar muerto, ser jefe de gremio, estar polimorfado, etc quest gm begin state start begin when login with pc.is_gm() begin chat("Bienvenido a tu servidor gm") end end end quest caballo begin state start begin when 70045.use begin if pc.is_polymorphed() then chat("No puedes montarte a una montura polimorfado") return end pc.mount("20111", 60*60*60*60*5) end end end Y por supuesto hay muchas mas funciones que afectan a un personaje, pero tendreis que ir descubriendolas y probandolas :yaoming: , yo solo os dire algunas. 3 - Funciones varias: Veamos ahora algunas funciones que no son diálogos ni pc.algo: - mob.spawn(mob, cordesx, cordesy, cantidad) : Con esta funcion podreis invocar un mob en el mapa en el que os encontreis en unas cordes concretas. Para usarla ponemos la id del mob, las cordes x, las cordes y y la cantidad de ese mob. quest itemmaldito begin state start begin when 70042.use begin chat("Ha aparecido un monstruo en el mapa") mob.spawn(1903, 340, 250, 1) pc.remove_item("70042" , 1) end end end - affect.add_collect(apply.bonus,cantidad,tiempo) y affect.remove_collect(apply.bonus,cantidad,tiempo): Estas dos funciones os permiten dar un bonus a un personaje, durante un tiempo determinado y quitarselo. Para usarlas pondremos en el parentesis el nombre que el bonus tiene en la tabla item_attr o item_attr_rare del navicat, la cantidad, y el tiempo (como explique antes) que durará. Si quereis que deje de tener efecto el bonus antes del tiempo estipulado pondreis la funcion igual pero con affect.remove en vez de affect.add. quest fuerza begin state start begin when 70072.use begin affect.add_collect(apply, ATT_SPEED, 15, 60*15) chat("Has ganado 15% de velocidad de ataque") chat("durante media hora, aprovechala") end end end - horse.summon() , horse.unsummon(), horse.set_level("nivel") , horse.advance() , horse.ride(), etc: Las funciones tipicas de un caballo, como son las de invocarlo, mandarlo al establo, subirlo a un nivel concreto , subirlo un nivel o montar el caballo. La funcion de ponerle un nivel debe llevarlo en el parentesis: quest librocaballo begin state start begin when 50053.use begin horse.summon() horse.ride() end end end - pc.setqf y pc.getqf, game.set_event_flag y game.get_event_flag : Estas 4 funciones son muy comunes pero tendrán sus capítulos aparte explicando su funcionamiento. Como veis hay muchisimas funciones y aqui solo os he explicado unas pocas, si quereis saber todas las que hay yo suelo mirarlo en este post: Y bueno eso es todo amigos!! El mundo de las quest se os va desvelando cada vez más, espero que ahora ya podais hacer mejor vuestras quests y preparaos porque va a haber un examen!! :trolldad: Y por terminar, recordad!! :pokerface:
  12. Lo que tienes que hacer con esos 2 archivos es meterlos en la carpeta pack de tu clientee. Luego Buscas en la carpeta pack un archivo llamado Index, lo abres con un editor de texto, vas al final del archivo, le das a enter, escribes un asterisco (*), le das a enter otra vez y escribes el nombre del archivo .epk (zaiarmaduras).
  13. Problema resuelto via skype . Recordad que en un xml nunca debeis poner nombres de rutas o texturas en mayusculas porque no las lee.
  14. Yo solo arregle tal y como la tenias, no toque nada mas sobre el funcionamiento de la quest pensando que la tendrias bien, pero ya lo edite otra vez para que solo la puedas matar durante la mision.
  15. Esque no dije que fuera dificil, es más mi quest de almacen ideal es simplemente: when item.use begin game.open_safebox() Así te ahorras dialogos y menus.
  16. Ya te la edité en el post para que vaya bien
  17. Tienes un fallo en la linea de cuando hablas con el npc tras matar al monstruo, ya que el comando with mob.kill no es lo que quirres usar ahi. Seria en todo un .is_dead() Pero lo mas comodo en este caso es hacer una linea asi: when mob.kill begin pc.setqf("muerte", pc.getqf("muerte") + 1 end Y luego cuando hables con el npc: when npc.chat."dialogo" with pc.getqf("muerte") == 1 begin
  18. sip este lo hice ants de lo normal porque mañana no estare en todo el dia
  19. Buenas zone! De nuevo tras otro emocionante capítulo del curso brindado por el gran raul es mi turno de seguir con el curso. El capítulo de hoy tratará sobre las condiciones en las quests, lo que popularmente conoceis todos como usar if en una quest. Esta vez también nos vamos a centrar en el cuerpo de una quest, y como mi colega raul empezare con la estructura básica de un if. Recordad esto primero: De nuevo la idea es la misma que con los whens: Por lo tanto la estructura es asi: if [X] then accion end Como veis cada if le corresponde un end y para que nos os de error al cargar tiene que ir un then al final del if, si no os saltara este error: Bien si ya tenemos claro la estructura vamos a profundizar un poco en el uso de las condiciones. Lo primero de todo me gustaría hacer una pequeña distinción entre varios tipos de condiciones: - Condiciones simples: Son aquellas que solo tienen un unico if (con sus posibles elseifs). - Condiciones compuestas: Son aquellas que se dan en las quests en las que si superamos la primera condicion se nos pone otra condición. Ojo! Son 2 condiciones diferentes, que llevan dos if y dos ends. - Condiciones opuestas: Que son las que usan habitualmente un else, o si no un return+end (ya os explicare como funcionan en el capi), y que son aquellas en las que ponemos una condicion y lo que pasara si se cumple lo contrario a esa condicion. Bueno vamos aver un pequeño ejemplo de una quest que usa una condicion: quest capicuatro begin state start begin when login with pc.get_map_index() == 41 begin if pc.get_empire() == 1 then say("No estas en el mapa de tu reino") end end end end Hasta aquí todo bien no? Como veis es una quest que se activa si te logeas en el mapa de city1 de jinno, pero te pone la condicion de que si eres del reino 1 (shinsoo) te aparece un mensaje diciendo que no estas en el mapa de tu reino. Respecto a los ends, como hay un if lleva un end y los otros tres son del when y de la apertura. Por lo tanto hagamos un resumen: cuando quieres poner una condicion en una quest primero pones el when [X] begin al que queremos ponerle la condicion, luego escribimos la condicion en si, la accion que se realiza una vez cumplida la condicion y el end. if [X] then accion end Ahora pongamos otro ejemplo con esta misma mision pero ya con algunos elseif: quest capicuatro begin state start begin when login with pc.get_map_index() == 41 begin if pc.get_empire() == 1 then say("No estas en el mapa de tu reino") elseif pc.get_empire() == 2 then say("No estas en el mapa de tu reino") elseif pc.get_empire() == 3 then say("Estas en el mapa de tu reino!") end end end end Ahora ya tenemos 3 condiciones, pero como os fijais solo 1 lleva if, ya que son continuacion de la primera y por lo tanto solo llevan un end por las tres. Y también otro ejemplo del uso de un elseif, con un local select que es cuando mas vais a ver un elseif: quest capicuatro begin state start begin when 70042.use begin say_title("Tienda portatil") say("Con este objeto podras comprar") say("Potas donde quiera que estes.") say_reward("Quieres algunas?") local tienda = select ("Potas rojas" , "Potas azules" , "Superpotas" , "Cerrar") if tienda == 1 then say("Toma 200 potas rojas") pc.give_item2("27003", 200) pc.change_money(-30000) elseif tienda == 2 then say("Toma 200 potas azules") pc.give_item2("27006", 200) pc.change_money(-45000) elseif tienda == 3 then say(" Usted ha sido trolleado") say("no hay superpotas") elseif tienda == 4 then return end end end end A estas alturas ya os habreis dado cuenta de como funciona el uso de un elseif: if [X] then accion elseif [X] then accion elseif [X] then accion end Al igual que cuando usabamos un solo if, ponemos el when [X] begin, luego la condicion if [X] then y esta vez las otras posibilidades que queremos que haya unidas al primer if [X] then (podemos poner las que queramos) con la estructura elseif [X] then. Por último cerramos el if con un end. Vayamos ahora a un caso de condicion compuesta, por ejemplo un teletransportador para un mapa: quest capicuatro begin state start begin when 20095.chat."Teleporter" begin if pc.get_level() < 50 then say("Lo siento eres muy bajo") say("vuelve cuando seas mas lvl") return end if pc.count_item("50084") == 0 then say("Valla, no tienes sello") say("Asi que no puedes entrar") return end if pc.get_map_index() == 190 then say("No puedes ir al mapa nuevo") say("Si ya estas en el") return end say("Pues lo siento ahora no quiero") say(" llevarte al mapa nuevo.") end end end Ahora en vez de usar condiciones unidas a la primera (el if [X] then) ponemos diferentes condiciones, cada una de estilo if [X] then y con su respectivo end. Usando las condiciones compuestas conseguimos que para llegar a la accion propia del when [X] begin haya que ir cumpliendo cada una de las condiciones. Es decir, si cumplimos la primera condicion el juego mirará aver si cumplimos la segunda. Si no cumplimos la segunda no se ejecutará, y si la cumplimos mirará aver si cumplimos la tercera. Si cumplimos todas las condiciones, la accion principal se ejecutará. Otra cosa a tener en cuenta es que podemos meter condiciones dentro de otras condiciones, y para eso os pondré un ejemplo en el que mezclaré condiciones simples con condiciones opuestas (hare mas compleja la quest de antes de las potas): quest capicuatro begin state start begin when 70042.use begin say_title("Tienda portatil") say("Con este objeto podras comprar") say("Potas donde quiera que estes.") say_reward("Quieres algunas?") local tienda = select ("Potas rojas" , "Potas azules" , "Superpotas" , "Cerrar") if tienda == 1 then if pc.gold < 30000 then say("Vaya no tienes suficiente dinero") return end say("Toma 200 potas rojas") pc.give_item2("27003", 200) pc.change_money(-30000) elseif tienda == 2 then if pc.gold < 45000 then say("Vaya no tienes suficiente dinero") return end say("Toma 200 potas azules") pc.give_item2("27006", 200) pc.change_money(-45000) elseif tienda == 3 then say(" Usted ha sido trolleado") say("no hay superpotas") elseif tienda == 4 then return end end end end end Ahora hemos metido una condición dentro de otra: primero metemos la condicion de elegir la opcion 1 (la de potas rojas) y luego dentro de esa hacemos que el juego mire si tenemos 30k para comprar las potas. Os habreis fijado que ahi usamos una condición opuesta: if pc.gold < 45000 then say("Vaya no tienes suficiente dinero") return end say("Toma 200 potas azules") pc.give_item2("27006", 200) pc.change_money(-45000) Ponemos la condicion: if pc.gold < 45000 then Luego lo que pasa si la cumplimos: say("Vaya no tienes suficiente dinero") Y para cerrar la condicion ponemos: return end De esta manera, lo siguiente que pongamos se cumplirá EN CUALQUIER CASO EN EL QUE NO CUMPLAMOS LA CONDICION ANTERIOR. Y como veis si tenemos mas de 45k de yang (es decir, no cumplimos la condicion) pues nos da las potas: say("Toma 200 potas azules") pc.give_item2("27006", 200) pc.change_money(-45000) Para acabar me gustaría hablarlos de la palabra else. Esta palabra se utiliza para hacer una condicion opuesta, ya que implica que si la cumplimos estará pasando cualquier cosa contraria a la de la condicion anterior. Veamos un ejemplillo, y os recalco que UN ELSE NO TIENE QUE LLEVAR SU CORRESPONDIENTE END. quest capicuatro begin state start begin when 70044.use begin if pc.count_item("70042") == 0 then pc.give_item2("70024", 1) chat("Toma un 5o bonus") pc.remove_item("70024" , 1) else say("Lo siento pero ya tienes") say("el 5o bonus") end end end end En este caso la condicion primera es que no tengamos ningun 5o bonus en el inventario, y si no la cumplimos (es decir, si que tenemos 5o bonus) pues nos dice que ya lo tenemos. Como usamos un else no especificamos una cantidad de bonus que tenemos que tener, si no que en cualquier caso contrario a que no tengamos ninguno nos dirá que sí lo tenemos. Y bueno eso es todo en el capítulo de hoy, espero que lo hayais disfrutado y que os ayude a la hora de hacer nuevas quests .
  20. Buena raul, me gusto el guiño (no se si alguien se habra fijado) a los programadores novatos para los que tan aprendiendo lua xd: Que es lo tipico que hace una persona cuando aprender a programar, un programa que diga Hello World. P.D: Siguiente capi me toca a mi.
  21. Buenas zone! Llega el segundo capítulo del esperado curso de creacion de quests. Tras un primer episodio lleno de aventuras, romance e intriga en esta entrega os voi a explicar como se estructura una quest. Antes de nada recordaré las palabras de un sabio llamado raul sobre: qué es una quest? Y además tened esto en mente siempre durante este capítulo. Lo primero de todo cuando vas a hacer una quest es crear el archivo de la quest en si. Como es un archivo de una quest debe tener la extension .quest, para lo que le damos a boton derecho -> nuevo -> documento de texto y una vez creado el archivo. txt le cambiamos el nombre a .quest. Bueno, después de esta ardua tarea nos encontraremos cara a cara con un archivo en blanco en el que tendremos que vertir nuestras ideas para que se convierta en una quest hecha y derecha. Voi entonces a explicaros como se estructura una quest estándar para que sepais como enfrentaros a nuestro terrible enemigo durante todo el curso: la quest en blanco. Una quest se divide en 3 partes que podreis distinguir fácilmente: - Apertura: Son siempre las 2 primeras lineas de una quest. - Cuerpo: Es lo que podriamos llamar la quest en si, ya que es la parte de la quest que contiene todas las cosas que queremos que haga la quest. - Cierre: Son siempre ends (a los que dedicare un apartado especial en este capitulo) que hacen que nuestra quest acabe correctamente. Vamos a hablar ahora en profundidad de cada una de estas partes: 1 - La apertura: La primera parte de una quest es la que llamaremos apertura a lo largo del curso (ya parezco un profesor ) y que como dije arriba son siempre las dos primeras lineas de una quest. Veamos un ejemplo de como se debe hacer una apertura: quest capidos begin state start begin Bien, ahora vamos a centrarnos en qué hace cada una de esas dos líneas: quest capidos begin La linea más básica de toda una quest, simplemente manda la orden de que comience la quest. *Desmitificando las quests v1: Se que mucha gente tiene la creencia pagana de que el nombre que va despues de quest en la primera linea de la apertura tiene que ser el mismo que el nombre del archivo .quest PERO ES MENTIRA!! El nombre que ponemos ahi puede ser el que nos apetezca, ya que simplemente es lo que el juego al cargar la quest para ver que está empezando una. Bien, ahora la segunda linea: state start begin Esta linea lo que hace es que comience el estado "start" , es decir: que podemos empezar a escribir nuestra quest. *Es muy importante que sepais que este estado va a continuar activo hasta el final de la quest, a expecion de casos en los que usemos otros estados aparte del inicial (en lo que profundizará raul en el capítulo de los estados). Esto es todo sobre la apertura, espero aver resuelto dudas y enseñado algo que no sepais, y si no lo habreis leido pa na 2 - El cuerpo de una quest: Ahora que ya hemos mandado la orden de que la quest comience (primera linea de la apertura) y hemos activo el estado de start (para poder empezar a escribir quest) nos toca elaborar nuestra quest para hacer eso que queríamos hacer para dejar de ver la temible quest en blanco. quest capidos begin state start begin De momento tenemos esto, pero ahora queremos hacerlo más digo yo, no? Pues sí! Me remitiré de nuevo a la cita de mi colega raul: Como veis, cuando pensamos en lenguaje de quest nos planteamos hacer una acción y por lo tanto en el cuerpo de una quest puede suceder varias cosas: - Que una accion comience. - Que pongamos una condicion para que una accion se desarrolle. - Que una accion se desarrole. - Que comprobemos que una accion se esta desarrolando. - Que una accion termine. Es por eso que en el cuerpo de una quest vamos a usar una serie de operadores logísticos que nos permitiran desarrollar nuestra quest, y que son los siguientes: when while with and or if elseif else > < >= <= == ~= De ellos: * when y while sirven para comenzar acciones. * with and or if elseif y else sirven para poner condiciones. * > < >= <= == ~= sirven para hacer comprobaciones entre acciones. Primero veremos un ejemplo sencillo de quest que te pone un mensaje en la barra de chat cuando te logeas: quest capìdos begin state start begin when login begin chat("Bienvenido al servidor, pasalo bien") Como veis tenemos apertura, la orden de que comience una accion cuando nos logeemos y luego la accion que se desarrola cuando nos logeamos. Vamos a ver ahora mas fondo esto con un ejemplo de quest que envia un mensaje a todos cuando un nuevo pj comienza el juego: quest capidos begin --- Lineas de apertura state start begin when login with pc.get_level() == 1 begin ---- Linea con orden de comienzo, condicion y comprobacion notice_all("Hay un nuevo personaje en nuestro servidor") --- Linea con la accion Como veis empieza con la apertura. Luego tenemos una orden para comnenzar una accion: en este caso la accion comenzará cuando nos logeemos con un personaje. when login Y este comienzo además tiene una comprobación antes de que se desarrolle la accion: with pc.get_level() == 1 En este caso no solo llega con que nos logeemos con un personaje, ya que tiene que además ser nivel 1, porque tenemos una orden de login, pero con la orden with seguida de una funcion: pc.get_level() y como veis un == que sirve para comprobar que el valor del nivel del personaje es igual a 1. when login with pc.get_level() == 1 begin Y ahi ya está todo entero. Como veis una vez echa la orden de comenzar la accion cuando nos logeemos, con la condicion de que el personaje sea nivel 1 ponemos la orden begin, para que comience la accion. Por último simplemente ponemos la accion que se va a desarrollar: notice_all("Hay un nuevo personaje en nuestro servidor") Bien, creo que ahora ya vais entendiendo como va el cuerpo de una quest, quedaros con el dato de que siempre habrá una orden que haga que comience una mision, ya sea con el when, while, if.... y luego despues de especificar que tiene que pasar para que comience la accion usaremos funciones de quest para desarrolar esa acción. Bueno pues ahora ya tenemos nuestra accion desarrolandose, pero que hacemos con ella? Como las acciones no pueden ser eternas tenemos que acabarla, y para eso usaremos la palabra end, que indica que la accion termina. ---------------------------------------------------------------------------------------------------------------------------------------------------------------- *Apartado especial, nuestros amigos los ends: Como muchos sabeis uno de los errores más comunes a la hora de hacer quests es poner o bien ends de más o bien ends de menos, lo que hará que nuestras quests no funcionen. Por lo tanto antes de nada parémonos a pensar en que es lo que es un end. Procediente del inglés la palabra end es un verbo que significa terminar, lo que no nos puede dejar más claro cual es su función en una quest: terminar una acción. Por lo tanto cada vez que tengamos una accion tendremos que ponerle un end al final para acabarla. Y de que manera vamos a hacer eso? Os lo diremos en el proximo capitulo , na en serio, asi funcionan los ends: - Por cada begin que tengamos en nuestra quest nosotros le colocaremos un end. - Por cada if que haya en la quest pondremos un end. Veamos algunos ejemplos: when login begin chat("Hola") end when 105.kill begin say("Has matado un lobo") end when 20095.chat."Hola" begin say("Buenas") end Por cada begin corresponde a un end if pc.count_item("50084") == 1 then say("Veo que tienes la llave") end En este caso hay un if asi que ponemos un end *Desmitificando las quest v2: Mucha gente comete el error de pensar que si ves un elseif como lleva la palabra if pues debe tener un end también, pero NO!!! Y es porque un elseif es una continuacion de una condición y no una nueva condicion Ejemplo: local s = select ("opcion1" , "opcion2" , "opcion3) if s == 1 then say("Has clickado en la opcion 1") elseif s == 2 then say("Has clickado en la opcion 2") elseif s == 3 then say("Has clickado en la opcion 3") end Como veis solo hay un end, el correspondiente al primer if. ------------------------------------------------------------------------------------------------------------------------------------------------------------------ Bien ahora que ya conocemos mejor a los ends (de los cuales os seguiremos hablando en posteriores capitulos) ya podemos acabar el cuerpo de nuestra quest, cerrando la accion que habeis comenzado. quest capidos begin --- Lineas de apertura state start begin when login with pc.get_level() == 1 begin ---- Linea con orden de comienzo, condicion y comprobacion notice_all("Hay un nuevo personaje en nuestro servidor") --- Linea con la accion end --- End correspondiente al begin de la linea 3 Pero los listos os habreis dado cuenta de que en nuestra quest quedan 2 begins (de la apertura) que no tienen su end y eso lo voi a explicar ahora en la ultima parte de la estructura de una quest. 3 - Cierre de una quest: Cada vez que acabemos una quest vamos a tener que poner dos ends para cerrar la quest, y os estareis preguntando, y porque??? Pues la explicacion es esta: state start begin Os acordais de la apertura? Si lo haceis os acordareis de que para hacer una quest tenemos que hacer un estado de comienzo (state start), que logicamente acabara cuando acabe la quest. De ahi viene el primer end del cierre de una quest. *Detalle importante: algún espabilado habrá visto quests en los que se usan otros states aparte del start. En eses casos el cierre solo lleva un end (el que explico abajo) ya que acabaremos el start antes de lo normal para poner nuestro nuevo estado (para mas info sobre estado atentos al capítulo dedicado a ellos que hará raul). Y ahora el segundo end del cierre: quest capidos begin De nuevo dire si os acordais de la apertura (que espero que os acordeis ) sabreis que cada quest empieza con esa orden, y como os fijareis tiene un begin al final por lo que le corresponde un end, pero no se lo podemos poner en cualquier momento, ya que (me quoteo a mi mismo): Es decir, si acabamos la accion de que comience la quest, acabamos la quest (genial deduccion). Siguiendo este hilo de deduccion os habreis dado cuenta de que es por eso por lo que el end correspondiente al begin del quest nombre begin siempre va al final de la quest. Y ahora ya podemos ver nuestra quest completa y lista para cargar quest capidos begin --- Lineas state start begin ----- de apertura when login with pc.get_level() == 1 begin ---- Cuerpo de la quest notice_all("Hay un nuevo personaje en nuestro servidor") --- Cuerpo de la quest end --- End correspondiente al begin de la linea 3 --- Cuerpo de la quest (end correspondiente el when login begin) end --- Cierre del state end --- Cierre del quest begin Y eso es todo por el capítulo de hoy, espero que lo hayas disfrutado y pronto llegará el 3er episodio de manos de raul.
×
×
  • Crear nuevo...