Te invitamos a nuestro Servidor Discord (https://discord.gg/euAr7eT) para que puedas estar siempre al tanto de nuestra comunidad y jugar a tus juegos favoritos con nosotros.

Bienvenido a Metin2Zone

Registrate ahora para obtener acceso a todas nuestras características y ventajas. Una Vez Registrado y Conectado, Usted Será capaz de contribuir Mediante la Presentación de su propio contenido o respondiendo al contenido existente. Usted será capaz de Personalizar su Perfil, recibirá puntos de reputación como una recompensa, mientras que también se comunica con otros miembros a través de su propia bandeja de entrada privada, y Mucho Más!

Este Mensaje se eliminará una vez hayas Iniciado Sesión.

  • Comunicados

    • R1z

      Actualización del Foro y cambio de alias por usuario!   19/06/17

      Es importante saber que actualmente para iniciar sesión con tu cuenta necesitas utilizar el alias que tenías antes de la actualización como usuario, por ejemplo si tu usuario era juanito y tu alias (el nombre con el que te veían los otros miembros) era juan entonces ahora juan es tu usuario, si no recuerdas tu alias puedes solicitar que se te recupere la contraseña para que te pueda llegar el usuario actual de tu cuenta al email.
KeKo

Capítulo VIII - Las tablas, amigas o enemigas?

Buenas zoneros, hoy que me encuentro especialmente trabajador (es decir, que no me apetece estudiar) voy a publicar una nueva entrega del curso de creación de quests de metin2zone.

Esta nueva guía se la dedico a mi amigo raul, que siempre me habia dicho que debería aprender esto :trollface: y que era una de las guias que teniamos planeadas cuando configuramos el curso por primera vez pero que no se llego a llevar a cabo.

 

Como veis la he titulado: amigas o enemigas? es para que os deis cuenta de que como programadores que somos los que nos especializamos en lua es importante reducir el código lo máximo posible por diferentes razones: ocupa menos, es menos texto para la vista, queda mas guay, etc y tu quest seguirá haciendo lo mismo que antes pero con menos código.

 

1 - Tablas:

 

Bueno, antes de nada vamos a crear nuestra tabla o array sencillo:

 

local keko = {10,20,34,43,57}

Como veis, a diferencia de los selects a los que estáis acostumbrados los elementos de la tabla estan dentro de { }

 

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

Ojo:Los elementos deben estar separados por comas, y el último de ellos NO debe llevar la coma.

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

 

Bueno, ahora que tenemos una mini tabla vamos a llamar a los diferentes elementos de la misma. La sintaxis es la siguiente:

 

nombre[posicion]

keko[1] -- 10
keko[2] -- 20
keko[3] -- 34
keko[4] -- 43
keko[5] -- 57

Como veis escribimos el nombre del local y luego entre [ ] ponemos la posicion del elemento que queramos seleccionar dentro del array.

 

Asi que ahora ya podeis meter vuestras tablas en la quest del siguiente modo:

 

local items = {160,161,162,163}
pc.give_item2(items[1]) -- te dara el 160
pc.give_item2(items[2]) -- te dara el 161
pc.give_item2(items[3]) -- etc
pc.give_item2(items[4]) -- etc

De todos modos en ese ejemplo un for lo haría mucho mas sencillo, aunque ya os explicare mas a fondo como se usa

 

local items = {160,161,162,163}
for i=1, table.getn(items) do -- en la i ponemos igual a 1 y luego la cantidad de veces que se repita
pc.give_item2(items[i]) -- te dara cada uno de los items que haya en la tabla
end -- cada for le corresponde un end

2 - Arrays con subcategorías:

 

Bueno, hemos visto una tabla sencillita, vamos a complicar un poco la cosa:

 

local cordes = {
{12500,13400},
{12400,18900},
{19800,12300}
}

Ahora tenemos una tabla con diferentes apartados dentro della. Vamos a ver como sería la sintaxis en este caso:

 

nombre[subcategoria][posicion]

cordes[1][1] -- 12500
cordes[1][2] -- 13400

cordes[2][1] -- 12400
cordes[2][2] -- 18900

cordes[3][1] -- 19800
cordes[3][2] -- 12300

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

Ojo:Las subcategorias deben estar separadas por comas, y la ultima NO la lleva

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

 

Como veis, de nuevo escribimos el nombre, luego pondremos un primer [ ] con la subcategoría, que es el número de arrays simples dentro del array compuesto:

 

local nombre = { -- abres la tabla
{} -- subcategoria 1
{} -- subcategoria 2
{} -- subcategoria 3
} -- cierras la tabla

En el segundo [ ] va la posicion del elemento como habiamos hecho con el array simple

 

local cordes = {
{12500,13400,17500,14000},
{12400,18900,13200}
}

cordes[1][4] -- 14000
cordes[2][2] -- 18900

Veamoslo en una quest:

 

local cordes = {
{12500,13400},
{12400,18900},
{19800,12300}
}
pc.warp(cordes[1][1],cordes[1][2]) -- 12500, 13400

3. Arrays + funciones + selects = locura?

 

Bien, hasta ahora solo hemos visto ejemplos sin llegar a hacer una quest en condiciones. Lo más habitual usando arrays es combinarlos con un local = select del siguiente modo

 

say("Que arma quieres")
say("")
local items = {160,161,162}
local arma = select ("Ninfa +0" , "Ninfa +1" , "Ninfa +2" , "Cerrar")
if arma == table.getn(items)+1 then return end
pc.give_item2(items[arma],1)

De este modo, segun lo que eligamos en el select, nos asignara uno de los elementos del array, si pinchamos en Ninfa +0 el juego enviara al array la orden de mostrar el elemento de posicion 1, si pinchas en Ninfa +1 te enviará la de posicion 2 y así sucesivamente.

 

Por lo tanto, al meter el resultado del select en el array

 

pc.give_item2(items[arma],1)

Te dara la que hayas seleccionado, y así te evitarás tener que poner tres if y solo pondras 1

 

Ahora con un array doble:

 

say("Que arma quieres")
say("")
local items = {
{160,2},
{161,1},
{162,3}
}
local arma = select ("Ninfa +0" , "Ninfa +1" , "Ninfa +2" , "Cerrar")
if arma == table.getn(items)+1 then return end
pc.give_item2(items[arma][1],items[arma][2])

Tal y como está ahora, cogera la subcategoría del select, y una vez la tenga te dara lo que tengas en la posicion 1 y en la cantidad pondra lo que tengas en la posicion 2. De este modo, aunque las cantidades del item sean diferentes podrás hacerlo con un solo if.

 

Y por último vamos a meterle mas complicacion, una funcion dentro del array!

 

say("Te voi a dar un arma aleatoria")
say("")
local items = {
{160,2},
{161,1},
{162,3}
}
local arma = select ("OK" , "Cerrar")
if arma == 2 then return end
pc.give_item2(items[math.random(1,table.getn(items))][1],items[math.random(1,table.getn(items))][2])

Bien, ahora en este caaso el juego nos va a dar un arma aleatoria, porque hemos incluido la funcion math.random dentro del array. Tal y como la hemos puesto:

 

[math.random(1,table.getn(items))]

Nos dara un resultado que puede estar entre 1 y el numero de subcategorias que tiene la tabla items.

 

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

(table.getn(nombretabla)) es una función muy útil que devuelve el número maximo de elementos que tiene una tabla simple o de subcategorias de una compuesta)

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

 

