Enargy, Posted June 5, 2016 Share Posted June 5, 2016 (edited) Este tutorial te introducira al conocimiento en LUA aplicado en MTA, Espero que te sea util y comprensible a la hora de crear tus propios scripts. Comenzamos. 1.- ¿Que es un Elemento? Un elemento es la representacion genérica de una o mas entidades dentro del juego y estan clasificados como: · player · colshape · ped · blip · vehicle · radararea · object · marker · pickup · team + Lista de todos los elementos + Los elementos pueden ser creados por alguna identidad siempre y cuando no sea nombrada con el nombre de algun otro elemento. Ejemplo: createElement("un_nuevo_elemento") 2.- ¿Que es una String? Es una cadena de caracteres donde se presentan textos alfabetos. todo texto encerrado con los signos " al comienzo y final de un texto, frase o palabra es considerada una cadena(string). Ejemplo: "Habia una véz una señora que era amigable y algún dia ella se fué." "1 + 1 = 2" "Hola" 2.1- ¿Que es un Integer? Es un tipo de dato que donde se presenta un numero entero. Ejemplo: 1, 2, 3, 4, 5, ... 2.2- ¿Que es un Float? Al igual que un Integer, es la presencia de un valor numerico pero en lugar de numeros enteros, presenta numeros decimales. Ejemplo: 1.1, 1.2, 1.3, 1.4, ... 3.- ¿Que es una función? Una función es una composición resumida de uno o mas datos. Ejemplo: -- Su sintaxis está estructurada de esta manera: function nueva_funcion () end -- El 'end' será muy importante ya que este les indicará el final o la terminación de la función. Hemos creado una función pero esta no tiene nada dentro, así que podemos implementarle algunos datos. Ejemplo: function mensajes () outputChatBox("Primer mensaje.", 255, 255, 255, false) outputChatBox("Segundo mensaje.", 255, 255, 255, false) outputChatBox("Tercer mensaje.", 255, 255, 255, false) outputChatBox("Cuarto mensaje.", 255, 255, 255, false) outputChatBox("Quinto mensaje.", 255, 255, 255, false) end Ahora en la función 'mensajes' hay 5 datos que nos permitirá publicar 5 textos en el chat. Ejercicio: Crear 5 funciones donde nos muestre cada una 5 mensajes en rojo. El ejercicio es simple, primero lo primero declaramos una nueva función que nos muestre los dos mensajes en rojo. function mensajesRojos () outputChatBox("Primero.", 255, 0, 0, false) outputChatBox("Segundo.", 255, 0, 0, false) end Ya creamos nuestra "función base" y ahora procederemos a crear las 5 funciones con los datos que piden. EXISTEN DOS MANERAS DE HACERLO: La eficiente y la no adecuada (QUE NO VA HACER FALTA LA CREACIÓN DE UNA FUNCIÓN BASE). LA NO ADECUADA: function primerMensaje () outputChatBox("Primero.", 255, 0, 0, false) outputChatBox("Segundo.", 255, 0, 0, false) outputChatBox("Tercero.", 255, 0, 0, false) outputChatBox("Cuarto.", 255, 0, 0, false) outputChatBox("Quinto.", 255, 0, 0, false) end function segundoMensaje () outputChatBox("Primero.", 255, 0, 0, false) outputChatBox("Segundo.", 255, 0, 0, false) outputChatBox("Tercero.", 255, 0, 0, false) outputChatBox("Cuarto.", 255, 0, 0, false) outputChatBox("Quinto.", 255, 0, 0, false) end function TercerMensaje () outputChatBox("Primero.", 255, 0, 0, false) outputChatBox("Segundo.", 255, 0, 0, false) outputChatBox("Tercero.", 255, 0, 0, false) outputChatBox("Cuarto.", 255, 0, 0, false) outputChatBox("Quinto.", 255, 0, 0, false) end function cuartoMensaje () outputChatBox("Primero.", 255, 0, 0, false) outputChatBox("Segundo.", 255, 0, 0, false) outputChatBox("Tercero.", 255, 0, 0, false) outputChatBox("Cuarto.", 255, 0, 0, false) outputChatBox("Quinto.", 255, 0, 0, false) end function quintoMensaje () outputChatBox("Primero.", 255, 0, 0, false) outputChatBox("Segundo.", 255, 0, 0, false) outputChatBox("Tercero.", 255, 0, 0, false) outputChatBox("Cuarto.", 255, 0, 0, false) outputChatBox("Quinto.", 255, 0, 0, false) end -- LUEGO PROCEDEREMOS A EJECUTAR LA FUNCIONES (PRIMERO SE CREA LA FUNCIÓN ANTES DE HACER EL LLAMADO.) primerMensaje () segundoMensaje () TercerMensaje () cuartoMensaje () quintoMensaje () LA MANERA EFICIENTE: function mensajesRojos () -- La función base. outputChatBox("Primero.", 255, 0, 0, false) outputChatBox("Segundo.", 255, 0, 0, false) outputChatBox("Tercero.", 255, 0, 0, false) outputChatBox("Cuarto.", 255, 0, 0, false) outputChatBox("Quinto.", 255, 0, 0, false) end function primerMensaje () mensajesRojos () end function segundoMensaje () mensajesRojos () end function TercerMensaje () mensajesRojos () end function cuartoMensaje () mensajesRojos () end function quintoMensaje () mensajesRojos () end -- LUEGO PROCEDEREMOS A EJECUTAR LA FUNCIONES (PRIMERO SE CREA LA FUNCIÓN ANTES DE HACER EL LLAMADO.) primerMensaje () segundoMensaje () TercerMensaje () cuartoMensaje () quintoMensaje () Hemos creado 5 funciones que muestran 5 mensajes cada una; un total de 25 mensajes en el chat. NOTA: Una buena recomendación sería irse por la manera eficiente ya que te ayuda a visualizar y mostrar de manera ordenada tus codigos, ademas de que te ahorran lineas de códigos. 3.1.- ¿Que son los parametros de una función? Son datos asignados a una función, pueden representarse como booleanos, cadenas y números. Ejemplo: function miFuncion (arg1, arg2, arg3, arg4, arg5, ...) end Los parametros de una función pueden ser muy util a la hora de crear una función desde cero pero tambien influyen mucho en la manera resumida de un código. Ejemplo: Creamos una función con 5 parametros: uno será una cadena(string), tres serán numeros y el ultimo un booleano. function miMensaje(texto, rojo, verde, azul, coloreado) outputChatBox(texto, rojo, verde, azul, coloreado) end -- Ahora llamamos a nuestra función: miMensaje("Esta es mi propia función que publica mensajes", 0, 255, 0, false) Ahora ya tenemos nuestra propia función que postea un mensaje en color verde. 3.2.- addEventHandler y addCommandHandler · addEventHandler: Es una función que será llamada cuando el evento al que está conectado una función se activa, asignandole argumentos especificos a una función. Ejemplo: -- addEventHandler esta estructurada de esta manera: addEventHandler( , , ) -- Creamos una función function miFuncion ( resource ) -- El parametro ´resource´ es un parametro que se lo otorga el addEventHandler. outputChatBox("Se inició un resource!", 255, 255, 255, false) end -- Ejecutamos la función cada vez que algún resource se inicia. addEventHandler("onClientResourceStart", getRootElement(), miFuncion) · addCommandHandler: Ejecuta una función mediante una linea de comando. Ejemplo: -- addCommandHandler esta estructurada de esta manera: addCommandHandler( , ) -- Creamos una función function miFuncion (elemento_ejecutador, nombre_de_comando) -- El parametro 'elemento_ejecutador' es el elemento que ejecutó el comando. 'nombre_de_comando' es el nombre del comando que se le dio a la función. outputChatBox("Hola tu!", 255, 255, 255, false) end -- Ejecutamos la función cada vez que se escribe un comando addCommandHandler("hola", miFuncion) -- Al escribir '/hola' en el chat, el mensaje que esta dentro de la función se va a mostrar. NOTA: Los parametros de los eventos y comandos pueden variar según la ubicación del código, ya sea Server-side o Client-side. Mas información sobre addEventHandler y addCommandHandler: https://wiki.multitheftauto.com/wiki/AddEventHandler https://wiki.multitheftauto.com/wiki/AddCommandHandler 4.- ¿Que es una variable? Es un dato de almacenamiento temporal que permite guardar datos numericos, cadenas(strings) e incluso elementos, dentro o fuera de una función. Ejemplo: almacenando una cadena de caracteres. variable = "Aprendiendo..." 4.1.- ¿Que es una variable local? Permite declarar un nuevo dato de almacenamiento dentro de una función. Ejemplo: function miFuncion () local variable = "Mi texto." outputChatBox(variable, 255, 255, 255, false) end Las variables locales no pueden ser leidas desde otra función. Ejemplo: function unaFuncion () local variable = "Mi texto." end function otraFuncion () outputChatBox(variable, 255, 255, 255, false) end 4.2.- ¿Que es una variable global? Al igual que una variable local, crea una variable para almacenar datos pero a diferencia de ella; la variable puede ser leida dentro y fuera de una función. Cosa que la variable local solo hace al estar dentro de una función. Ejemplo: variable = "Mi texto." function miFuncion () outputChatBox(variable) end Una variable local puede considerarse global siempre y cuando esté fuera de una función Ejemplo: local variable = "Mi texto." function miFuncion () outputChatBox(variable) end function otraFuncion () outputChatBox(variable) end 5.- ¿Que son las sentencias if/else/elseif? A. Sentencia IF: Se utiliza para comprobar una condición y si la condición es verdadera entonces procesaremos un bloque de sentencias. Ejemplo: -- Creando una función que publique un mensaje. function mensaje (texto) if texto == "Hola" then -- Ahora si el valor del parametro 'text' es igual a 'Hola' se procesará el bloque. outputChatBox("El mensaje es el mismo.", 255, 255, 255, false) end end -- Nuestro llamado mensaje ( "Hola" ) B. Sentencia Else: sólo es ejecutada si la expresión if es evaluada como falso (false). Ejemplo: -- Creando una función que publique un mensaje. function mensaje (texto) if texto == "Hola" then -- Ahora si el valor del parametro 'text' es igual a 'Hola' se procesará el bloque. outputChatBox("El mensaje es el mismo.", 255, 255, 255, false) else -- Si la sentencia IF no se cumple, else será ejecutado. outputChatBox( "El mensaje NO es el mismo", 255, 0, 0, false ) end end -- Nuestro llamado mensaje ( "Bueno" ) C. Sentencia Elseif: Es una combinación de if y else. Del mismo modo que else, extiende una sentencia if para ejecutar una sentencia diferente en caso que la expresión if original se evalúe como false. Sin embargo, a diferencia de else, esa expresión alternativa sólo se ejecutará si la expresión condicional del elseif se evalúa como verdadera (true). Ejemplo: -- Creando una función que publique un mensaje. function mensaje (texto) if texto == "Hola" then -- Ahora si el valor del parametro 'text' es igual a 'Hola' se procesará el bloque. outputChatBox("El mensaje es el mismo.", 255, 255, 255, false) elseif texto == "Hello" then -- Si no se cumple la primera sentencia if, procederá al elseif. outputChatBox("El mensaje no es Hola sino Hello.", 255, 255, 255, false) else -- Si la sentencia IF y la Elseif no se cumple, else será ejecutado. outputChatBox( "No es ni Hola ni Hello.", 255, 0, 0, false ) end end -- Nuestro llamado, puede ser usando el parametro "Hola" o "Hello" mensaje ( "Hola" ) -- ó tambien: mensaje ( "Hello" ) -- O llevando la función a false al usar un texto diferente: mensaje ( "Bonjour" ) Tambien podemos realizar un metodo un poco complejo, usando matematica basica y booleanos Ejemplo: -- Creamos una función que haga la aritmetica. function multiplicar ( a, b ) local n = a * b -- Usamos el simbolo '*' para multiplicar los dos numeros return n -- 'return' sirve para salir de la función con la información obtenida. end Ahora que ya tenemos nuestra función que cumple la aritmetica, hacemos un metodo de comparación con las sentencias if/elseif/else. function multiplicar ( a, b ) local n = a * b return n end -- Llamamos a nuestra función: local resultado = multiplicar ( 2, 2 ) -- multiplicamos 2 por 2. if ( resultado ) then -- la variable 'resultado' es la información obtenida de la función 'multiplicar'. if ( resultado == 4 ) then -- Si el resultado es igual a 4. outputChatBox("El resultado es igual a 4", 255, 255, 255, false) elseif ( resultado > 4 ) then outputChatBox("El resultado es mayor que 4", 255, 255, 255, false) else -- Si el resultado no es igual a 4 ni tampoco es mayor que 4. outputChatBox("El resultado es menor que 4", 255, 255, 255, false) end end 5.- ¿Que es una Tabla? Un tabla es un medio de guardar un conjunto de objetos de la misma clase. Se accede a cada elemento individual de la tabla mediante un número entero denominado índice. Ejemplo: variable = {} -- Guardamos la tabla en una variable. Tambien pueden ser guardadas en variables locales pero solo funcionarán si estan dentro de una función. Con nuestra tabla creada procederemos a introducir algun valor, ya sean cadenas, numeros o elementos. Ejemplo: --Existen dos maneras de insertar valores a una tabla. -- La primera es creando la tabla con un valor yá insertado: variable = { "Hola" } -- La segunda es insertar el valor luego de haber creado el tabla: variable = {} -- creamos nuestra tabla vacia. -- y debajo de la tabla procederemos a usar una función llamada 'table.insert' que sirve para insertar valores a una tabla y se estructura de esta manera: table.insert (, ) table.insert(variable, "Hola") -- Ahora hay un texto dentro de nuestro tabla. Ahora nosotros queremos leér el mensaje que está dentro de la tabla y para eso usamos la siguiente sintaxis: Ejemplo: -- Creamos una variable con tres valores dentro: variable = { "Hola", "Hello", "Bonjour" } -- y para leer los textos dentro del tabla se procede: variable[1] --> texto 'Hola' variable[2] --> texto 'Hello' variable[3] --> texto 'Bonjour' -- Ahora si queremos que se muestren estos tres mensajes en el chat hacemos lo siguiente: outputChatBox(variable[1], 255, 255, 255, false) outputChatBox(variable[2], 255, 255, 255, false) outputChatBox(variable[3], 255, 255, 255, false) 5.1.- Tabla dentro de una tabla? Una tabla tambien puede encontrase dentro de otra, pero a diferencia de este, hay que especificar el indice donde se encuentra. Su sintaxis es: Ejemplo: -- Creamos una tabla que contenga un tabla y dentro de él un texto tabl = { { "Hola" } } -- Y Ahora para leer el texto dentro de la tabla sería de esta manera: tabl[1][1] -- tabla[el_indice][posición_del_dato] -- Y la posteamos en nuestro chat: outputChatBox(tabl[1][1], 255, 255, 255, false) Podemos usar varias tablas en uno solo, solo basta con especificar el indice y la posición indicada Ejemplo: -- Creamos una tabla con 8 tablas dentro y que en esas tablas contenga un texto. tabl = { { "uno" }, { "dos" }, { "tres" }, { "cuatro" }, { "cinco" }, { "seis" }, { "siete" }, { "ocho" } } -- Hacemos el mismo paso que el anterior ejemplo pero con un indice diferente: tabl[6][1] -- Obtenemos el texto 'seis' dentro de la tabla. -- Y lo publicamos en el chat: outputChatBox(tabl[6][1], 255, 255, 255, false) Tambien hay otro metodo de leer los valores dentro de una tabla y es mediante los indices textuales Ejemplo: tbl = { ["Alberto"] = true, ["Maria"] = true, ["Adolfo"] = true } -- En la tabla hay indices textuales que sirven para leer el valor de cada una. -- Luego hacemos una comparación check = tbl["Maria"] -- Devolverá un valor booleano que es el que se encuentra en la tabla. if (check == true ) then -- Si la variable Check es verdadera se cumple la sentencia outputChatBox("Yep!", 255, 255, 255, false) end 5.2.- ¿Que es un Array? Un array es una tabla que se encuentra indexada numéricamente con numeros enteros. Ejemplo: tabl = { [1] = "Albert", [2] = "Jenny", [3] = "Jin" } -- Y Para leer los datos de la tabla sería: outputChatBox(tabl[2]) -- Printea el valor 'Jenny'. 6.- ¿Que son los ciclos For-do, while-do y repeat-until? A. Ciclos For-do: El ciclo for se utiliza en repeticiones(bucles) cuando se conoce la cantidad de veces que se va a repetir una accion, esta compuesto por 3 partes: · Inicializacion: Se utiliza generalemente para iniciar un contador, de debe colocar el valor que interese eso va a depender del caso generalmente se inicializa en cero. · Limite: Es la condicion que se preguntara antes de hacer lo que este dentro de la repeticion, si se cumple hara las instrucciones dentro de el, si no no. Esto si es obligatorio. · Incremento: Es la cantidad que incrementara (o decrementara segun el caso) el contador en cada repeticion, tampoco es obligatorio osea si se omite el incremento sera de 1 en 1 (por default se incrementa a menos que se especifique lo contrario). Ejemplo: -- El ciclo for-do esta estructurado de esta manera: for = , , -- Creamos un ciclo for-do que cuente del 0 al 20: for key = 0, 20 do -- Agregamos un outputChatBox para que muestre el conteo en el chat. outputChatBox(key, 255, 255, 255, false) -- Se mostrará en el chat: 0, 1, 2, 4, 5, hasta 20. end -- Siempre es importante usar un 'end' despues de agregar un 'do'. Ahora ya vimos la manera de como hace un conteo el ciclo for-do pero ahora lo haremos en incremento, es decir de numero en numero. Ejemplo: -- Creamos un ciclo que cuente de cinco en cinco hasta legar a 25. for key = 0, 25, 5 do --Ahora lo mostramos en el chat: outputChatBox(key, 255, 255, 255, false) -- Se mostrará así: 0, 5, 10, 15, 20, 25. end ¿En un ciclo for-do se puede contrar hacia atras? Si. Ejemplo: for i = 10, 0, -2 do -- dos en dos. outputChatBox(i, 255, 255, 255, false) -- Se mostrará así: 10, 8, 6, 4, 2, 0 end B. Ciclos While-do: Es un ciclo en donde se cumple una condición. Es decir que todas las sentencias que encierra, se ejecutarán mientras la condición sea verdadera. Este ciclo puede o no ejecutarse, depende de los valores que sean evaluados en la condición. Por tanto la condición se evaluará antes de entrar en una nueva iteración. Ejemplo: i = 0 -- creamos una variable que tenga un valor de cero. while ( i < 10 ) do -- i que es '0' será menor que 10. outputChatBox(i) -- Mostrando el conteo en el chat i = i + 1 -- comenzando el conteo hasta que el ciclo while se detenga y retorne a falso. end Es muy importante hacer que el ciclo cambie de false a true o true a false, de no ser así la maquina se atascará en un ciclo infinito. Ejemplo: n = 5 while ( n == 5 ) do outputChatBox("Crash!", 255, 0, 0, false) end B. Ciclo repeat-until: Repite el código dentro del bucle hasta que la condición de finalización es cierta. La comprobación se hace al final, por lo que el código del interior siempre se va a ejecutar por lo menos una vez. Ejemplo: n = 0 repeat outputChatBox(n) n = n + 1 until n <= 8 -- El bucle termina cuando 'n' sea mayor o igual que 8. Un ciclo for-do también sirve para exportar o "desempaquetar" datos de una tabla. Ejemplo: -- Creamos una tabla con una tabla dentro y dentro de ellas todas tendran un texto. tabla = { {"Anne"}, {"Sebastian"}, {"Jimenez"}, {"Mario"}, {"Alfred"} } -- el ciclo for-do para las tablas estan estructurados de esta manera: for , in () do for key, value in ipairs () do end -- Se le agrega un end para cerrar el ciclo. -- 'key' es el numero de indice que se va a contar al momento de exportar la tabla. -- 'value' es el valor que estan dentro de las tablas. -- 'ipairs' palabra clave para la exportación de datos. Uso de ipairs y pairs · PAIRS: Valor en orden aleatorio o variantes. Ejemplo: numeros = {1, d = "2",3, c = "4", 5, 6, b = "7", 8, a = "9"} for key, value in pairs(numeros) do outputChatBox(value) end -- Se mostrara en el chat lo siguiente: 1,3,5,6,8,9,2,4,7 · IPAIRS: Claves numéricas en orden ascendente. Ejemplo: numeros = {1,2,3,4,5,6,7,8,9} for key, value in pairs(numeros) do outputChatBox(value) end -- Se mostrara en el chat lo siguiente: 1,2,3,4,5,6,7,8,9 Signos de igualacion, mayor que, menor que y distinción En lua se aplica los metodos de Matematica básica de los signos y pueden representarse así: > -- mayor que... < -- menor que... >= -- mayor o igual que... <= -- menor o igual que... ~= -- distinto a... Ejemplo: -- mayor que... if ( 5 > 0 ) then return true -- verdadero. end -- menor que... if ( 5 < 0 ) then return false -- falso. end -- mayor o igual que... if ( 5 >= 5 ) then return true -- verdadero. end -- menor o igual que... if ( 5 <= 5 ) then return true -- verdadero. end -- distinto a.... if ( 2 ~= 5 ) then return true -- verdadero. end Edited June 10, 2016 by Guest Link to comment
aka Blue Posted June 5, 2016 Share Posted June 5, 2016 Muy buena esa, me viene genial para lo de while y demás, gracias Link to comment
Enargy, Posted June 5, 2016 Author Share Posted June 5, 2016 Muy buena esa, me viene genial para lo de while y demás, gracias De nada Link to comment
Tomas Posted June 5, 2016 Share Posted June 5, 2016 Muy bueno, hay un pequeño error de concepto con los arrays. Esto es un array: variable = { "Hola", "Hello", "Bonjour" } --> [1] = "Hola", [2] = "Hello", [3] = "Bonjour" Esto no lo es: tbl = { ["Alberto"] = true, ["Maria"] = true, ["Adolfo"] = true } --> ["Alberto"] = true, ["Maria"] = true, ["Adolfo"] = true y esto tampoco: array = {} -- [] Un array es una tabla indexada numéricamente (solo con integers), así que tablas vacías o tablas indexadas con texto no son arrays. Link to comment
Enargy, Posted June 5, 2016 Author Share Posted June 5, 2016 Esto es un array? variable = { [1] = "Hola", [2] = "Hello", [3] = "Bonjour" } Y lo demas son tablas comúnes? Link to comment
Tomas Posted June 5, 2016 Share Posted June 5, 2016 Esto es un array? variable = { "Hola", "Hello", "Bonjour" } Sí, ya que su índice al no ser especificado es por defecto numérico, cuando imprimes esa tabla obtienes: 1 Hola 2 Hello 3 Bonjour Y lo demas son tablas comúnes? Todas son tablas. Las que son indexadas con números (integers) son arrays a secas. Luego están los arrays asociativos que son los que tienen sus valores indexados con cualquier variable del lenguaje a excepción de nil (números, funciones, strings, etc.) Link to comment
Enargy, Posted June 5, 2016 Author Share Posted June 5, 2016 Entiendo, Bueno gracias . Editado. Link to comment
starksZ Posted June 5, 2016 Share Posted June 5, 2016 Muy buena esa, me viene genial para lo de while y demás, gracias Todo lo que hizo fue sólo Lógica de programación.... @Gaberiel Buen aporte Link to comment
Enargy, Posted June 6, 2016 Author Share Posted June 6, 2016 Muy buena esa, me viene genial para lo de while y demás, gracias Todo lo que hizo fue sólo Lógica de programación.... @Gaberiel Buen aporte Gracias Link to comment
MTA Team 0xCiBeR Posted June 7, 2016 MTA Team Share Posted June 7, 2016 Buen aporte, lo puse como sticky. Saludos! Link to comment
aka Blue Posted June 9, 2016 Share Posted June 9, 2016 En el output no tendría que ser index? -- Creamos un ciclo que cuente de cinco en cinco hasta legar a 25. for index = 0, 25, 5 do --Ahora lo mostramos en el chat: outputChatBox(key, 255, 255, 255, false) -- Se mostrará así: 0, 5, 10, 15, 20, 25. end Link to comment
Enargy, Posted June 10, 2016 Author Share Posted June 10, 2016 En el output no tendría que ser index? -- Creamos un ciclo que cuente de cinco en cinco hasta legar a 25. for index = 0, 25, 5 do --Ahora lo mostramos en el chat: outputChatBox(key, 255, 255, 255, false) -- Se mostrará así: 0, 5, 10, 15, 20, 25. end Corregido. Link to comment
Recommended Posts