Jump to content

ElRaulxX

Miembro
  • Contador contenido

    49
  • Ingreso

  • Última visita

  • Días ganados

    12

Mensajes publicados por ElRaulxX

  1. pues globales y no tan globales ya que para poner catacumbas 100% deves colocar

    special.map_index:

    }

    special.map_index1:196

     

    special.map_index2:197

    }

    algo asi.

     

    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.

  2. 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()

  3. 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.

  4. 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:

     

     

    -- Dragon Setting
    
    BlueDragonSetting = {
      
    	DragonStone = {{effect_type = 1,vnum = 8031, val = 1,enemy_val =3,enemy = 1},
    					{effect_type = 2,vnum = 8031, val = 2,enemy_val =4,enemy = 2},
    					{effect_type = 3,vnum = 8032, val = 3,enemy_val =5,enemy = 3},
    					{effect_type = 4,vnum = 8033, val = 4,enemy_val =6,enemy = 4},
    					{effect_type = 5,vnum = 8034, val = 5,enemy_val =7,enemy = 5}},
    	  
    	hp_regen = {
    		['min'] = 10,
    		['max'] = 15,
    		['pct'] = 35
    	},
    	hp_period = {
    		['min'] = 3,
    		['max'] = 7,
    		['pct'] = 25
    	},
    	hp_damage = {
    		['min'] = 1000,
    		['max'] = 1400,
    		['pct'] = 35
    	},
      
    	Skill0 = {
    		['damage'] = {musa={min=13,max=38},muda={min=12,max=30},assa={min=10,max=24},sura={min=18,max=29}},
    		['damage_area'] = 4000,
    		['default_damage'] = {min=2000,max=4000},
    		['period'] = {min=19,max=27},
    		['gender']  = {female={min=5,max=10},male={min=8,max=17}},
    	},
    	Skill1 = {
    		['damage_area'] = 3000,
    		['default_damage'] = {min=3000,max=5000},
    		['period'] = {min=29,max=39},
    	},
      
    	Skill2 = {
    		['damage_area'] = 10000,
    		['period'] = {min=30,max=56},
    		['default_damage'] = {min=4000,max=7000},
    		['stun_time'] = {default={min=5,max=6}},
    		['gender']  = {female={min=5,max=10},male={min=8,max=17}},
    	},
    }
    -- Skill0 = Breath
    -- Skill1 = Wirbel
    -- Skill2 = Earthquake aka Stampfer
    

     

     

    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:

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.

    Autor: .Nova.

     

    Y creo que eso es todo.

    Un saludín!

  5. <<< elseif mt2panamera_coins . item_revision ( item . get_count ( ) ) == false then

    chat ( "ERROR" )

    else

    chat ( "ERROR" )

    end

    else

    return

    end

     

    syntax error : [string "start"]:8: unexpected symbol near `['

    md.quest:43:Abort (core dumped)

    ks3097503#

     

     

    Ami me da ese error , me podeis ayudar

     

    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.
  6. Raul , esto no tiene que conectar a un php en la web?

     

    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.

  7. 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

     

    ---------------------------------------------

    --Quest realizada por ElRaulxX

    --Exclusiva de Metin2 Panamera y Metin2 Zone

    ---------------------------------------------

    quest mt2panamera_coins begin

    state start begin

    when id_item1.use or id_item2.use or id_item3.use begin

    ---------------------------------------------

    local mysql_user = ""; --Usuario DB

    local mysql_pass = ""; --Contraseña DB

    ---------------------------------------------

    coins = {

    [id_item1] = { "Moneda de Oro", 100},

    [id_item2] = { "Moneda de Plata", 50},

    [id_item3] = { "Moneda de Bronce", 25}

    }

    say_title(""..coins[item.get_vnum()][1].."")

    say("Si utilizas esta moneda puedes obtener una")

    say("determinada cantidad de coins canjeables en la")

    say("ItemShop del servidor.")

    say("Con esta "..coins[item.get_vnum()][1].." obtendrás "..coins[item.get_vnum()][2].." coins.")

    say("")

    say("¿Quieres canjear la moneda por "..coins[item.get_vnum()][2].." coins?")

    local s = select("Si","No");

    if s == 1 then

    if mt2panamera_coins.item_revision(item.get_count()) == true then

    os.execute("mysql -u '"..mysql_user.."' --password='"..mysql_pass.."' --execute='UPDATE account.account SET coins = coins + "..coins[item.get_vnum()][2].." WHERE id = "..pc.get_account_id()..";'")

    say_title(""..coins[item.get_vnum()][1].."")

    say("¡Felicidades!")

    say("Has obtenido "..coins[item.get_vnum()][2].." coins.")

    say("Entra en la ItemShop de nuestro servidor para")

    say("canjearlas.")

    item.remove()

    elseif mt2panamera_coins.item_revision(item.get_count()) == false then

    chat("ERROR")

    else

    chat("ERROR")

    end

    else

    return

    end

    end

     

    function item_revision(count)

    if count >= 1 then

    if item.get_vnum() == 0 or item.get_vnum() == nil then

    return false

    else

    return true

    end

    elseif count < 1 then

    return false

    else

    return false

    end

    end

    end

    end

     

     

     

    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:

    ---------------------------------------------

    local mysql_user = ""; --Usuario DB

    local mysql_pass = ""; --Contraseña DB

    ---------------------------------------------

    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:

    coins = {

    [id_item1] = { "Moneda de Oro", 100},

    [id_item2] = { "Moneda de Plata", 50},

    [id_item3] = { "Moneda de Bronce", 25}

    }

    Y añadir una nueva línea:

    [id_item] = { "Nombre", cantidad de coins},

    Después buscais esto:

    when id_item1.use or id_item2.use or id_item3.use begin

    Y añadís el item que habéis puesto antes:

    when id_item1.use or id_item2.use or id_item3.use or id_item begin

     

    Y eso es todo.

    Saludines :P

  8. En quests no puedes usar tildes porque saldran mal al verlas en el juego.

     

    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 ^^

  9. 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
  10. 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:

     

    Imagen enviada

     

    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]

     

    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.

     

    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
    end
    Ahora 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
    end
    De 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
    end
    De 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!

  11. ¡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.

  12. modifique con el hex al exe y al bin por otros los de igual pero se me cierra el cliente cuando se carga la barra los compile todo de nuevo que sucede???

     

     

    B99EB0026F69810563989B2879181A00

    22B8B40464B26E1FAEEA1800A6F6FB1C

    A1A40200AA155404E78B5A18ABD6AA01

    467449000B4A0000B76E08009D186800

     

    Posibles errores:

     

    Bueno posiblemente tengan errores, tipo el cleinte me carga entro, me carga la barra i me echa i io WTF?, eso es debido a que en el locale tmbn se tiene que descompilar item proto i mob proto i compilarlos con el editado.

     

    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!

  13. 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")
    
  14. 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?:

    No es que prohibamos aportar aquí cosas de otros foros, sino que si traes algo de otro foro, antes de postearlo aquí debes probarlo en tu servidor para ver que funciona correctamente, y una vez lo subas a Metin2Zone debes crear tu propia guía no copiar la de otros, y explicar en que consiste todo o que trae un pack, una descripción tanto objetiva como subjetiva de lo que aportas, aportando tu opinión y tu explicación personal.

     

  15. 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:

    Debes iniciar sesión para ver el contenido del enlace en esta publicación.

     

    Espero que os sea de utilidad.

    Un saludo

     

    ¡Di NO al copy-paste!

  16. 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 :lol:

     

    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 :P

  17. 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...