Wikipedia MTA

Comandos personalizados en MTA:SA: cómo crear tu propio sistema con addCommandHandler

Casi todo gamemode de MTA:SA necesita comandos de chat propios: /tp, /curar, /vip, /reportar, etc. La función que hace esto posible es addCommandHandler, y entenderla bien es uno de los primeros pasos para cualquiera que empiece a scriptear en MTA.

¿Qué hace addCommandHandler?

Registra una palabra (el comando) y la asocia a una función que se ejecuta cada vez que un jugador la escribe en el chat con / adelante.

addCommandHandler("curar", function(player, commandName)
    setElementHealth(player, 100)
    outputChatBox("Te has curado por completo.", player, 0, 255, 0)
end)
En este ejemplo, cuando un jugador escribe /curar, el servidor le devuelve la vida al máximo y le muestra un mensaje en verde solo a él.

Comandos con argumentos

Los comandos suelen necesitar parámetros, por ejemplo /tp 100 200 50 o /dar arma1 munición. MTA pasa esos argumentos como parámetros adicionales a la función:

addCommandHandler("tp", function(player, commandName, x, y, z)
    if not x or not y or not z then
        outputChatBox("Uso correcto: /tp [x] [y] [z]", player, 255, 0, 0)
        return
    end
    setElementPosition(player, tonumber(x), tonumber(y), tonumber(z))
end)
Los argumentos siempre llegan como texto (string), por eso es importante convertirlos con tonumber() antes de usarlos como coordenadas.

Restringir comandos a administradores

No todos los comandos deberían estar disponibles para cualquier jugador. Antes de ejecutar la acción, se valida el permiso del jugador usando el sistema de ACL (ver nuestro artículo de ACL y permisos):

addCommandHandler("banear", function(player, commandName, targetName, ...)
    if not hasObjectPermissionTo(player, "function.kickPlayer", false) then
        outputChatBox("No tienes permiso para usar este comando.", player, 255, 0, 0)
        return
    end
    -- lógica de baneo aquí
end)
hasObjectPermissionTo consulta directamente el acl.xml, así que el control de quién puede banear no depende de una lista hardcodeada en el script, sino de los permisos reales configurados en el servidor.

Buenas prácticas al diseñar comandos

  • Valida siempre los argumentos antes de usarlos; un comando que falla silenciosamente o rompe el script por un argumento faltante es una mala experiencia para el jugador y un riesgo de estabilidad para el servidor.
  • Responde siempre algo al jugador, incluso si el comando falla ("uso incorrecto", "no tienes permiso", etc.). Un comando que no responde nada genera confusión.
  • No dupliques nombres de comando entre distintos recursos activos: si dos recursos registran el mismo comando, solo uno terminará ejecutándose y puede ser difícil de depurar.
  • Sepára la lógica de negocio de la validación, sobre todo en comandos administrativos, para que sea fácil de mantener a medida que el gamemode crece.
Aporte por:
Nicolas ECM
Udemy

Curso Programación en LUA para MTA

Aprende a programar desde 0 hasta avanzado con ejercicios prácticos

🔥 Ver Curso en Udemy