Wikipedia MTA

Marcadores (markers) en MTA:SA: detectar zonas, teletransportes y misiones

Los markers son uno de los elementos más usados en MTA:SA para crear zonas interactivas: puntos de teletransporte, entradas a misiones, zonas seguras, tiendas, checkpoints de carrera, etc. Esta guía explica cómo crearlos y detectar cuándo un jugador entra o sale de ellos.

Crear un marker

local marker = createMarker(1959.5, -1714.7, 10.0, "cylinder", 1.5, 255, 0, 0, 100)
Los parámetros básicos son: posición (x, y, z), tipo de marker ("cylinder", "corona", "checkpoint", entre otros), tamaño y color (r, g, b, alpha).

Detectar cuándo un jugador entra al marker

addEventHandler("onMarkerHit", marker, function(hitElement, matchingDimension)
    if getElementType(hitElement) == "player" and matchingDimension then
        setElementPosition(hitElement, 1500.0, -1600.0, 15.0)
        outputChatBox("Has sido teletransportado.", hitElement, 0, 255, 0)
    end
end)
Es importante validar getElementType(hitElement) == "player" porque los markers también pueden ser activados por vehículos, y validar matchingDimension evita que el evento se dispare para jugadores en una dimensión distinta a la del marker.

Detectar cuándo un jugador sale del marker

addEventHandler("onMarkerLeave", marker, function(leftElement, matchingDimension)
    if getElementType(leftElement) == "player" then
        outputChatBox("Has salido de la zona.", leftElement, 255, 200, 0)
    end
end)
Esto es útil para zonas donde algo debe activarse solo mientras el jugador permanece dentro (por ejemplo, una zona de curación progresiva o una zona segura donde no se puede disparar).

Ejemplo práctico: zona segura sin daño

Combinando ambos eventos se puede construir una zona donde el jugador no recibe daño mientras está dentro:

local playersInSafeZone = {}


addEventHandler("onMarkerHit", safeZoneMarker, function(hitElement, matchingDimension)
    if getElementType(hitElement) == "player" and matchingDimension then
        playersInSafeZone[hitElement] = true
    end
end)


addEventHandler("onMarkerLeave", safeZoneMarker, function(leftElement, matchingDimension)
    if getElementType(leftElement) == "player" then
        playersInSafeZone[leftElement] = nil
    end
end)


addEventHandler("onPlayerDamage", root, function()
    if playersInSafeZone[source] then
        cancelEvent()
    end
end)

Buenas prácticas con markers

  • No abuses de la cantidad de markers activos en zonas muy transitadas: cada marker con eventos asociados agrega comprobaciones que el servidor debe procesar constantemente.
  • Limpia las tablas de estado (como playersInSafeZone en el ejemplo) cuando un jugador se desconecta, usando el evento onPlayerQuit, para evitar referencias a jugadores que ya no están conectados.
  • Usa dimensiones (matchingDimension) siempre que tu servidor maneje interiores o instancias separadas, para que los markers no se disparen entre dimensiones distintas por error.
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