Por lo tanto tal y como esta configurada la quest buscara primero la subcategoría, que sera el número aleatorio, y después irá a la posicion dentro de ella que le hemos dicho (1 para la id y 2 para la cantidad)

 

4 - KeKo, no lo hemos entendido!!!!

 

Bueno vale, os pondré otro ejemplo:

 

say("A donde quieres ir?")
sa("")
local sitio = select ("Mapa1" , "Mapa2", "Mapa3" , "Cerrar")
local cordes = {
{cordx,cordy},
{cordx,cordy},
{cordx,cordy}
}
if sitio == table.getn(cordes)+1 then return end
pc.warp(cordes[sitio][1],cordes[sitio][2])

5 - Subcategorías numeradas

 

Vamos a probar otra cosa: y si metemos un numero determinado para cada subcategoría en vez de 1,2,3,etc?

 

local prueba = {
[100] = {10,11},
[1001] = {12,13},
[134] = {14,15}
}

Veamos la sintaxis de esto:

 

chat(prueba[100][1]) -- 10
chat(prueba[1001][2] -- 13

De nuevo debemos hacer referencia primero a la subcategoria y luego a la posicion detro de la misma.

 

Y para que nos sirve esto? Tiene un monton de aplicaciones pero una muy típica es igualar la numeración de la subcategoría a una funcion:

 

when 45000.use or 45001.use or 45002.use begin
local premios = {
[45000] = {30,31},
[45001] = {32,33},
[45002] = {34,35}
}
chat(premios[item.get_vnum()][1]) -- si tu item es 45000 esto es 30
chat(premios[item.get_vnum()][2])  -- si tu item es 45002 esto es 34
end

De este modo la subcategoría la reconoce el juego segun el item que hayas usado.

 

Y bueno chicos, eso sería todo. Todavía me quedaría muchísimo de explicar sobre el uso de las tablas, pero el hecho de que no tengo demasiado tiempo y de que mis conocimientos de las mismas no son tan amplios como los de Noa (y muchos otros xd) lo dejaré aqui en esta entrega del curso de quests. Espero que os sea útil.

Compartir esta publicación


Enlace a la publicación
Compartir en otros sitios

Muy buena KeKo, como siempre todo es practicar, estaría bien que os ayudara Noa, pero veo que a veces tiene problemas con el Español, Gracias :)

