Jump to content

[APORTE]Mini Scripts / Utiles / Nuevos


Recommended Posts

Bien, creo este post para que podáis ir posteando pequeños scripts útiles que puedan servir como base para la gente que recien esta empezando en Lua comprenda algunas cosas básicas. El que quiera ir aportando puede ir haciéndolo abajo y les agradezco las ganas. Pediré que el que no busque aportar y ayudar que se abstenga de responder. Esto no es un post de opinión sino un post de aporte para ayudar a los nuevos.

En cuanto al formato debe ser con lua tags y en lo posible explicar cada linea y su función.

Yo empezaré posteando un pequeño script para detectar si alguien ingresa el nombre de otro servidor en el chat ( posible publicidad) y efectua un kickeo inmediato.

Server-Side

local prohibidos = {"Servidor1","Servidor2","Servidor3"} --Aca se define los servidores o nombres prohibidos en forma de tabla. 
  
function check(msg) --Aca se inicia la función pasando el argumento de mensaje para tener el mensaje dentro de la función. 
for _, v in ipairs(prohibidos)do --Iniciamos un for-loop para loopear todos los servidores o nombres prohibidos. 
if msg == v then --Usamos una condicional para comprobar si es igual a algún nombre prohibido. 
source:kick("Prohibido publicidad de otros servidores.") --Si hay coincidencia y la condicional es pasada, efectuamos el kick especificando la razon. 
end --Cerramos la condicional 
end --Cerramos el for-loop 
end --Cerramos la funcion 
  
addEventHandler("onPlayerChat", root, check)--Aca agregamos el evento. 

Aclaración: Este script usa OOP y es solo compatible con las versiones de MTA 1.4 con OOP habilitado. Para mas info en como activar OOP dirigirse a este enlace: https://wiki.multitheftauto.com/wiki/OOP

La variante sin OOP seria esta:

  
local prohibidos = {"Servidor1","Servidor2","Servidor3"} 
  
function check(msg) 
for _, v in ipairs(prohibidos)do 
if msg == v then 
kickPlayer(source,"Prohibido publicidad de otros servidores.") 
end 
end 
end 
  
addEventHandler("onPlayerChat", root, check) 

Link to comment

Bueno, esto es un sistema que al poner /fuerza se pone la musculatura del CJ al máximo (Script sencilla)

Server-Side

function SistemaMusculatura(thePlayer, commandName) 
    if setPedStat(thePlayer, 23, 999) then --El ID 23 Es la fuerza, y 999 es  la máxima fuerza que se puede colocar. 
            outputChatBox("Bien echo, cada día estás más fuerte.") 
        else 
            outputChatBox("Ya eres demasiado fuerte.") 
    end  
end 
addCommandHandler("fuerte", SistemaMusculatura)  

Cabe añadir que esta fue mi primera scripter, por eso no esta tan ordenadada pero se puede entender.

Meta.xml

    "AlFa" version="1.0.0" type="script"/> 
    

Link to comment

Gracias por el aporte @Alfa.

Aca dejo otro. Este pequeño script genera un hash en base a un valor y una llave unica y la devuelve. Este tipo de hash puede ser utilizados como strings para transferir datos protegidos tales como contraseñas y demás.

PD: Este script NO representa una manera completamente segura de transferir datos, simplemente aumenta la seguridad.

  
function crearHash(tipo,valor,llave)--Creamos la funcion y definimos los argumentos que vamos a recibir 
    if tipo and valor and llave then--Condicional para comprobar si todos los argumentos son recibidos 
        if tipo == "md5" then--Primera condicional para comprobar el tipo de operacion a ejecutar 
            hashh = md5(valor .. llave)--Hasheo del valor mas la llave en MD5 
        elseif tipo == "sha256" then--Segunda condicional para comprobar el tipo de opearacion a ejecutar 
            hashh = sha256(valor .. llave)--Hasheo del valor mas la llave en SHA256 
        end--Cerramos la cadena de condicionales de tipo 
    end--Cerramos la condicional de argumentos 
    return hashh--Devolvemos el hasheo para su utilizacion 
