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 balasEl 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") thencancelEvent() -- anula el daño por completoendend)
Ejemplo: sistema simple de respawn al morir
addEventHandler("onPlayerWasted", root, function()local jugador = sourcesetTimer(function()if isElement(jugador) thenspawnPlayer(jugador, 1958.33, 1343.12, 15.36)setElementHealth(jugador, 100)fadeCamera(jugador, true)endend, 5000, 1) -- respawn 5 segundos después de morirend)
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