Wikipedia MTA

Sistema de armas y daño en MTA:SA: funciones esenciales para tu gamemode

Casi cualquier gamemode de rol, guerra de facciones o deathmatch en MTA:SA necesita controlar cómo los jugadores reciben armas y cómo se procesa el daño. Esta guía repasa las funciones esenciales y cómo combinarlas de forma segura.

Dar armas a un jugador

giveWeapon(jugador, 22, 100) -- 22 = Pistola (Colt 45), 100 balas
El tercer parámetro es la cantidad de munición. Se puede llamar varias veces con distintos IDs de arma para equipar a un jugador con un kit completo.

Quitar armas

takeAllWeapons(jugador)
-- o una específica:
takeWeapon(jugador, 22)

Controlar la vida y la armadura

setElementHealth(jugador, 100)
setPedArmor(jugador, 50)

Detectar cuándo un jugador recibe daño (lado cliente)

El evento onClientPlayerDamage se dispara en el cliente del jugador que recibe el daño, y permite conocer quién lo atacó, con qué arma y cuánta vida perdió:

addEventHandler("onClientPlayerDamage", localPlayer, function(atacante, arma, zonaCuerpo, perdidaVida)
    outputChatBox("Recibiste " .. math.floor(perdidaVida) .. " de daño.")
end)

Cancelar o modificar el daño (lado servidor)

Para lógica como "zona segura sin daño" o "reducir el daño por facción", se trabaja con onPlayerDamage en el servidor, que sí permite cancelar el evento:

addEventHandler("onPlayerDamage", root, function(atacante, arma, zonaCuerpo, perdidaVida)
    if getElementData(source, "zonaSegura") then
        cancelEvent() -- anula el daño por completo
    end
end)

Ejemplo: sistema simple de respawn al morir

addEventHandler("onPlayerWasted", root, function()
    local jugador = source
    setTimer(function()
        if isElement(jugador) then
            spawnPlayer(jugador, 1958.33, 1343.12, 15.36)
            setElementHealth(jugador, 100)
            fadeCamera(jugador, true)
        end
    end, 5000, 1) -- respawn 5 segundos después de morir
end)

Buenas prácticas de seguridad

  • Nunca confíes en que el cliente reporte correctamente el daño causado: la validación de si un disparo fue válido (distancia, línea de visión, cooldown del arma) debe hacerse, en la medida de lo posible, del lado del servidor, precisamente porque el cliente puede ser modificado.
  • Ten cuidado con los valores de munición infinita o daño cero en pruebas: es fácil olvidar removerlos antes de pasar el gamemode a producción, dejando una vulnerabilidad evidente para los jugadores.
  • Combina esto con tu sistema de ACL para que solo administradores o roles específicos puedan usar comandos de arma ilimitada, invencibilidad, etc. durante moderación.
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