Ktlo
-
Публикации
96 -
Зарегистрирован
-
Посещение
-
Победитель дней
9
Сообщения, опубликованные пользователем Ktlo
-
-
Фактически то же самое, что и эти два варианта реализации
Не, я так не думаю. В моём способе реализации сохранятся целостность строк (строки не путаются местами), существуют комментарии, и типы данных. А так же маленькая фича, которую я забыл упомянуть: строка
key = "string" #comment
идентично расшифровывается, как и
key="string" #comment
. Всё это по-моему очень важно для наглядного способа заполнения файла настроек пользователем.
-
Немного обновил библиотеку.
Изменения
- Устранил баг неправильной расшифровки массива.
- Добавил прямое индексирование для удобства.
- После некоторых раздумий понял, что всякие 0b и 34n будут не удобны пользователям, и переделал теперь можно использовать привычные false и 34.
- Добавил расшифровку обычного шестнадцатеричного числа (0x1234f56 например). Думаю, это будет удобнее для указания цветов.
-
Я не понимаю, в чём проблема то? Всего вариаций цветов 256 в OC, кодируем каждый цвет в один байт, и всё, нет проблем
. Ширина и высота будет определятся количеством символов в длину и количеством строк соответственно. Я даже представляю, как сжатие здесь применить. string.char(символ: string):number вам в помощь. -
По название не понятно, что это либа для рисования точек на очках. Какое-то непонятное название! AdvGLAPI — Adventure Graphics Library API? WUT?
Я думаю здесь имеется в виду Advanced Graphics Library API. Но название действительно лучше переделать, или написать в сообщении тогда уж.
-
Жаль, по логике должно работать(если ты проверял в интерпритаторе на сайте - он кривой)
Я проверял не на сайте, а в официальном интерпритаторе от создателей языка программирования. Версия - Lua 5.3, если что.
P.S. Утренняя переписочка
-
Всё это конечно здорово, но из-за того, что нет определённой направленности не очень удобно пользоваться. Например для если мне нужны несколько отдельных функций, зачем мне качать целую библиотеку, которая содержит много лишнего для работы? Но мне кажется, что здесь выделяются две направленности, и их можно разделить на две полноценные библиотеки.
-
Лучше бы сделал json парсер.
На самом деле и такое планирую, в основном для записи команд minecraft'а, этот способ нужен для построчного считывания, для того, чтобы не хранить весь текст файла сразу.
-
Представьте, что вы написали программу, и вам нужно, чтобы некоторые настройки этой программы сохранялись на диск и считывались, да так, чтобы сам файл настроек был читаем, содержал комментарии, легко редактируем с помощью текстовых редакторов и сохранял целостность самого файла после перезаписи (не путал строки). Всё выше перечисленное я добавил в эту небольшую библиотеку, и честно сказать результатом доволен.

