Jump to content

Search the Community

Showing results for tags 'class'.

  • 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 2 results

  1. I was making a new script with classes for mta, and i need to set a timer inside a method like this. function WorldGrid:updatePlayerZone(player) -- DOING NON RELEVANT SHI T HERE outputChatBox("worldGrid: " .. tostring(worldGrid) .. " player: " .. tostring(player)) setTimer(self:updatePlayerZone, 4000, 1, player) end end This couldnt even compile, because self:updatePlayerZone is not recognized as a function. So.. i checked setTimer mta wiki page. it says: theFunction: The function you wish the timer to call. (Notice: Do not use a 'local' function, it must be global!) So, i need to call a global function on setTimer. I tryed out this: function updatePlayerZoneWrapper(worldGrid, player) outputChatBox("worldGrid " .. tostring(worldGrid) .. " player: " .. tostring(player)) worldGrid:updatePlayerZone(player) end function WorldGrid:updatePlayerZone(player) outputChatBox("worldGrid before: " .. tostring(self) .. " player before: " .. tostring(player) setTimer(updatePlayerZoneWrapper, 4000, 1, self, player) end end But it didnt work neither.. I get: Attempt to call method 'updatePlayerZone' (a nil value) I continued reading setTimer wiki page, and i found this: arguments: Any arguments you wish to pass to the function can be listed after the timesToExecute argument. Note that any tables you want to pass will get cloned, whereas metatables and functions/function references in that passed table will get lost. Also changes you make in the original table before the function gets called won't get transferred. So, im coming to you guys, hoping you have a possible solution for this. Thanks for your time
  2. Сразу оговорюсь, данный урок требует основных знаний о таблицах Lua На самом деле в просторах сети полно учебников по данной теме, поэтому решил я написать этот учебник просто потому что его тут нет (естественно копировать всё из других учебников я не стану, а постараюсь рассказать своими словами) Зачем это нужно В целом, всё это, позволяет нам изменить поведение Lua в определённых ситуациях 1. Возможность реализации ООП в Lua 2. Перегрузка операторов (это так же может быть необходимым для П.1) Что это такое Метатаблица - это обычная таблица в которой описываются определённые события (например сложение, вычитание, сравнивание и т.д.) В качестве названия события выступает индекс таблицы, а её значение - обработчик события (метод) Как использовать Для использования достаточно просто обозначить таблице нашу мета-таблицу MyTable = {}; MyTableMeta = { __index = MyTable }; setmetatable( MyTable, MyTableMeta ); Методы нашей мета-таблицы можно определить в любое время, в силу для таблицы они вступают сразу после определения. Ниже список всех доступных событий и их описание __index( self, key ) чтение по ключу __newindex( self, key, value ) запись по ключу __call( self, ... ) вызов как функции __add( self, arg ) сложение __sub( self, arg ) вычитание __mul( self, arg ) умножение __div( self, arg ) деление __mod( self, arg ) остаток от деления __pow( self, arg ) возведение в степень __unm( self ) унарный минус __concat( self, arg ) конкатенация строк __len( self ) длина __eq( self, arg ) оператор "равно" __lt( self, arg ) оператор "меньше" __le( self, arg ) оператор "меньше или равно" __tostring( self ) Вызывается при попытке перевести объект в строковое представление (например с помощью функции tostring) __gc Вызывается для userdata-объектов при сборке мусора __metatable Если задать это поле в метатаблице, то getmetatable будет просто возвращать его значение, а setmetatable вернет ошибку. Пример Рассмотрим работу метатаблиц на примере события __call. Допустим мы хотим чтобы таблицу Vector3 можно было использовать как функцию. local Vector3 = {}; local Vector3_meta = { -- Добавляем наше событие __call = function( self, fX, fY, fZ ) -- self это указатель на нашу таблицу Vector3 return { X = fX, Y = fY, Z = fZ }; end; }; setmetatable( Vector3, Vector3_meta ); -- Устанавливаем метатаблицу для Vector3 Готово! Теперь если вызвать Vector3( 1, 2, 3 ) то нам вернётся новый объект - таблица с полями X, Y и Z. Теперь немного усложним задачу, дадим нашему объекту свою метатаблицу Vector3_meta_object = -- Это будет метатаблица для всех новых объектов { -- Добавляем событие сложения __add = function( vec1, vec2 ) -- vec1 - таблица слева, vec2 - таблица справа return Vector3( vec1.X + vec2.X, vec1.Y + vec2.Y, vec1.Z + vec2.Z ); -- Создаём новый объект end; }; Vector3 = {}; Vector3_meta = { __call = function( self, fX, fY, fZ ) local vecObject = { X = fX, Y = fY, Z = fZ }; setmetatable( vecObject, Vector3_meta_object ); -- Тут мы указываем метатаблицу нашему новому объекту return vecObject; end; }; setmetatable( Vector3, Vector3_meta ); -- Проверяем vec1 = Vector3( 12, 34, 56 ); vec2 = Vector3( 78, 90, 12 ); vec3 = vec1 + vec2; print( vec3.X, vec3.Y, vec3.Z ); -- 90 124 68 В итоге при сложении двух векторов (двух таблиц с этой метатаблицей), у нас получится новый объект с новыми X Y Z. print( vec3.X, vec3.Y, vec3.Z ); - На мой взгляд это немного не удобно, намного удобнее было бы просто передать вектор в функцию print, давайте исправим, для этого нам понадобится событие __tostring function Vector3_meta_object.__tostring( self ) return "( " .. self.X .. ", " .. self.Y .. ", " .. self.Z .. " )"; end -- Проверяем vec1 = Vector3( 12, 34, 56 ); vec2 = Vector3( 78, 90, 12 ); vec3 = vec1 + vec2; print( vec3 ); -- ( 90, 124, 68 ); Заключение Как видно на примерах, в этом нет ничего сложного. Как и говорилось выше, с помощью данного функционала можно реализовать полноценные классы. Есть пару библиотек которые автоматизируют этот процесс, одна из них идёт в комплекте с Lua (require "classlib"), а вторая валяется где-то тут. Задавайте свои вопросы, постараюсь на них ответить Материал написан специально для mtasa.com. Копирование запрещено
×
×
  • Create New...