ES/Introducción a Lua
Los llamados "resources" son fundamentales en MTA. Básicamente consisten en una carpeta o archivo ZIP que contiene una colección archivos, además de un archivo meta que define qué archivos pertenecen al resource, algunas configuraciones, y otras cosas. Como los programas en un sistema operativo, los resources pueden ser iniciados, detenidos, y reiniciados, y varios pueden funcionar al mismo tiempo.
Todo lo que es la programación ocurre dentro de los resources. Lo que éste haga define si se trata de un modo de juego, un mapa, un script sencillo, u otra cosa. MTA, por defecto, trae ciertos resources que puedes usar opcionalmente en tus modos de juego.
Lo primero que debes tener en cuenta al iniciarte en la programacion en LUA, es conseguir un editor que funcione para ello. Esto hace mucho más facil tu trabajo, permitiéndote corregir el sintaxis de las matemáticas, por ejemplo. El equipo de MTA recomienda Notepad++ y LuaEdit, pero también existe el Editor de Scripts No Oficial de MTA (en progreso) que puedes usar (yo uso ése).
Creando un script funcional
Primero, aprenderemos a hacer un script que permita al jugador caminar libremente por la ciudad. Esto lo explicaremos paso a paso.
Estructura de un script y ubicación del mismo
Dirijámonos a la carpeta raíz de tu servidor para MTA (por defecto es "C:\Archivos de Programa\Multi Theft Auto\server", si es que lo instalaste). Después vamos a la siguiente ubicación:
\server\mods\deathmatch\resources\
Verás muchos archivos ZIP. Como mencioné antes, estos ZIP son los resources, que vienen por defecto con MTA. Para crear tu propio resource, añade una carpeta a esta ubicación, y dale un nombre. Recomiendo que, al ser tu primer script, sigas las instrucciones al pie de la letra, y a esta carpeta la llames "myserver".
Ahora, entremos a la ubicación:
\resources\myserver\
Identificando tu resource
Como mencioné antes, todo resource tiene un archivo que define el tipo, los archivos, y las configuraciones del resource, es el meta.xml. Siempre debe estar dentro de cada resource, de otra forma éste no funciona. Así que creemos un archivo de texto, y llamémoslo "meta.xml" (sin las comillas). Luego abrámoslo con el Bloc de Notas, o con Microsoft Wordpad.
Una vez dentro de este archivo, agregaremos el siguiente código:
<meta> <info author="TuNombre" type="gamemode" name="Mi Servidor" description="Mi primer servidor de MTA DM" /> <script src="script.lua" /> </meta>
En la etiqueta <info /> hay un campo "type". Éste indica el tipo de resource, que siendo "gamemode" en este caso, define que es un modo de juego. Nótese que cuando es otro tipo de resource, el valor "type" cambia. Pero eso lo veremos luego. Por ahora, un modo de juego es lo que necesitas para comenzar un servidor.
La etiqueta <script /> indica el script que tendrá nuestro modo de juego. A continuación, cómo crearlo.
Creando un script simple
Nótese que en la etiqueta <script />, el archivo LUA no está en otro directorio, como por ejemplo "myserver\script.lua". Esto es porque el archivo LUA del que hablamos será creado en el mismo lugar en el que el archivo META. Bueno, ahora creamos en "myserver", otro archivo de texto, y lo llamamos "script.lua". Abrámoslo y agreguemos estas líneas:
function manejadorDeInicio() local x = 1959.55 local y = -1714.46 local z = 10 spawnPlayer(source, x, y, z) fadeCamera(source, true) setCameraTarget(source, source) outputChatBox("Bienvenido a Mi Servidor", source) end addEventHandler("onPlayerJoin", getRootElement(), joinHandler)
Este script inicia a tu jugador en las coordenadas "x", "y" y "z" (spawnPlayer) cuando entras al servidor. OJO: ¡La función fadeCamera siempre debe ser usada cuando inicias al jugador, de otra forma, la pantalla quedará en negro!. Lo mismo pasa con la función setCameraTarget; si no la usas, el jugador no podrá verse a sí mismo, si no que mirará al cielo infinito.
La variable source indica qué fue lo que ocasionó al evento. Como el evento onPlayerJoin significa alIniciarJugador, lógico que lo que ocasione a este evento sea el jugador. Así, evitaremos iniciar a cualquier jugador.
Ahora, dirigiéndonos a addEventHandler, podrás ver que posee 3 cosas: onPlayerJoin, el nombre del evento. getRootElement(), que indica por qué o quién será iniciado el evento (getRootElement() significa "todo"). Y joinHandler, que es el nombre de la función a iniciar cuando lo haga el evento.
Con esto, deberías poder comenzar a jugar. Pero faltan algunos detalles... ¡Sigamos!
Corriendo el script
Para que tu servidor local sea iniciado, debes ir a la carpeta raíz de tu servidor (recuerda cuando fuimos a los resources, 2 puestos encima). Una vez que lo inicies, aparecerá una consola con una serie de datos; recuerda el número del puerto, porque lo necesitarás para jugar. Cuando aparezca un mensaje que diga "Server started and is ready to accept connections!", sabrás que ya está listo.
Pero antes de jugar, debes iniciar el modo de juego. Escribe "gamemode myserver" en la consola del servidor, y presiona Enter. El servidor emitirá algunos mensajes, e iniciará tu modo de juego, y si algún error surge, nos lo dirá. Bueno, ahora es tiempo de probar el modo de juego. Inicia MTA, y en el menú principal escoge "Quick Connect". Apareceren 3 campos. En el primero, escribe "localhost", en el segundo, el número del puerto de tu servidor, y en el tercero, nada, después de todo es la contraseña,y tú no pusiste ninguna. Si todo funciona bien, deberías poder comenzar a jugar en Los Santos.
A continuación, te enseñaremos a crear un comando que permita crear un vehículo a tu lado. Si quieres, puedes saltarte este paso y seguir la programación avanzada con Map Manager, que continúa este tutorial. También puedes revisar Introducción a la Programación del GUI, en el que te enseñaremos a diseñar la Interfaz Gráfica de Usuario (GUI en inglés, por "Graphical User Interface".
Creando un Comando
Volvamos a script.lua. Como dije hace un momento, crearemos un comando que permita crear un vehículo a tu lado. Primero, necesitaremos crear una función a la que llamar, y un manejador de comandos que cree el comando buscado.
-- Aquí creamos la función que llama el manejador, con los argumentos "elJugador", "nombreDelComando", "modeloDeVehiculo": function crearVehículoParaJugador(elJugador, nombreDelComando, modeloDeVehículo) -- Crear el vehículo y otros. end -- Aquí creamos el manejador de comandos: addCommandHandler("crearvehiculo", crearVehículoParaJugador)
Nota: Los nombres de las funciones tienen enlaces que te llevan a la documentación de ellas.
Acerca de los manejadores de comandos
El primer argumento de addCommandHandler es el nombre del comando que el jugador podrá ingresar, y el segundo es la función que ejecutará en el momento de ingreso del comando (en este caso crearVehiculoParaJugador).
Si tienes alguna experiencia con la programación en LUA, sabrás que a una función la llamas de esta forma:
nombreDeFunción(argumento1, argumento2, argumento3, ..)
nombreDeFunción(elJugador, nombreDelComando, argumento3, ..)
Acerquémonos a esto. Vemos que argumento1 es elJugador y argumento2 es nombreDelComando. elJugador representa al jugador que haya ingresado el comando, por lo que de la forma que lo llames, esta variable será el jugador. nombreDelComando es simplemente el nombre del comando (sin la barra "/"), no hay ningún misterio en ello, por lo que si el jugador escribió "/crearvehiculo" entonces esta variable sería "crearvehiculo". Por último, argumento3 representa una variable más, que estudiaremos más adelante. Nunca olvides que los 2 primeros argumentos son obligatorios y están predefinidos (y debes tenerlos en el orden que se indican), pero puedes llamarlos como sea.
addCommandHandler permite llamar fácilmente a funciones como crearVehículoParaJugador, de forma interna.
Por ejemplo: Alguien entra el comando "/crearvehiculo 468". El servidor creará el vehículo 468, es decir, la moto Sánchez. Dentro del código, addCommandHandler llama a la función crearVehículoParaJugador como si hubiera sido escrito así:
crearVehículoParaJugador(elJugador,"crearvehiculo","468") -- Recuerda que "elJugador" es el elemento jugador que entró el comando.
Como podemos ver, esto prevée ciertos argumentos que ya hemos mencionado. Pero el más importante es "468", que es el "argumento3" del que hablábamos más arriba. Éste se refiere al modelo del vehículo. Recuerda que siempre debes definir los primeros 2 parámetros ("elJugador" y "nombreDelComando"), porque de otra forma el comando no funcionará.
Nota: Tienes que poner el manejador de comandos DEBAJO de la función a llamar por el comando. ¡El orden de las ejecuciones es fundamental!
Este tutorial fue traducido por "The Kid", y actualmente sigue en construcción.