Jump to content

izaviona

Miembro
  • Contador contenido

    75
  • Ingreso

  • Última visita

  • Días ganados

    2

Actividad de reputación

  1. Me Gusta
    izaviona reacted to KeKo in Capitulo IV - Profundicemos en las condiciones   
    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 .
  2. Me Gusta
    izaviona reacted to ElRaulxX in Capítulo III - Profundicemos en los Whens   
    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!
  3. Me Gusta
    izaviona reacted to KeKo in Capítulo II - Estructura de una quest   
    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.
  4. Me Gusta
    izaviona reacted to ElRaulxX in Capitulo I - Introducción al curso de quest   
    ¡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á:
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
     
     
    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.
  5. Sorprendido
    izaviona got a reaction from Anibal Estela Ramos in [GUIA]Como usar el "in game map editor"   
    NOTA: Con la publicación del source de Metin2 y su respectivo editor de mapas, esto ya queda practicamente en desuso.
     
     
    IN GAME MAP EDITOR



    Imagenes de muestra:



    Para usarlo necesitais el Python Module Loader(
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.), lo extraeis en la raiz del cliente que quereis editar, luego descargais el in game map editor 1.1(Debes iniciar sesión para ver el contenido del enlace en esta publicación.), esto lo descomprimiis tambien en la carpeta raiz del cliente junto al Python Module Loader.

    Haora ejecutais el Python Module Loader(m2PythonLoader.exe),

    Os aparecera esto:


    Una vez ejecutado, ejecutais el cliente y os logueais hasta estar dentro del juego, cuando estais dentro, pulsais F9 y os aparecera una ventana para elegir el archivo .py,

    Aparecera esto:


    Le damos a select y buscamos el py, cuando lo selecciones, le damos a run y nos aparecera el editor.


    El menu de los objetos es este:



    En el podeis navegar y elegir lo que querais, Aqui os dejo un carpeta con todos los objetos del cliente:
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.(el de arriba son edificios xD)

    Para acceder a la carpeta es muy facil:
    Vamos a la ruta del cliente Aqui:
    y elegimos la carpeta necesiaria, en este caso "map_object_editor" para los edificios y "Objekte sortiert Property DE 2012" para los objetos.

    - Para seleccionar una estructura 3d dentro del juego solo es hacer clic sobre ella, para borrarla le damos clic y luego en la tecla suprimir.

    - Si tu seleccionas un objeto dentro del juego y le das a , directamente te pones a construir esa estructura sin tener que buscarla.

    - , esto hace que construyas y la estructura no se valla del puntero, si quieres seleccionar otra
    estructura le das a y seleccionas la que quieras.

    - ,esto exporta el mapa que has editado.
    Cuando le das a exportar aparecera esto:



    elegis la ruta que querais y os guardara en la ruta que habeis elegido el mapa con sus respectivos areadatas.txt

    Las demas cosas ya les dejo que toqueteen jeje

    Saludos y espero haber ayudado a quellas personas que no saben usarlo aun!

    Fuente: Nerule y musicinstructor.
    Creditos a mi por la guia, creada desde cero.
  6. Gracias
    izaviona got a reaction from lucascalderaro in [GUIA]Como usar el "in game map editor"   
    NOTA: Con la publicación del source de Metin2 y su respectivo editor de mapas, esto ya queda practicamente en desuso.
     
     
    IN GAME MAP EDITOR



    Imagenes de muestra:



    Para usarlo necesitais el Python Module Loader(
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.), lo extraeis en la raiz del cliente que quereis editar, luego descargais el in game map editor 1.1(Debes iniciar sesión para ver el contenido del enlace en esta publicación.), esto lo descomprimiis tambien en la carpeta raiz del cliente junto al Python Module Loader.

    Haora ejecutais el Python Module Loader(m2PythonLoader.exe),

    Os aparecera esto:


    Una vez ejecutado, ejecutais el cliente y os logueais hasta estar dentro del juego, cuando estais dentro, pulsais F9 y os aparecera una ventana para elegir el archivo .py,

    Aparecera esto:


    Le damos a select y buscamos el py, cuando lo selecciones, le damos a run y nos aparecera el editor.


    El menu de los objetos es este:



    En el podeis navegar y elegir lo que querais, Aqui os dejo un carpeta con todos los objetos del cliente:
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.(el de arriba son edificios xD)

    Para acceder a la carpeta es muy facil:
    Vamos a la ruta del cliente Aqui:
    y elegimos la carpeta necesiaria, en este caso "map_object_editor" para los edificios y "Objekte sortiert Property DE 2012" para los objetos.

    - Para seleccionar una estructura 3d dentro del juego solo es hacer clic sobre ella, para borrarla le damos clic y luego en la tecla suprimir.

    - Si tu seleccionas un objeto dentro del juego y le das a , directamente te pones a construir esa estructura sin tener que buscarla.

    - , esto hace que construyas y la estructura no se valla del puntero, si quieres seleccionar otra
    estructura le das a y seleccionas la que quieras.

    - ,esto exporta el mapa que has editado.
    Cuando le das a exportar aparecera esto:



    elegis la ruta que querais y os guardara en la ruta que habeis elegido el mapa con sus respectivos areadatas.txt

    Las demas cosas ya les dejo que toqueteen jeje

    Saludos y espero haber ayudado a quellas personas que no saben usarlo aun!

    Fuente: Nerule y musicinstructor.
    Creditos a mi por la guia, creada desde cero.
  7. Me Gusta
    izaviona got a reaction from oldstar in [GUIA]Como usar el "in game map editor"   
    NOTA: Con la publicación del source de Metin2 y su respectivo editor de mapas, esto ya queda practicamente en desuso.
     
     
    IN GAME MAP EDITOR



    Imagenes de muestra:



    Para usarlo necesitais el Python Module Loader(
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.), lo extraeis en la raiz del cliente que quereis editar, luego descargais el in game map editor 1.1(Debes iniciar sesión para ver el contenido del enlace en esta publicación.), esto lo descomprimiis tambien en la carpeta raiz del cliente junto al Python Module Loader.

    Haora ejecutais el Python Module Loader(m2PythonLoader.exe),

    Os aparecera esto:


    Una vez ejecutado, ejecutais el cliente y os logueais hasta estar dentro del juego, cuando estais dentro, pulsais F9 y os aparecera una ventana para elegir el archivo .py,

    Aparecera esto:


    Le damos a select y buscamos el py, cuando lo selecciones, le damos a run y nos aparecera el editor.


    El menu de los objetos es este:



    En el podeis navegar y elegir lo que querais, Aqui os dejo un carpeta con todos los objetos del cliente:
    Debes iniciar sesión para ver el contenido del enlace en esta publicación.(el de arriba son edificios xD)

    Para acceder a la carpeta es muy facil:
    Vamos a la ruta del cliente Aqui:
    y elegimos la carpeta necesiaria, en este caso "map_object_editor" para los edificios y "Objekte sortiert Property DE 2012" para los objetos.

    - Para seleccionar una estructura 3d dentro del juego solo es hacer clic sobre ella, para borrarla le damos clic y luego en la tecla suprimir.

    - Si tu seleccionas un objeto dentro del juego y le das a , directamente te pones a construir esa estructura sin tener que buscarla.

    - , esto hace que construyas y la estructura no se valla del puntero, si quieres seleccionar otra
    estructura le das a y seleccionas la que quieras.

    - ,esto exporta el mapa que has editado.
    Cuando le das a exportar aparecera esto:



    elegis la ruta que querais y os guardara en la ruta que habeis elegido el mapa con sus respectivos areadatas.txt

    Las demas cosas ya les dejo que toqueteen jeje

    Saludos y espero haber ayudado a quellas personas que no saben usarlo aun!

    Fuente: Nerule y musicinstructor.
    Creditos a mi por la guia, creada desde cero.
  8. Me Gusta
    izaviona reacted to KeKo in [FIX] Armors set 3 Baso (Guerre-Sura)   
    Hola a todos, hace tiempo implemente las armors de mi coleguin baso (sus 3 sets que le robaron del millenium-world) y me di cuenta de que la cara del guerrero y del sura no se veían, y aunque sé que muchos se dieron cuenta de por que y lo arreglaron aquí os dejo adjuntos los 2 archivos que hacen falta para que se vean por si no lo teneis arreglado
     
    Ya les hice una foto
     

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.  
    Y las lineas del xml de los 2 archivos de la textura de la cara:
     

    <File archivedPath="d:/ymir work/pc/warrior/warrior_face.jpg" type="0"><![CDATA[pc_descompiladoymir workpcwarriorwarrior_face.jpg]]></File> <File archivedPath="d:/ymir work/pc/sura/sura_face.jpg" type="0"><![CDATA[pc_descompiladoymir workpcsurasura_face.jpg]]></File> Eso es todo un saludo :wiii:

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.
×
×
  • Crear nuevo...