Скачать можно коммандой с pastebin:
pastebin get qDRfwGX3 /libs/settings.lua
Функцииopen(path: string):object or nil, string — основная функция для загрузки настроек из файла. Принимает значение пути до файла, как строку и возвращает объект настроек. Если файл не удаётся открыть, то возвращает nil и причину неудачи.
convert(path: string, table: table or nil):object — эта функция конвертирует обычную таблицу Lua в объект настроек. Первый аргумент нужен для последующего сохранения по этому пути второй необязатильный, для тех случаев, когда вы создаёте новый чистый объект настроек.
decode(string: string, line: number):true, string, value, string — нужна для сугубо конкретных случаев, принимает строку типа " key = 365n #comment" и переводит в значения Lua. Сначала возвращает значение успеха, затем ключ, значение, либо при неудаче строку с ошибкой и nil. Четвёртое же возвращаемое значение комментарий строки если, есть. В данном примере вернёт true, "key", 365, "comment".
code(key: string, value: value, comment: string or nil, hex: boolean):true, string or nil, string — делает обратное действие функции decode(). Аргумент hex влияет на то, в какую систему счисления будут кодироваться числа. Если true то в шестнадцатиричную, иначе в десятичную.
Формат файла
В итоге вы можете получить файл с настройками, который может хранить любые значения Lua кроме таблиц (массивы хранить может), функций, потоков и userdata разумеется. При записи, вы можете увидеть нечто подобное:
# Комментарий первой строки здесь можно чего-нибудь пояснить string = "#1 строка \n #2 \"строка\"" #Такой комментарий спокойно работает и не конфликтует со знаком # в строке ч и с л о=FFFx #Число в шестнадцатеричном формате, не целое. string = 'строка' #В данном случае одинаковый ключ работать будет, если вы будете обращаться к строке. число = 23.842 число 2 = 23.842n boolean = FaLsE #false boolean_ = true #true boolean2 = 1b #true hex = 0x12Acd #Ниже можно увидеть массив array = {"строка", tRue, false, {34, {}, abcdefx}} #Массив в массиве, да, да так можно))) ничего = #агась, это работает)))А теперь поподробнее о каждом типе данных (жирным шрифтом выделены отличительные признаки):
- 34.028n, 2342.058 — десятичные числа, они не могут иметь дробную часть больше 3-ёх знаков, т.к. зачем?
- f30acdx — шестнадцатеричное число 15928.031. Оно также может хранить дробную часть, из-за чего его просто так расшифровать не выйдет.
- "строка \n\t\b#\"'" — обычная строка Lua, загружается с помощью функции load(), символ # не конфликтует с комментарием строки.
- 0b и 1b, true, false — тип данных boolean. true и false можно записывать, не учитывая регистр.
- {"36", 1b; {}, 34.028} — массив, хранит все типы данных, и отделяет их знаками , и ;.
- 0xabСdef — обычное шестнадцатеричное число. При сохранении в таком формате не записывается, но спокойно считывается, регистр цифр не учитывается.
- — ничего, то-есть nil, (ключ = ) - означает nil.
Также у любой строки может быть комментарий, а может и не быть. С помощью него вы можете отделять разные части настроек. После перезаписи комментарии сохраняются.
#комментарий строки
Методы
object:save(hex: nil or boolean) — сохраняет настройки в файл. Аргумент hex влияет на то, в какую систему счисления будет сохранятся число.
object:totable():table — конвертирует настройки в таблицу.
object:setLine(key: string or nil, value: value, line: nil or number) — первый аргумент - ключ, второй - значение ключа. Их можно не указывать, если хотите сделать пустую строку. Третий аргумент - номер строки, если не указывается, создаётся новая строка.
object:getLine(line: number):string, value, string — возвращает ключ, если есть, значение, если есть и комментарий, если есть.
object:set(key: string, value: value) — устанавливает значение ключу. Ключ должен быть указан обязательно. Если не находит такой ключ, создаёт новый на новой строке.
object:get(key: string):value — возвращает значение ключа.
object:setComment(line: number, comment: nil or value) — устанавливает комментарий для строки. Если комментарий не указан, просто удаляет его.
object:getComment(line: number):string or nil — возвращает комментарий, если есть.
Свойства
object.path: string — путь до файла настроек.
object.n: number — количество линий. Вы не можете изменить значение этого свойства. Если вы всё-таки это сделали примените где нибудь это выражение (#object) и значение восстановиться.
object.keys: table — здесь хранятся ключи.
object.values: table — здесь хранятся значения.
object.comments: table — здесь хранятся комментарии.
Операторы (взаимодействие)
#object — переназначен на пересчёт количества строк. Отсекает все пустые строки в конце.
pairs(object):function — переназначен на возвращение итератора, который проходит по всем существующем ключам и их значениям, также по комментариям, если присутствуют.
ipairs(object):function — переназначен на возвращение итератора, который проходит по всем строкам и периодически возвращает номер строки, ключ, значение, комментарий.
Индексирование — удобная альтернатива методам object:set() и object:get(), следует понимать, что индексировать некоторые поля не получится, т.к. они заняты методами и свойствами, но вы всегда можете использовать методы, прописанные выше.
tostring(object):string — возвращает строку по типу: "settings: (путь_до_файла)"
Пример использования
Напишем программу с некоторыми параметрами в файле:
Программа:
-- Для начала подключим библиотеку local settings = dofile("settings.lua") --[[Разумеется, если вы запихнули библиотеку в папку libs, можно использовать другую комманду: local settings = require("settings") ]] -- Далее попытаемся открыть этот файл по пути: local conf, err = settings.open("conf.cfg") --[[Функция вернёт объект настроек (тип таблица) или nil и ошибку. Также можно использовать: local conf = assert(settings.open("conf.cfg")) для выдачи ошибки в программе, в случае недоступности файла. ]] -- Создадим ветвление if conf then print("Настройки успешно загружены") else print("Ошибка! "..err) print("Создание нового файла настроек...") conf = settings.convert("conf.cfg") --[[Конвертор таблицы Lua в объект настроек, принимает путь до файла и таблицу для конвертирования, без указания таблицы создаёт новую. Пример конвертации: conf = settings.convert("conf.cfg", { key = 2; key2 = { 1, " ", true } }) Минус этого способа, в том, что ключи в файле будут записаны случайно. Мы избежим этого построчно записывая файл. ]] conf:setComment(1, "Это файл настроек :)") -- Установим в первую строку комментарий. Все аргументы важны в данном случае. conf:set("format", "png") --[[Устанавливаем ключу "format" значение "png", т. к. ключа "format" ещё не существует, он появится на новой строке. Есть альтернативные методы заполнения файла: conf.format = "png" Этот способ плох тем, что некоторые поля зарезервированы для методов и свойств, в остальном идентичен методу conf:set(). ]] conf:setLine("позиция", { 3, 6 }) --[[Устанавливаем новую линию с ключом "позиция" и массивом. Можно указать номер строки для установки отдельных строк. ]] conf:setComment(conf.n, "позиция картинки") -- Просто комментарий для последней строки conf["быстрая загрузка"] = nil --[[Вы работаете не с обычной таблицей, поэтому такая форма записи установит ключу "быстрая загрузка" значение nil. ]] conf:save() -- Сохраним наш файл --[[ conf:save(true) Аргумент true говорит о том, что числа будут переделаны в особый шестнадцатиричный формат (достаточно нечитаемый). ]] end -- Что вы можете сделать с файлом: local conf_table = conf:totable() --[[Конвертирует объект в новую таблицу, возможно вам будет удобнее работать с ней ]] local pos = conf["позиция"] -- Получаем массив с позицией for n_line, key, value, comment in ipairs(conf) do print(n_line, key, value, comment) -- Проходим по всем строкам файла настроек и выводим их. end -- Все остальные фичи вы сможете найти в разделах темыФайл настроек, созданный программой выше:
#Это файл настроек format = "png" позиция = {3, 6} #позиция картинки быстрая загрузка =Скопировал, как есть, ничего не менял.
Старые версии (вдруг кому надо...)
Библиотека ещё будет дорабатываться, в соответствии с вашими пожеланиями. Надеюсь оцените
.-
7
-
Можно так и сделать в HD клиент напихать всяких модов типо динамилайдса, оптифайна, шейдеров и айтем физикса.
динойм лайтс и айтем физикс надо на две стороны ставить
Можете не волноваться насчёт Dynamic Lights в современных шейдерах для майна эта возможность встроена.
-
...
Алекс разбрасывает по крупице информацию о будущем сервере по всему форуму
Жду не дождусь открытия IT-Lite. Optifine лучше оставить по-моему, раз уж не крашит, с ним хоть чанки адекватно отображаются. -
А вы в курсе, кто помогал ему? Клик Это тот человек, что графическую оболочку для Open OS написал))) Но скорее всего он помогал ему не на прямую, а своими видео на канале.
-
Ухты, то-есть не обязательно иметь over 9999+ сообщений на форуме? Можно и мне тоже?
-
Исправил некрасивый и длинный вывод вектора через tostring()
-
Ну тогда дополни с моих слов))
coroutine.wrap(func: function):function - создаёт тот же самый поток, но в виде функции. Естественно на такой поток нельзя использовать coroutine.status(), т.к. это функция, но зато его можно вызвать. Этот метод очень удобен для создания итераторов.
coroutine.running():thread - возвращает работающий поток (по логике это всегда поток, где была вызвана эта функция)
Про два недосказанных статуса я писал.
-
Я описал только то, что работает и в CC, и в OC. Функции которые я описал были добавлены в версии 5.1, а твои функции в lua 5.2. А как мы знаем в CC - 5.1
Неа, я только что проверил в CC, и как оказалось функция присутствует, также как coroutine.running().
-
Ой напортачил... А как же coroutine.wrap(func: function):function? А так же ещё два статуса: normal (когда поток запустил другой поток он становится normal) и running (поток запущен и работает)?
-
Сначала подумал что эта библиотека предоставляет интерфейс для работы с векторной графикой. Как оказалось, векторы из C++. Советую сменить название темы.
Подожди, это не динамические ли массивы в С++? Я то сделал библиотеку для работы с векторами из линейной алгебры.
-
Советую сменить название темы.
Какое посоветуешь? Признаю, сочинять названия я не умею.
-
После того, как я написал про метатаблицы в Lua, захотелось провернуть что-нибудь этакое. Данная библиотека добавляет одну основную функцию, которая возвращается при вызове этой библиотеки с помощью require(module: string). Эта функция возвращает вектор и принимает в качестве аргументов числа, которые соответствуят каждому новому измерению в векторе. Но сначала, разумеется нужно скачать библиотеку. Вы можете сделать это с помощью команды в OpenOS или CraftOS.
pastebin get mdfDvmps /lib/vector.lua
Разумеется в CraftOS нет никакого require(), но вы можете посмотреть эту тему
. Хотя также в CraftOS есть своя библиотека с векторами.Вернёмся к основной функции, если до сих пор не понятно, как она принимает аргументы, я просто запишу вот так: vector(x: number, y: number, z: number, ... ). Как видите у вектора может быть не ограниченное (ограничивается возможностями Lua) количество измерений.
Сам вектор хранит измерения и их значения в себе как в массиве. Каждый вектор хранит количество измерений, которое он обрабатывает в поле n. То-есть, чтобы получить кол-во, обратитесь к этому полю примерно так:
local vector = require "vector" local a = vector(1, 5, 89, 6) print(a.n) --> 4
Все операции с векторами создают новые вектора, а не изменяют старые.
Теперь я опишу все операции с вектором
local vector = require "vector" local a = vector(5, 8, 9) local b = vector(78, 3, -13, 56) print(a + b) --Каждый результат можно вывести через print наглядным образом --> {83; 11; -4; 56} print(a - b) --> {-73; 5; 22; -56} print(a * 8) --Также можно записать 8 * a --> {40; 64; 72} print(b / 42) --> {1.857; 0.071; -0.310; 1.333} print(a * b) --Произведение векторов --> {-131; 767; -609} print(a == b) --> false print(#a, #b) --Длинна вектора --> 13.038404810405 96.943282387177Методы:
- vector:tostring(point: number or nil):string — эквивалентно tostring(vector), в качестве дополнительного аргумента может принять количество символов после запятой, по стандарту 3
- vector:add(vector2: table):table — эквивалентно vector + vector2
- vector:sub(vector2: table):table — эквивалентно vector - vector2
- vector:mul(vector2: table or number):table — эквивалентно vector * vector2
- vector:div(number: number):table — эквивалентно vector / number
- vector:len():number — эквивалентно #vector, длинна вектора
- vector:dot(vector2: table):number — скалярное произведение векторов
- vector:cross(vector2: table):table — произведение векторов, возвращает новый вектор
- vector:normalize():table — нормализует вектор
- vector:angle(vector2: table):number — возвращает угол между векторами в радианах, как и все операции с углами в Lua (чтобы перевести в градусы: result / math.pi * 180)
- vector:round():table — округляет вектор
- vector:eq(vector2: table):boolean — эквивалентно vector == vector2
Если хотите увидеть что-нибудь ещё в этой библиотеке, пишите. Постараюсь добавить.
-
6
-
Еще может быть __call, если ее саму можно вызвать
Нет, я проверил в Lua интерпритаторе, и твоё предположение на счёт __call не работает.
-
Обновил и добавил про метаметоды сравнения. Возможно потом, что-то ещё буду дописывать, но скорее нет. Вроде описал все поля, используемые в метатаблицах. Но если что-то забыл, пишите.
-
2
-
-
А мы не хуже! Давайте и свою ось склепаем. Будет у нас своя система динамических библиотек, мультипоточность, своя GUI библиотека. Будет... ВСЁ БУДЕТ!
-
2
-
-
Наверное следует упомянуть, что __index и __newindex могут быть не только методами, но и таблицами. На счет остальных заклинаний не уверен.
Но я упоминал об этом.
Да, термин "таблица" рябит в глазах, особенно если это замечаешь.
Однако, на мой взгляд, в статье на подобную тему это неизбежно. И уж тем более не стоит заменять термин "метатаблица" на неологизм собственного сочинения, вводя в заблуждение читающих статью новичков.
Можно использовать синтаксис описания команд, подобный тому, что можно увидеть на http://ocdoc.cil.li/
И переформулировать фразы немного, чтобы избежать излишней тавтологии.
Т.е. тип аргументов и какой идет куда, становится понятно из сигнатуры.
Переделаю, так действительно будет лучше.
-
3
-
-
Обновил и добавил про математические метаметоды.
-
1
-

Событие изменения файла
в Разные (отсортировать)
Опубликовано:
lastModified(path:string):number — возвращает дату изменения, просто сравнивай эту дату с предыдущей, и будет тебе счастье