end--Cerramos la funcion 
  
print(crearHash("md5","Hola mundo!","Mi Llave de seguridad"))--Utilizamos la funcion nativa de Lua para imprimir nuestro resultado. 
  
--El resultado seria: 20562582fcbaafd299d4016436fe43c1 

Cabe recordar que a partir de la versión 1.4.1 r6791 de MTA:SA se podrá utilizar la función hash que resume estas funciones.

Saludos!

Edit: Corregido, lo hice sin probar.(Gracias Solid)

Link to comment
  • 4 weeks later...

Un simple script que sirve para mostrar las bodyparts del evento onPlayerWasted/onClientPlayerWasted en español. Lo que hace este ejemplo es que cuando una persona muere sale en el chat quien lo mató, con que arma y en que parte del cuerpo EN ESPAÑOL

  
local bodyParts = { 
[3]="Torso", 
[4]="Culo", 
[5]="Brazo izquierdo", 
[6]="Brazo derecho", 
[7]="Pierna izquierda", 
[8]="Pierna derecha", 
[9]="Cabeza", 
} 
function onPlayerWasted(ammo,killer,weapon,bodypart,stealth) 
if killer and weapon and bodypart then 
outputChatBox("El jugador: "..getPlayerName(source).." murio. El asesino fue: "..getPlayerName(killer)..". Lo mato con el arma: "..getWeaponNameFromID(weapon).." en el/la "..bodyParts[tostring(bodypart)],getRootElement(),255,0,0) 
else 
outputChatBox("El jugador: "..getPlayerName(source).." murio por causas desconocidas.",getRootElement(),255,0,0) 
end 
end 
addEventHandler("onPlayerWasted",getRootElement(),onPlayerWasted) 
  
  

EDIT: Gracias Solid, no me había dado cuenta del error :lol:

Edited by Guest
Link to comment

Hmm, tenía entendido que los brackets se usan cuando no existe index, en este caso el index sería la id obtenida por el evento, lo pruebo y te digo. Tengo uno similar que traduce los países desde el ID obtenida por getPlayerCountry y me funcionó bien.

Link to comment
Hmm, tenía entendido que los brackets se usan cuando no existe index, en este caso el index sería la id obtenida por el evento, lo pruebo y te digo. Tengo uno similar que traduce los países desde el ID obtenida por getPlayerCountry y me funcionó bien.
local bodyParts = { 
3="Torso", 
4="Culo", 
5="Brazo izquierdo", 
6="Brazo derecho", 
7="Pierna izquierda", 
8="Pierna derecha", 
9="Cabeza", 
} 
  
for k, i in pairs( bodyParts ) do 
  print( k..''..i ) 
end 

OUTPUT: input:2: '}' expected (to close '{' at line 1) near '='

Te aconsejo echarle un ojo al siguiente tutorial: http://lua-users.org/wiki/TablesTutorial

Link to comment
Hmm, tenía entendido que los brackets se usan cuando no existe index, en este caso el index sería la id obtenida por el evento, lo pruebo y te digo. Tengo uno similar que traduce los países desde el ID obtenida por getPlayerCountry y me funcionó bien.

Entonces directamente borra los numeros, ya que en realidad, no son necesarios.

Link to comment
  • 3 months later...
Gracias por el aporte @Alfa.

Aca dejo otro. Este pequeño script genera un hash en base a un valor y una llave unica y la devuelve. Este tipo de hash puede ser utilizados como strings para transferir datos protegidos tales como contraseñas y demás.

