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 thensetElementPosition(hitElement, 1500.0, -1600.0, 15.0)outputChatBox("Has sido teletransportado.", hitElement, 0, 255, 0)endend)
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" thenoutputChatBox("Has salido de la zona.", leftElement, 255, 200, 0)endend)
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 thenplayersInSafeZone[hitElement] = trueendend)addEventHandler("onMarkerLeave", safeZoneMarker, function(leftElement, matchingDimension)if getElementType(leftElement) == "player" thenplayersInSafeZone[leftElement] = nilendend)addEventHandler("onPlayerDamage", root, function()if playersInSafeZone[source] thencancelEvent()endend)
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
playersInSafeZoneen el ejemplo) cuando un jugador se desconecta, usando el eventoonPlayerQuit, 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