-
Posts
1,279 -
Joined
-
Last visited
-
Days Won
3
Everything posted by Disinterpreter
-
Военкомату, например важно.
-
Жалко чтоли? От того, что ты им объяснишь, клоны не появятся
-
Смотри. Прежде всего в функции cars:paintjob должны быть (). Далее. У тебя есть таблица cars. Это и есть класс для твоего автомобиля. Логичнее ее бы называть в единственном числе: car, но дело твое. Этот класс (таблица) и будет содержать общие функции для всех экземпляров твоего класса "cars". Собственно ты это и делаешь когда объявляешь: cars = {} function cars:new (o) -- Some stuff end function cars:paintjob() -- Все таки должны быть здесь скобки "()" -- Some stuff end Класс, кроме общих функций должен иметь и общие и дефолтные свойства, как я вижу из твоего кода: model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text". В таком случае добавляем к нашему классу "cars" метатаблицу: cars = {} setmetatable(cars, {__index = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"}}) function cars:new (o) -- Some stuff end function cars:paintjob() -- Some stuff end Таким образом мы выставили свойства model, x, y, ... классу. Все экземпляры класса будут по умолчанию иметь эти свойства. То есть все поля таблицы сейчас выглядят так: model = 566, x = 1421.6, y = -1345.9, z = 13.6, rx = 0, ry = 0, rz = 0, carText = "Text", -- Это свойства класса new = function () -- Some stuff end, paintjob = function () -- Some stuff end -- А это методы класса Далее тебе нужно "инициализировать" класс, т.е. "создать объект". Все в кавычках, потому что перед нами Lua, а не ООП-язык. "Конструктором" нам служит new(). В нем будет рождаться экземпляр класса. Что такое экземпляр класса (или объект) в Lua? Это новая таблица, которая имеет своей метаблицей таблицу класса, т.е. твою таблицу "cars". Мы в "конструкторе" new() создаем новую пустую таблицу и присваиваем ей класс-таблицу cars как метатаблицу, вот так: cars = {} setmetatable(cars, {__index = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"}}) function cars:new (o) local carObject = {} -- это и есть наш экземпляр класса cars, пока пустой setmetatable(carObject, {__index = self}) -- а теперь он имеет все свойства и методы (включая paintjob()) класса cars. Это ключевая вещь, все волшебство именно здесь. -- Здесь добавить создание игрового объекта Vehicle: createVehicle и так далее return carObject end function cars:paintjob() -- Some stuff end Важный момент, для того чтобы потом обращаться к экзмепляру класса (объекту) мы должны его возвращать. Можно возвращать сам объект-таблицу "carObject", а "carObject"-ы хранить в отдельной таблице под индексами. В своем проекте я поступаю иначе и, как мне кажется, изящнее - я сам класс делаю хранилищем созданных экземпляров класса. Но это уже другая история. У нас еще остался маленький нюанс - аргумент o, передаваемый в конструктор и который может содержать индивидуальные свойства для каждого экзмепляра класса. Скажем model может быть не 566, а 577, другая позиция или другой carText. Или вовсем добавлено новое свойство, например, color. В этом случае мы поступаем так: 1. Рождаем экземпляр класса как и раньше. 2. Проверяем, если o не пустое значение, то к нам приехала индивидуальная таблица. 3. Делаем этой таблице o метатаблицу наш инициализированный экземпляр класса carObject. То есть по сути мы делаем эту таблицу экзмепляром класса, а ее родителем - carObject. 4. Присваиваем carObject = o, чтобы остаток кода в методе (пока это только "return carObject") сработал как надо. cars = {} setmetatable(cars, {__index = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"}}) function cars:new (o) local carObject = {} -- это и есть наш экземпляр класса cars, пока пустой setmetatable(carObject, {__index = self}) -- а теперь он имеет все свойства и методы (включая paintjob()) класса cars. Это ключевая вещь, все волшебство именно здесь. if (o) then setmetatable(o, {__index = carObject}) carObject = o end -- Здесь добавить создание игрового объекта Vehicle: createVehicle и так далее -- Затем полученный мта-объект засовываем в carObject, например carObject.element = vehicleElement return carObject end function cars:paintjob() -- Здесь берем self.element и красим его, например, setVehiclePaintjob(self.element, 2) end Все теперь мы можем делать как тебе нужно: cars = {} setmetatable(cars, {__index = {model = 566, x = 1421.6, y = -1345.9, z = 13.6 , rx = 0, ry = 0, rz = 0, carText = "Text"}}) function cars:new (o) local carObject = {} -- это и есть наш экземпляр класса cars, пока пустой setmetatable(carObject, {__index = self}) -- а теперь он имеет все свойства и методы (включая paintjob()) класса cars. Это ключевая вещь, все волшебство именно здесь. if (o) then setmetatable(o, {__index = carObject}) carObject = o end -- Здесь добавить создание игрового объекта Vehicle: createVehicle и так далее -- Затем полученный мта-объект засовываем в carObject, например carObject.element = vehicleElement return carObject end function cars:paintjob() -- Здесь берем self.element и красим его, например, setVehiclePaintjob(self.element, 2) end local car1 = cars:new() trace(cars1.model) -- 566 trace(cars1.color) -- nil local car2 = cars:new({model = 577}) trace(cars2.model) -- 577 trace(cars2.color) -- nil local car3 = cars:new({model = 588, color="white"}) trace(cars3.model) -- 588 trace(cars3.color) -- white cars2:paintjob() -- красим cars2 Вроде весь твой вопрос расписал. Вот так собственно выглядит принцип наследственности в Lua. Использовать необязательно, но просто необходимо знать и понимать всем кто называет себя знающим Lua. Я специально перегрузил текст терминами "экземпляры класса", "классы" и др., потому что считаю что их использовать надо, это полезно. Lua - крутой язык, мне нравится в Lua полно недостатков, особенно в 5.1. А урок Kernell'a гораздо лучше https://forum.multitheftauto.com/viewtopic.php?f=153&t=57987 (в плане пояснения метатаблиц) Да и зачем строить классы самому, когда есть куча различных библиотек?
-
BABALITY
-
MTA DayZ | Вопросы и ответы
Disinterpreter replied to CubaSalvador's topic in Помощь / Отчеты об ошибках
Надо было генту ставить. Ну или ArchLinux хотяб. -
Как в LuaBind?
-
Русские доки / мануалы / туториалы по Lua и MTASA
Disinterpreter replied to MX_Master's topic in Скриптинг
Боже мой, луа прост как 5 копеек. Массивы всегда ассоциативные, типизация утиная, синтаксис понятный для новичка и многое другое, если вы не можете осилить Lua, что вы делаете в программировании тогда? > В случае с теми же PHP и PAWN, где-нибудь, но вам обязательно разжуют самые элементарные вещи. Есть вики, все основы даны, распинаться делать уроки для идиотов на этом форуме никто не будет. Сложности возникают у павн программистов которые пришли из сампа в МТА, они не могут понять МТА т.к само мташное API выглядит совсем иначе и похоже на API какого-то игрового движка. -
Русские доки / мануалы / туториалы по Lua и MTASA
Disinterpreter replied to MX_Master's topic in Скриптинг
А чем тебе луа не простой? -
Русские доки / мануалы / туториалы по Lua и MTASA
Disinterpreter replied to MX_Master's topic in Скриптинг
Особенно в сквиреле... На луа документаций - жопой ешь. Это не павн, который используется в одном мультиплеере и 3х мп3 плеерах. -
В "mta with samp object" их не добавили, а заменили. Добавили.
-
Но их создатели мта не добавляют, лол. МТА эт свободный проект. Кто-то взял и добавил, ищите разработчика форка и спрашивайте его.
-
Зачем вобще туда лезть? То что вы пытаетесь что-то доказать людям на подобных быдло-форумах, только лишь опускает вас в глазах других. Не нужно опускаться до их уровня. Ибо опять разведёте холивар который нужен по факту только им. Давно пора бы себя ограничить от такого рода "сообществ". Вообще если пойти дальше > форум > 2014
-
get("mysql.username") А на счет кавычек - RTFM
-
1. get 2. mysql_ping теоретически можно, а ескейп не нужен, на счет остального, вроде как можно.
-
https://wiki.multitheftauto.com/wiki/Meta.xml cache: When the script file type is "client", this setting controls whether the file is saved on the clients' hard drive. Default is "true". Using "false" will mean the file is not saved.
-
https://wiki.multitheftauto.com/wiki/CreateWeapon и приаттачить к машине.
-
О мои "сборки" сливать разрешаю (они и так на гитхабе, мне пиар ) То, что вы так боитесь за ваш код это сугубо ваши проблемы.
-
Дебаг пробовал смотреть? getAccountName принимает первым аккаунт а не игрока
-
У меня просто технический склад ума и я постоянно стремлюсь к совершенствованию. Более того о таких вещах можно было бы просто догадаться, если вы конечно знаете как устроены компьютеры. Автобусы у вас тоже ходят в точности по расписанию? Или всё таки они попадают в пробки, застревают на остановках? А я просто забыл о onClientSoundStopped
-
Я думаю можно всё это сделать в onClientRender нежели в таймере, но это моё мнение.
-
getElementPosition?
-
Но с русским так не получилось =) Ниасилил
-
https://wiki.multitheftauto.com/wiki/PlaySound3D https://wiki.multitheftauto.com/wiki/GetSoundLength https://wiki.multitheftauto.com/wiki/GetSoundPosition Скорей всего. Может забыл что нибудь.