PD: Este script NO representa una manera completamente segura de transferir datos, simplemente aumenta la seguridad.

  
function crearHash(tipo,valor,llave)--Creamos la funcion y definimos los argumentos que vamos a recibir 
    if tipo and valor and llave then--Condicional para comprobar si todos los argumentos son recibidos 
        if tipo == "md5" then--Primera condicional para comprobar el tipo de operacion a ejecutar 
            hashh = md5(valor .. llave)--Hasheo del valor mas la llave en MD5 
        elseif tipo == "sha256" then--Segunda condicional para comprobar el tipo de opearacion a ejecutar 
            hashh = sha256(valor .. llave)--Hasheo del valor mas la llave en SHA256 
        end--Cerramos la cadena de condicionales de tipo 
    end--Cerramos la condicional de argumentos 
    return hashh--Devolvemos el hasheo para su utilizacion 
end--Cerramos la funcion 
  
print(crearHash("md5","Hola mundo!","Mi Llave de seguridad"))--Utilizamos la funcion nativa de Lua para imprimir nuestro resultado. 
  
--El resultado seria: 20562582fcbaafd299d4016436fe43c1 

Cabe recordar que a partir de la versión 1.4.1 r6791 de MTA:SA se podrá utilizar la función hash que resume estas funciones.

Saludos!

Edit: Corregido, lo hice sin probar.(Gracias Solid)

Revivo para avisar que viendo el código, si el chabón pasa otra cosa que no sea ni md5 ni sha256 tirará error, podrías usar un ELSE en vez de un ELSEIF.

Buenos tutoriales.

Saludos

Link to comment
  • 3 weeks later...

Este pequeño scrip muestra la informacion del punto de mira de la sniper

muestra a que cosa le estas apuntando un ped , player, vehicle o objeto, y su respectiva informacion

local x1, y1 = guiGetScreenSize () 
local x = x1/1000 -- para compatibilidad con todas las resoluciones 
local y = y1/1000 -- 
  
local targetID = "" 
local Effect = "normal vision" 
  
function GoggleEffect() 
local weapon = getPedWeapon(getLocalPlayer()) 
  if  weapon == 34 then 
    if(getCameraGoggleEffect() == "normal")then 
        setCameraGoggleEffect("nightvision") 
         Effect = "#00ff00night #Ffffffvision" 
    elseif(getCameraGoggleEffect() == "nightvision")then 
        setCameraGoggleEffect("thermalvision") 
         Effect = "#B40486thermal #Ffffffvision" 
    elseif(getCameraGoggleEffect() == "thermalvision")then 
        setCameraGoggleEffect("normal") 
        Effect = "normal vision" 
    end 
  end 
end 
bindKey("F", "down", GoggleEffect) 
  
addEventHandler('onClientRender', getRootElement(), 
function() 
   local weapon = getPedWeapon(getLocalPlayer()) 
   local target = getPedTarget (  getLocalPlayer() ) 
     if getControlState('aim_weapon') then 
      if  weapon == 34 then       
        if ( target ) then 
                   local posx, posy = getElementPosition ( target ) 
                   local posx2, posy2 = getElementPosition ( localPlayer ) 
            if getElementType (( target ))=="vehicle" then  
               targetID = getVehicleName ( target )  
            elseif getElementType (( target ))=="object" then    
               targetID = getElementID (target ) 
            elseif getElementType (( target ))=="player" then        
               targetID = getPlayerName ( target ) 
            elseif getElementType (( target ))=="ped" then    
               targetID = "Model ["..getElementModel(target).."]" 
            end      
                     dxDrawText(Effect.." - [F]\n#00ff00target found #ffffff@"..math.ceil(getDistanceBetweenPoints2D ( posx, posy, posx2, posy2 )).."m\n"..getElementType ( target ).."\n"..targetID.."\n#ffffffHealth "..math.ceil(getElementHealth ( target )), x*10, y*530, 0, 0, tocolor(255, 255, 255, 255), y*2, "clear", "left", "top", false, false, true, true, false) 
            else 
                     dxDrawText( Effect.." - [F]\n#ff0000No Target", x*10, y*500, 0, 0, tocolor(255, 255, 255, 255), y*2, "clear", "left", "top", false, false, true, true, false) 
        end 
      end 
      else 
        setCameraGoggleEffect("normal") 
        Effect = "normal vision" 
   end 
end 
) 

