Search the Community

Showing results for tags 'callbacks'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Multi Theft Auto: San Andreas 1.x
    • Support for MTA:SA 1.x
    • User Guides
    • Open Source Contributors
    • Suggestions
    • Ban appeals
  • General MTA
    • News
    • Media
    • Site/Forum/Discord/Mantis/Wiki related
    • MTA Chat
    • Other languages
  • MTA Community
    • Scripting
    • Maps
    • Resources
    • Other Creations & GTA modding
    • Competitive gameplay
    • Servers
  • Other
  • Archive
  • Private Bugtracker

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


About Me


Gang


Location


Occupation


Interests

Found 2 results

  1. MTA-Communication-Enchantment This is an enchantment that allows you to communicate between clientside and serverside a bit easier. If you know how to work with events, then you probably do not need this, but it has some nice features which allows you to sit back and write less code + achieve some nice results. Note: It is important to keep in mind that this is an enchantment. Which means it is just an layer on top of the basic functionalities of MTA. And most enchantments come with a cost, in this case that is bit of performance. I will keep the information of topic to the minimal, as I have written most of the information already on the repository. You can find the repository here. Examples Syntax Installation What can you do with it? Calling from clientside to serverside Client callServer("hello") Server function hello () outputChatBox("Hello client!") end Calling from serverside to clientside Server addCommandHandler("callclient", function (player) -- An addCommandHandler is needed, because the client hasn't loaded it's scripts yet. callClient(player, "hello") end, false, false) Client function hello () outputChatBox("Hello server!") end Ok, ok, that was boring. The next one this is a bit nicer! Hello are you there? Just Call-me-back... I miss(ed) you too Callback Client callServer( "callbackMe", "argument", function (argument) -- < This is the callback function outputChatBox(argument) end ) Server function callbackMe (argument) return argument .. " < I looked at it :)" end Callback + internal arguments Sometimes you have arguments that you simply can't send over. > functions Or arguments that shouldn't be send over. > LARGE quantities of database data Internal arguments can be used to pass information to a callback without exposing it to the other side(client/server). Client callServer( "callbackMe", -------------------------------- -- arguments that are send over "argument", -- -------------------------------- function (internalArgument, argument) -- < This is the callback function. outputChatBox(internalArgument) outputChatBox(argument) end, -------------------------------- -- arguments that are not send over "internalArgument" -- < internal argument -- -------------------------------- ) Server function callbackMe (argument) return argument .. " < I looked at it :D" end Ha! Serverside what is that? No need for complicated things! Communicate between clients without writing a single line of serverside. Magic! Note: There is serverside used behind the scenes, you just don't have to write it. Client function smile (player) outputChatBox((isElement(player) and getPlayerName(player) or "[unknown]") .. " has send you a: :)") local x, y, z = getElementPosition(localPlayer) setElementPosition(localPlayer, x, y, z + 100) end addRemoteClientAccessPoint(smile) -- < This function allows other clients to call this function. --------------------------------------- -- -- function getPlayerFromPartialName(name) local name = name and name:gsub("#%x%x%x%x%x%x", ""):lower() or nil if name then for _, player in ipairs(getElementsByType("player")) do local name_ = getPlayerName(player):gsub("#%x%x%x%x%x%x", ""):lower() if name_:find(name, 1, true) then return player end end end end -- Author: TAPL -- https://wiki.multitheftauto.com/wiki/GetPlayerFromPartialName -- -- --------------------------------------- addCommandHandler("smile", function (cmd, playerName) local player = getPlayerFromPartialName(playerName) if player then outputChatBox("Sending smile!") callRemoteClient(player, "smile", player) else outputChatBox("Can't find player!") end end) Turtle, I will wait for you to catch up. So don't worry, you are still cute. Await functions When a player has joined the server, he or she doesn't have download + loaded his scripts yet. This means that you can't deliver your love letter yet and all your work will be for nothing. But what if you don't have to worry about that? You can just wait now! Server addEventHandler("onPlayerJoin", root, function () callClientAwait(source, "testCallClientAwait") end) Client function testCallClientAwait () outputChatBox("Yes this works!") end Security Worried about security issues? Remote calls for C++/MTA functions have been blocked. There is a whitelist feature included, if enabled your code can only remote-call whitelisted functions. (this is disabled by default) Read the docs for that. Here and here
  2. ¿Qué es un callback? Como la palabra en inglés lo indica un callback es una “llamada de vuelta”. Es simple: llamo a una funcion y le envío por parámetro otra función (un callback) esperando que la función que llamé se encargue de ejecutar esa función callback. Concepto de google. Siendo más explicito, es una funcion a la cual le vamos a pasar como parametro otra función, esperando que esta se encargue de ejecutarla. ¿Cuando es necesario usar un callback? Desde mis inicios en MTA hasta en la actualidad no he visto ningún Scripter que haya empleado el uso de un callback, yo me familiarize con este concepto cuando empeze a trabajar con C# y realmente es muy útil para muchas situaciones. Por ejemplo un uso que yo le di en MTA, fue cuando desarrolle un sistema de Ventanas de dialogo para mi sistema de grupos ( basado en el MessageBox de C# ), como parametros a esta funcion para las ventanas de dialogo, fueron 2: Tipo de ventana ( SI/NO, OK, SI/NO/CANCELAR ) Funcion de callback En el primer argumento enviaba el tipo de ventana y en el segundo argumento la funcion a ejecutar como callback, esta funcion iba a ser empleada de tal forma que cuando un jugador de click al boton SI la funcion de callback seria ejecutada enviando parametros adicionales indicando que boton fue clickeado. Ahora les daré un pequeño ejemplo: Crearemos una funcion que se encargará de insertar productos en una Base de datos, la cual queremos que después de ejecutar la sentencia SQL, ejecute otra funcion que imprima un mensaje. local data_base = dbConnect( "sqlite", "sql.db" ) dbFree( dbQuery( data_base, "CREATE TABLE IF NOT EXISTS producto ( codigo STRING, producto STRING, precio INT )" ) ); -- funcion que sera usada para el callback function mensajeDB( text ) outputServerLog(text) end function insertarDatos( cmd, funcion_mensaje ) -- Ejecutamos el código SQL dbExec( data_base, cmd ) -- Luego de esto vamos a ejecutar la funcion enviada para imprimir el mensaje indicando que los datos fueron insertados correctamente funcion_mensaje( "Datos insertados" ); end -- Aqui estamos enviando como primer argumento un codigo SQL para que se inserte en la base de datos -- Como segundo argumento estamos enviado a la funcion mensajeDB que será ejecutada una vez se inserten los datos en la DB. insertarDatos( "INSERT INTO producto( codigo, producto, precio ) VALUES( '00001', 'Computadora', 276.89 )", mensajeDB ) Bien, en la funcion de insertarDatos estamos enviando como primer parametro una sentencia SQL, en el segundo estamos enviando la funcion mensajeDB que se encargaria de imprimir un mensaje en la consola. Cuando usamos esta funcion lo primero que se hizo fue ejecutar la sentencia SQL y luego de esto la funcion que se encargaría de imprimir el mensaje, pero como nos fijamos el segundo argumento de insertarDatos se llama 'funcion_mensaje', la cual estamos ejecutando como una función normal mandando una Cadena de texto como argumento, Esto no afectara en absoluto la función original mensajeDB. Espero haber sido lo más especifico posible intentando explicar el concepto de los callbacks en Lua, puede ser usado en muchos ambitos.. Aparte de yo hacer uso de la misma en un sistema de Ventanas de dialogo, tambien la emplee creando mi propio sistema de eventos el cual dejare como aporte a continuación: --[[ * ******************************************* * * Developed by: -Rex- * * Last modified: - * * Description: * * ******************************************* * ]]-- events = {} events.handled = {}; events.callbacks = { }; function exec_event( event_name, ... ) local arguments = { ... }; arguments.lenght = #arguments; local event_callback = function( event_name, arguments ) for i, _function in ipairs(events.callbacks) do _function( event_name, arguments); end end if( events.handled[event_name] ~= nil ) then event_callback( event_name, arguments ); for i, _functions in ipairs(events.handled[event_name] or { }) do _functions( arguments ); end end end function handle_event( _function, event ) if ( not events.handled[event] ) then events.handled[event] = { }; end local result = false; if not exists_in_table( events.handled[event] ) then table.insert( events.handled[event], _function ) result = true; end if( not result ) then outputDebugString( "Event: [ ".. event .." ] already handled", 3, 255, 0, 0 ); return; end outputDebugString( "Event: [ ".. event .." ] handled", 0, 0, 255, 0 ); end -- //Este funcion se ejecuta cada que sucede un evento y retorna los argumentos del mismo ( En pocas palabras, un delegado ) function add_ecallback( _function ) if not exists_in_table( _function, events.callbacks) then table.insert( events.callbacks, _function ); outputDebugString( debug.getinfo(1,"n").name .." was added to events callback" ); else outputDebugString( debug.getinfo(1,"n").name .." was already been added" ) end end Funciones -- Esta funcion se encarga de añadir un evento. handle_event( _function, event_name ) -- Con esta funcion ejecutaremos un evento y podremos mandar parametros. exec_event ( event_name, ... arguments ) -- Esta funcion se ejecutara cuando cualquier evento añadido se ejecute, enviando a la funcion del callback el nombre del evento y sus argumentos. add_ecallback( _function ) Ejemplo de uso: -- Por ejemplo creamos un evento que notifique cuando se cree un grupo. function create_gp( creador, nombre_grupo, fecha_creacion ) outputChatBox( "El jugador: "..getPlayerName( creador ) .." fundo el grupo: "..nombre_grupo.." a la fecha: "..fecha_creacion, root, 255, 255, 255, true ) end handle_event( "on_player_create_group", create_gp ) -- Aquí ejecutaremos el evento enviando siertos argumentos, por ejemplo: -- El jugador X creo el grupo xNout a la fecha 18/04/2018 15:45 exec_event("on_player_create_group", player, "xNout", "18/04/2018 15:45" ) -- Resultado: --> El jugador: X fundo el grupo: xNout a la fecha: 18/04/2018 15:45 -- Cada vez que se cree un grupo el evento será ejecutado enviando todos los parametros que se le den.