Compartir esta publicación


Enlace a la publicación
Compartir en otros sitios

Aqui te falta un ), si no me equivoco KeKo.

pc.give_item2(items[math.random(1,table.getn(items)][1],items[math.random(1,table.getn(items))][2])
Supongo que seria así: pc.give_item2(items[math.random(1,table.getn(items))][1],items[math.random(1,table.getn(items))][2])
Rafa23Alzira le gusta esto

Compartir esta publicación


Enlace a la publicación
Compartir en otros sitios

Aqui te falta un ), si no me equivoco KeKo.

pc.give_item2(items[math.random(1,table.getn(items)][1],items[math.random(1,table.getn(items))][2])
Supongo que seria así: pc.give_item2(items[math.random(1,table.getn(items))][1],items[math.random(1,table.getn(items))][2])

 

Um sep se me colo el ) las prisas son malas compañeras perdonad ^^

Compartir esta publicación


Enlace a la publicación
Compartir en otros sitios

keko no lo entiendo por q en la parte esta

 

2 - Arrays con subcategorías:

 

cordes[4][2] es -> 12300

 

ami me da nil

por q son solo 3 tablas

 

en esta parte

4 - KeKo, no lo hemos entendido!!!!

 

local sitio = select ("Mapa1" , "Mapa2", "Mapa3" , "Cerrar")

 

sito es un select no una tabla

por eso me pregunto por q usas esto

 

if sitio == table.getn(sitio)+1 then return end

 

table.getn(tala) esta funcion cuenta las cosas en la tabla por ejemplo

 

a={4,5,6,13,5}

print(table.getn(a))-->5

del select debe de ser nil por q el sitio no es una tabla

 

perdona por corregirte pero es mejor saver los errores y no aserlo muchas veses, por q con una script complicada puede ser ese error mui grave

Compartir esta publicación


Enlace a la publicación
Compartir en otros sitios

keko no lo entiendo por q en la parte esta

 

2 - Arrays con subcategorías:

 

cordes[4][2] es -> 12300

 

ami me da nil

por q son solo 3 tablas

 

en esta parte

4 - KeKo, no lo hemos entendido!!!!

 

local sitio = select ("Mapa1" , "Mapa2", "Mapa3" , "Cerrar")

 

sito es un select no una tabla

por eso me pregunto por q usas esto

 

if sitio == table.getn(sitio)+1 then return end

 

table.getn(tala) esta funcion cuenta las cosas en la tabla por ejemplo

 

a={4,5,6,13,5}

print(table.getn(a))-->5

del select debe de ser nil por q el sitio no es una tabla

 

perdona por corregirte pero es mejor saver los errores y no aserlo muchas veses, por q con una script complicada puede ser ese error mui grave

 

Pos en el primer caso era un 3, me equivoque al escribirlo [3][2]

 

En el segundo caso también me equivoqué, era table.getn(cordes) no (sitio).

Compartir esta publicación


Enlace a la publicación
Compartir en otros sitios

yo solo se pseudocodigo

Yo sé Visual Basic y si tienes la lógica entonces sabrás programar no importa en que lenguaje esté.

Compartir esta publicación


Enlace a la publicación
Compartir en otros sitios

Yo sé Visual Basic y si tienes la lógica entonces sabrás programar no importa en que lenguaje esté.

si sabes visual basic sabrás que esa tipa hace 1 año que no se conecta al foro, no? xd

Compartir esta publicación


Enlace a la publicación
Compartir en otros sitios

si sabes visual basic sabrás que esa tipa hace 1 año que no se conecta al foro, no? xd

Ya no entra al foro,no se por que algunos responden a alguien en un post de hace años si no sabe si sigue en la comunidad o no,por eso en zone esta lleno de spam no hay moderadores que cierren post antiguos etc.

Compartir esta publicación


Enlace a la publicación
Compartir en otros sitios

Crear una cuenta o conéctate para comentar

Tienes que ser miembro para dejar un comentario

Crear una cuenta

Regístrese para obtener una cuenta nueva en nuestra comunidad. ¡Es fácil!


Registrar una nueva cuenta

Conectar

¿Ya tienes una cuenta? Conéctate aquí.


Conectar ahora

  • Recientemente navegando por este tema   0 miembros

    No hay usuarios registrados visitando esta página.