liink : https://community.multitheftauto.com/ind ... s&id=10875

Link to comment
  • 2 months later...

Joinquit sencillito que muestra informacion para los administradores y demas staff.

Por si se quieren ir de listos y escaparse de un ban.

--Joinquit version para ADMINS 
database = { 
nombre = nil 
serial = nil 
} 
function onJoin () 
database.nombre = getPlayerName(source) 
database.serial = getPlayerSerial(source) 
    for k,pla in ipairs(getElementsByType("player")) do 
        if isObjectInACLGroup("user:"..getAccountName(getPlayerAccount(pla)), aclGetGroup({"Admin", "SuperModerator", "Moderator"})) then 
            outputChatBox("[Admin joinquit]: #FFFFFF"..database.nombre.." se ha unido al servidor", pla, 255,255,255,true) 
            outputChatBox("SERIAL: "..database.serial, pla, 255,255,255,true) 
        end 
    end 
    for k,play in ipairs(getElementsByType("player")) do 
        if not isObjectInACLGroup("user:"..getAccountName(getPlayerAccount(play)), aclGetGroup({"Admin", "SuperModerator", "Moderator"})) then 
        outputChatBox("#FFFFFF"..database.nombre.." se ha unido al servidor", play, 255,255,255,true) 
        end 
    end 
end 
  

Link to comment
  • 5 months later...

Un pequeño tazer el cual funciona con el arma Desert Deagle y sus funciones son las siguientes:

  • Se activa o desactiva con /tazer.
  • Al disparar a alguien le tazea por cierto tiempo el cual puedes establecer en el setTimer.

  
addCommandHandler ( "tazer"  
    function ( player ) 
        local modelo = getPedWeapon ( player ) 
        if ( modelo == 24 ) then 
            if ( getElementData ( player, "TAZER", false ) ) then 
                outputChatBox ( "Has activado el modo tazer de tu Deagle.", player, 0, 255, 120 ) 
                setElementData ( player, "TAZER", true ) 
            elseif ( getElementData ( player, "TAZER", true ) ) then 
                outputChatBox ( "Has desactivado el modo tazer de tu Deagle.". player, 0, 255, 120 ) 
                setElementData ( player, "TAZER", false ) 
            end 
        end 
    end 
) 
  
addEventHandler ( "onPlayerDamage", getRootElement (),  
    function ( attacker, weapon ) 
        if ( weapon == 24 and getElementData ( attacker, "TAZER", true )) then 
            if ( getElementType ( source ) == "player" ) then 
                setTimer ( function ( ) 
                setElementFrozen ( source, true ) 
                end, 10000, 1) 
                outputChatBox ( "Has tazeado a "..source, attacker, 0, 255, 120 ) 
                outputChatBox ( "Has sido tazeado.", source, 0, 255, 120 ) 
            end 
        end 
    end 
) 

Aviso: No lo he probado así que no estoy seguro si funciona al 100%. No obstante, lo dejo por aquí por si alguien lo necesita. Es bastante útil para Roleplay o RPG.

Créditos: Blue Pie.

Edited by Guest
Link to comment
Un pequeño tazer el cual funciona con el arma Desert Deagle y sus funciones son las siguientes:

  • Se activa o desactiva con /tazer.
  • Al disparar a alguien le tazea por cierto tiempo el cual puedes establecer en el setTimer.

activado = 0 
  
