MTA Team 0xCiBeR Posted September 2, 2014 MTA Team Share Posted September 2, 2014 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
Tomas Posted September 2, 2014 Share Posted September 2, 2014 Me ha servido un poco para entender el OOP, buen aporte!. Link to comment
AlFA# Posted September 4, 2014 Share Posted September 4, 2014 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
MTA Team 0xCiBeR Posted September 5, 2014 Author MTA Team Share Posted September 5, 2014 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
Tomas Posted October 3, 2014 Share Posted October 3, 2014 (edited) 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 Edited October 3, 2014 by Guest Link to comment
Castillo Posted October 3, 2014 Share Posted October 3, 2014 local bodyParts = { 3="Torso", 4="Culo", 5="Brazo izquierdo", 6="Brazo derecho", 7="Pierna izquierda", 8="Pierna derecha", 9="Cabeza", } Te faltan los brackets delante y atras de los numeros. Link to comment
Tomas Posted October 3, 2014 Share Posted October 3, 2014 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
Alexs Posted October 3, 2014 Share Posted October 3, 2014 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
Tomas Posted October 3, 2014 Share Posted October 3, 2014 Ya lo arreglé, gracias Solid. y Alex. Link to comment
Castillo Posted October 4, 2014 Share Posted October 4, 2014 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
Renkon Posted January 8, 2015 Share Posted January 8, 2015 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
alex17 Posted January 28, 2015 Share Posted January 28, 2015 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
UserToDelete Posted April 3, 2015 Share Posted April 3, 2015 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
aka Blue Posted October 2, 2015 Share Posted October 2, 2015 (edited) 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 October 6, 2015 by Guest Link to comment
DBY Posted October 2, 2015 Share Posted October 2, 2015 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
aka Blue Posted October 4, 2015 Share Posted October 4, 2015 Arreglado. Gracias @Dannys, no me di cuenta Link to comment
aka Blue Posted October 4, 2015 Share Posted October 4, 2015 (edited) 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 October 6, 2015 by Guest Link to comment
Castillo Posted October 5, 2015 Share Posted October 5, 2015 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
Kilfwan Posted October 5, 2015 Share Posted October 5, 2015 (edited) ¿Si no has testado el script para saber si funciona para que posteas? PD:El timer esta al revez, Solid lo dice. Edited October 5, 2015 by Guest Link to comment
aka Blue Posted October 5, 2015 Share Posted October 5, 2015 @Kilfwan Deja de hacerte el listo, gracias. PD: No es que tenga todo el tiempo del mundo para ir testeando cosas. Se supone que esto es para aportar, ¿no?, pues ya esta. PD2: Código corregido, gracias @Solid por aclarar, no me di cuenta de ello. Link to comment
Castillo Posted October 5, 2015 Share Posted October 5, 2015 El primer outputChatBox lo vera todo el servidor, ya que no pusiste al jugador en el argumento visibleTo. Link to comment
Tomas Posted October 5, 2015 Share Posted October 5, 2015 También te falta agregar un argumento en el timer, ya que setTimer tiene su propia variable pre-definida 'source'. Link to comment
UserToDelete Posted October 6, 2015 Share Posted October 6, 2015 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 Link to comment
Calculador Posted October 6, 2015 Share Posted October 6, 2015 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
Recommended Posts