Jump to content

Search the Community

Showing results for tags 'tut'.

  • 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
    • General
    • Multi Theft Auto 0.5r2
    • Third party GTA mods
  • Archive
    • Archived Items
    • Trash

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Member Title


Gang


Location


Occupation


Interests

Found 4 results

  1. Lua Metatables Guide Introduction Hello, I’m Shady, and I’m here with a new tutorial. At the bottom of this section, in the credits, you will find all the links to my other tutorials. Those should be your first priorities. I have prepared a tutorial that will help you explore metatables at an advanced level and set you on your way,The Lua programming language has gained popularity for its simple yet powerful syntax, making it a common choice for both game development and general-purpose programming. This guide will enable you to delve deep into the metatable feature of Lua and demonstrate how to apply object-oriented programming (OOP) concepts using metatables. Metatables are used to customize the behavior of tables in Lua and manage complex data structures. In this guide, we will focus on the following topics: What is a Metatable?: We will understand the concept of metatables and why they are used. Creating Classes with Metatables: We will create a simple Vector class and explore operator overloading methods. Inheritance: We will learn how to implement inheritance and override functions using metatables. Complex Scenarios: We will create more complex structures, such as a character class, using metatables in real-world applications. By the end of this guide, you will learn how to effectively utilize metatables in Lua, enhancing the functionality of your games or applications. So, let's step into the world of Lua metatables! What is Metatable? A metatable is a special table used to change the behavior of tables in Lua. With a metatable, you can inherit between tables and perform special operations. Creating Metatable... First, we need to create a metatable. We can define it as a simple table. myMetatable = {} Using Metatable in a Table To assign a metatable to a table, we use the setmetatable function myTable = {} setmetatable(myTable, myMetatable) Operator Overloading with Metatable Metatables can also be used for operator overloading. For example, let's define the __add function for addition. myMetatable.__add = function(t1, t2) return t1.value + t2.value end Adjusting the Values of Tables We can use the __index and __newindex methods in the metatable to set the values of tables. myMetatable.__index = function(table, key) return "Key not found: " .. key end myMetatable.__newindex = function(table, key, value) rawset(table, key, value) end Example of Use myTable.value = 5 local anotherTable = { value = 10 } setmetatable(anotherTable, myMetatable) local result = myTable + anotherTable print(result) -- 15 Metatable and Mapping Functions Metatables are used to provide functionality and inheritance relationships between tables in Lua. With special keys provided by the metatable, we can map between tables. Operator overloading functions like __index, __newindex, __add, and __sub allow us to change the behavior of tables. An Example in Depth: Vector Class Below, we will create a Vector class. This class will support addition, subtraction, and other vector operations. -- Creating the vector metatable Vector = {} Vector.__index = Vector -- Create a new vector function Vector:new(x, y) local vec = setmetatable({}, Vector) vec.x = x or 0 vec.y = y or 0 return vec end -- Vector addition function Vector:__add(other) return Vector:new(self.x + other.x, self.y + other.y) end -- Vector subtraction function Vector:__sub(other) return Vector:new(self.x - other.x, self.y - other.y) end -- Calculate vector length function Vector:length() return math.sqrt(self.x^2 + self.y^2) end -- Usage example local v1 = Vector:new(3, 4) local v2 = Vector:new(1, 2) local v3 = v1 + v2 print("Sum Vector:", v3.x, v3.y) -- 4, 6 print("Length of Vector 1:", v1:length()) -- 5 Metatables control the operations listed next. Each operation is identified by its corresponding name. The key for each operation is a string with its name prefixed by two underscores, '__'; for instance, the key for operation "add" is the string "__add". The semantics of these operations is better explained by a Lua function describing how the interpreter executes the operation. add": the + operation. The function getbinhandler below defines how Lua chooses a handler for a binary operation. First, Lua tries the first operand. If its type does not define a handler for the operation, then Lua tries the second operand. function getbinhandler (op1, op2, event) return metatable(op1)[event] or metatable(op2)[event] end By using this function, the behavior of the op1 + op2 is function add_event (op1, op2) local o1, o2 = tonumber(op1), tonumber(op2) if o1 and o2 then -- both operands are numeric? return o1 + o2 -- '+' here is the primitive 'add' else -- at least one of the operands is not numeric local h = getbinhandler(op1, op2, "__add") if h then -- call the handler with both operands return (h(op1, op2)) else -- no handler available: default behavior error(···) end end end "sub": the - operation. Behavior similar to the "add" operation. "mul": the * operation. Behavior similar to the "add" operation. "div": the / operation. Behavior similar to the "add" operation. "mod": the % operation. Behavior similar to the "add" operation, with the operation o1 - floor(o1/o2)*o2 as the primitive operation. "pow": the ^ (exponentiation) operation. Behavior similar to the "add" operation, with the function pow (from the C math library) as the primitive operation. "unm": the unary - operation. function unm_event (op) local o = tonumber(op) if o then -- operand is numeric? return -o -- '-' here is the primitive 'unm' else -- the operand is not numeric. -- Try to get a handler from the operand local h = metatable(op).__unm if h then -- call the handler with the operand return (h(op)) else -- no handler available: default behavior error(···) end end end "concat": the .. (concatenation) operation. function concat_event (op1, op2) if (type(op1) == "string" or type(op1) == "number") and (type(op2) == "string" or type(op2) == "number") then return op1 .. op2 -- primitive string concatenation else local h = getbinhandler(op1, op2, "__concat") if h then return (h(op1, op2)) else error(···) end end end "newindex": The indexing assignment table[key] = value. function settable_event (table, key, value) local h if type(table) == "table" then local v = rawget(table, key) if v ~= nil then rawset(table, key, value); return end h = metatable(table).__newindex if h == nil then rawset(table, key, value); return end else h = metatable(table).__newindex if h == nil then error(···) end end if type(h) == "function" then h(table, key,value) -- call the handler else h[key] = value -- or repeat operation on it end end "call": called when Lua calls a value. function function_event (func, ...) if type(func) == "function" then return func(...) -- primitive call else local h = metatable(func).__call if h then return h(func, ...) else error(···) end end end Override and Inheritance We can achieve inheritance using metatables in Lua. By creating subclasses and using the superclass's metatable, we can override some functions. -- 2D Vector Metatable Vector2D = setmetatable({}, Vector) Vector2D.__index = Vector2D -- Create a new 2D vector function Vector2D:new(x, y) local vec = Vector:new(x, y) setmetatable(vec, Vector2D) return vec end -- Rotate the 2D vector function Vector2D:rotate(angle) local cosA = math.cos(angle) local sinA = math.sin(angle) local newX = self.x * cosA - self.y * sinA local newY = self.x * sinA + self.y * cosA return Vector2D:new(newX, newY) end -- Usage example local v2d = Vector2D:new(1, 0) local v2dRotated = v2d:rotate(math.pi / 2) print("Rotated Vector:", v2dRotated.x, v2dRotated.y) -- 0, 1 More Complex scripts Metatables can be used to model complex data structures and behaviors. For example, we can create a class representing the attributes of a game character. -- Character metatable Character = {} Character.__index = Character function Character:new(name, health, power) local char = setmetatable({}, Character) char.name = name or "Unknown" char.health = health or 100 char.power = power or 10 return char end function Character:attack(target) target.health = target.health - self.power print(self.name .. " attacked " .. target.name .. "!") end -- Usage example local hero = Character:new("Hero", 150, 20) local monster = Character:new("Monster", 80, 15) hero:attack(monster) print(monster.name .. " remaining health: " .. monster.health) -- 60 NOT : Metatables form one of the foundations of object-oriented programming in Lua, allowing you to create complex structures and functionalities. In this guide, you learned how to create classes using metatables, inherit from them, and perform operator overloading. Metamethods: metatables and metamethods offer powerful functionality that enhances the flexibility and behavior of tables. Metatables allow you to customize the behavior of tables, while metamethods are functions that define this behavior. This tutorial will explore the fundamentals of these concepts with fun and practical examples,Metamethods are special functions defined within a metatable that get triggered when specific operations occur. Credits and Additional Resources Official Lua Documentation; Explore the official Lua documentation for comprehensive details on Lua features, including metatables. https://www.lua.org/manual/5.4/manual.html#2.4 https://www.lua.org/manual/5.1/manual.html#2.8 Lua 5.1 Reference Manual Lua 5.4 Reference Manual Metatable Events https://devdocs.io/lua~5.1/
  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.
  3. Hey guys. I found a video on YouTube (in German, sorry) that shows you how to install MTA syntax highlighting and autocomplete for Notepad++. You don't have to watch the video, but there are links in the video description (which I'll leave here) that leads to a forum and in there will be a download link (which I'll also leave here) for installing to Notepad++. And the reason why I'm recommending this version is because for whatever odd reason, JR10's way of doing it doesn't really come out the way I'd like it to be. Problems such as 'function' turn to white and MTA functions are blue and also everything is in a thinner font which is hard to read, so I don't like that. So with this version, things like function names are highlighted in red, it's the same font thickness, and all the up to date functions are also highlighted. If you don't like the autocomplete, just go to Settings > Preferences > Auto-Completion > and uncheck 'Enable auto-completion on each input'. And that's pretty much it. Hope it makes things a lot easier for you. https://www.youtube.com/watch?v=tyXEm--h3EU https://www.mta-sa.org/thread/4117-1-3-5-1-4-lua-mta-erweiterung-für-notepad/?pageNo=9 https://www.mta-sa.org/attachment/2508-1-5-1-lua-mta-erweiterung-für-notepad-zip/
  4. السلام عليكم ورحمة الله وبركاتة الكثير كان يبحث عن برنامج الـ MTA Editor اللي كان يدعمة ويبرمجة @50p لكنة الان توقف عن دعم البرنامج بسبب الاخطاء والمشاكل اللي واجهها فية هذا البرنامج اللي اسمة Sublime Text 3 نفس الـ Notepad+ لكن 50p مسوي اضافة عليه بحيث ضايف جميع وظائف الام تي اي في الـ LUA وان ماكانت جميعها فـ اغلبها طريقة التثبيت : قم بتحميل Sublime Text 3 من هنا : https://www.sublimetext.com/3 وبعد تحميل البرنامج وتثبيتة اتبع هذه الارشادات للتثبيت اضافة لغه LUA + MTA Functions : https://dl.dropboxusercontent.com/u/4370616/mtatools/SublimeText/50pMTAEditor.zip قم بتحميل الملف التالي بعد تثبيت البرنامج السابق : بعد تحميل الملف اذهب الى المسار التالي : C:\Users\\AppData\Roaming\Sublime Text 3\Packages\User\ 50pMTAEditor قم بانشاء مجلد جديد باسم 50pMTAEditor.zip استخرج محتويات هذا الملف في المجلد الذي قمت بانشائة في الخطوة السابقة قم بتشغيل برنامج Sublime Text 3 قم بانشاء ملف جديد File > New هذه الخطوة ضرورية بعد استخراج محتويات المجلد المضغوط للتحقق من عمل الصيغه والوظائف مع البرنامج بعد ذلك اذهب الى الاعلى في الخيارات واتبع الاتي view > syntax > LUA(MTA:SA) لتحديد الالوان الخاصة بالوظائف مثل الكلنت سايد والسيرفر سايد والمشتركة اتبع الآتي Preferences > Color Scheme > User > 50pMTAEditor > Monokai-MTA-Edit وهنا تكون انتهيت من تثبيت البرنامج والساينتكس الخاصة بلغة لوا ووظائف ام تي اي --------------------------------------------------------------------------------------- تنبية ** NOTE : قد يكون هناك مشكلة في مسار الملف التالي : C:\Users\\AppData\Roaming\Sublime Text 3\Packages\User\ لذلك عندما تذهب للمسار قد لايكون هناك المجلد User اذا لم تجد المجلد قم بانشاء مجلد جديد بالاسم User وقم بانشاء المجلد الذي في الخطوة رقم 3 داخل المجلد الجديد الذي انشئتة وهو User --------------------------------------------------------------------------------------- ماهي الفائدة من عمل هذه الطريقة؟ هذه الطريقة استعملها شخصياً في برمجة المودات وكتابة السكربتات والاكواد تسهل عملية كتابة الكود والوظائف تضع لك الوظائف بالارقمنت الخاص بها عند كتابة اول حرف ستظهر لك الوظائف بشكل مرتب وتدريجي في الايديتور اتمنى للجميع التوفيق واللي تحصل معه مشكلة يطرحها وبساعدة في تثبيت البرنامج واضافة 50p جميع حقوق الاضافة تعود لـ 50p والسلام عليكم ورحمة الله وبركاتة
×
×
  • Create New...