addCommandHandler ( "tazer", 
    function ( player ) 
        local modelo = getPedWeapon ( player ) 
        if ( modelo == 24 ) then 
            if ( activado == 0 ) then 
            outputChatBox ( "Has activado el modo tazer de tu arma.", player, 0, 120, 255 ) 
            setElementData ( player, "TAZER", true ) 
            activado = 1 
            elseif activado == 1 then 
            outputChatBox ( "Has desactivado el modo tazer de tu arma.", player, 0, 255, 120 ) 
            setElementData ( player, "TAZER", false ) 
            activado = 0 
            end 
        end 
    end 
) 
  
addEventHandler ( "onPlayerDamage", getRootElement (),  
    function ( attacker, weapon ) 
        if ( weapon == 24 and getElementData ( player, "TAZER", true )) then 
            if ( getElementType ( source ) == "player" ) then 
                setTimer ( function ( ) 
                setElementFrozen ( source, true ) 
                end, 10000, 1) 
                outputChatBox ( "Has tazeado a "..source, attacker, 0, 255, 120 ) 
                outputChatBox ( "Has sido tazeado.", source, 0, 255, 120 ) 
            end 
        end 
    end 
) 

Aviso: No lo he probado así que no estoy seguro si funciona al 100%. No obstante, lo dejo por aquí por si alguien lo necesita. Es bastante útil para Roleplay o RPG.

Créditos: Blue Pie.

Como es serverside si activa un player el taser, con esa variable global lo que vas a hacer es activarlo para todos los players.

Link to comment

Un pequeño script que hice con la función isPlayerInTeam. Lo que hace es lo siguiente:

  • Comprueba que el jugador está en el team 'mecánico'.
  • Si el jugador está en el team mecánico, puede reparar un vehículo haciendo click en el mismo.
  • El vehículo debe estar a una distancia mínima de 4.

  
function isPlayerInTeam(player, team) 
    assert(isElement(player) and getElementType(player) == "player", "Bad argument 1 @ isPlayerInTeam [player expected, got " .. tostring(player) .. "]") 
    assert((not team) or type(team) == "string" or (isElement(team) and getElementType(team) == "team"), "Bad argument 2 @ isPlayerInTeam [nil/string/team expected, got " .. tostring(team) .. "]") 
    return getPlayerTeam(player) == (type(team) == "string" and getTeamFromName(team) or (type(team) == "userdata" and team or (getPlayerTeam(player) or true))) 
end 
  
addEventHandler ( "onElementClicked", getRootElement ( ), 
    function ( theButton, theState, thePlayer ) 
    local x, y, z = getElementPosition ( thePlayer ) 
    local x1, y1, z1 = getElementPosition ( source ) 
    local distancia = getDistanceBetweenPoints3D ( x, y, z, x1, y1, z1 ) 
        if isPlayerInTeam ( thePlayer, "Mecanico" ) then 
            if ( getElementType ( source ) == "vehicle" ) then 
                if ( distancia < 4 ) then 
                    setElementFrozen ( thePlayer, true ) 
                    outputChatBox ( "Estás reparando el vehiculo, espera...", thePlayer, 0, 255, 120 ) 
                        setTimer( 
                            function ( thePlayer ) 
                                outputChatBox ( "Has reparado el vehículo "..getVehicleName ( source ).." satisfactoriamente.", thePlayer, 0, 255, 120 ) 
                                fixVehicle ( source ) 
                                setElementFrozen ( thePlayer, false ) 
                        end, 10000, 1) 
                end 
            end 
        end 
    end 
) 
  

Aviso: No he testeado el script así que no estoy seguro si funciona al 100%.

Créditos: Blue Pie.

Edited by Guest
Link to comment

Deberias probar los "aportes" que posteas, si no, ni los pongas, porque solo confundira a los usuarios.

De simple vista, puedo notar que es como si lo hubieses hecho alrevez, el contenido de la funcion que se ejecuta con el timer esta mal, esa parte deberia ser la que este antes de poner el timer.

Link to comment
Un pequeño tazer el cual funciona con el arma Desert Deagle y sus funciones son las siguientes:

  • Se activa o desactiva con /tazer.
  • Al disparar a alguien le tazea por cierto tiempo el cual puedes establecer en el setTimer.

  
addCommandHandler ( "tazer"  
    function ( player ) 
        local modelo = getPedWeapon ( player ) 
        if ( modelo == 24 ) then 
            if ( getElementData ( player, "TAZER", false ) ) then 
                outputChatBox ( "Has activado el modo tazer de tu Deagle.", player, 0, 255, 120 ) 
                setElementData ( player, "TAZER", true ) 
            elseif ( getElementData ( player, "TAZER", true ) ) then 
                outputChatBox ( "Has desactivado el modo tazer de tu Deagle.". player, 0, 255, 120 ) 
                setElementData ( player, "TAZER", false ) 
            end 
        end 
    end 
) 
  
addEventHandler ( "onPlayerDamage", getRootElement (),  
    function ( attacker, weapon ) 
        if ( weapon == 24 and getElementData ( player, "TAZER", true )) then 
            if ( getElementType ( source ) == "player" ) then 
                setTimer ( function ( ) 
                setElementFrozen ( source, true ) 
                end, 10000, 1) 
                outputChatBox ( "Has tazeado a "..source, attacker, 0, 255, 120 ) 
                outputChatBox ( "Has sido tazeado.", source, 0, 255, 120 ) 
            end 
        end 
    end 
) 

Aviso: No lo he probado así que no estoy seguro si funciona al 100%. No obstante, lo dejo por aquí por si alguien lo necesita. Es bastante útil para Roleplay o RPG.

Créditos: Blue Pie.

Has de recibir muchos creditos con esa variable "player" no existente, corrige eso anda :roll:

Link to comment
Un pequeño script que hice con la función isPlayerInTeam. Lo que hace es lo siguiente:

  • Comprueba que el jugador está en el team 'mecánico'.
  • Si el jugador está en el team mecánico, puede reparar un vehículo haciendo click en el mismo.
  • El vehículo debe estar a una distancia mínima de 4.

  
function isPlayerInTeam(player, team) 
    assert(isElement(player) and getElementType(player) == "player", "Bad argument 1 @ isPlayerInTeam [player expected, got " .. tostring(player) .. "]") 
    assert((not team) or type(team) == "string" or (isElement(team) and getElementType(team) == "team"), "Bad argument 2 @ isPlayerInTeam [nil/string/team expected, got " .. tostring(team) .. "]") 
    return getPlayerTeam(player) == (type(team) == "string" and getTeamFromName(team) or (type(team) == "userdata" and team or (getPlayerTeam(player) or true))) 
end 
  
addEventHandler ( "onElementClicked", getRootElement ( ) 
    function ( theButton, theState, thePlayer ) 
    local x, y, z = getElementPosition ( thePlayer ) 
    local x1, y1, z1 = getElementPosition ( source ) 
    local distancia = getDistanceBetweenPoints3D ( x, y, z, x1, y1, z1 ) 
        if isPlayerInTeam ( thePlayer, "Mecanico" ) then 
            if ( getElementType ( source ) == "vehicle" ) then 
                if ( distancia < 4 ) then 
                    setElementFrozen ( thePlayer, true ) 
                    outputChatBox ( "Estás reparando el vehiculo, espera..." ) 
                        setTimer( 
                            function ( thePlayer ) 
                                outputChatBox ( "Has reparado el vehículo "..getVehicleName ( source ).." satisfactoriamente.", thePlayer, 0, 255, 120 ) 
                                fixVehicle ( source ) 
                                setElementFrozen ( thePlayer, false ) 
                        end, 10000, 1) 
                end 
            end 
        end 
    end 
) 
  

Aviso: No he testeado el script así que no estoy seguro si funciona al 100%.

Créditos: Blue Pie.

Es buen aporte, pero he visto otro error que deberías corregir y este es la coma al lado del "getRootElement ( )", coma que es necesaria ó de lo contrario el script no funcionaría.

Link to comment
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...