Перейти к публикации
Форум - ComputerCraft

Поиск по сайту

Результаты поиска по тегам 'Lua'.

  • Поиск по тегам

    Введите теги через запятую.
  • Поиск по автору

Тип публикаций


Блоги

Нет результатов для отображения.

Нет результатов для отображения.

Категории и разделы

  • Программирование
    • База знаний
    • Библиотеки
    • Робототехника
    • Сетевые технологии
    • Игры
    • Операционные системы
    • Графика
    • Инфраструктура
    • Программы новичков
    • За пределами Minecraft
    • Всякое-Разное
    • Чулан
    • Стол заказов
    • Конкурсы
  • Игровой раздел
    • Игровые сервера
    • Предложения игроков по улучшению игрового процесса
    • Моды и плагины
    • Гайды, обзоры по модам
    • Жалобы на игроков
    • Заявки на разбан
    • Ивенты
  • Общение
    • Ответы на частые вопросы
    • Вопрос-ответ
    • Вопросник по Lua и модам Opencomputers и ComputerCraft
    • Беседка для программистов
    • Беседка-флудилка
    • Шкатулка
  • Технический раздел
    • Новости проекта
    • Предложения по улучшению работы форума и игровых серверов
    • Проблемы в работе игрового сервера, клиента, форума и их решение
    • Дубль аккаунты
    • Обратная связь
    • Архив
  • Новости Независимое государство
  • Беседка Независимое государство

Категории

Нет результатов для отображения.

Нет результатов для отображения.


Искать результаты в...

Искать результаты, содержащие...


Дата создания

  • Начать

    Конец


Последнее обновление

  • Начать

    Конец


Фильтр по количеству...

Зарегистрирован

  • Начать

    Конец


Группа


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


Gtalk


Facebook


Twitter


Город


Интересы

Найдено 163 результата

  1. @Krutoy когда-то писал про IDE для Lua, но с тех пор, я надеюсь, всё достаточно преобразилось, чтобы снова подошло время задать следующий вопрос: «Какие есть окружения разработки для Lua?» Желательно интегрированные. Иными словами: редактор кода полноценный (само собою); автодополнение (уже никуда без этого); дебаггер; поддержка множества окружений Lua (так, чтобы можно было и OpenOS встроить); неубогий вид; линтер, автоформаттер; статический анализатор кода; инструменты рефакторинга; сборка, запуск, деплой; конфигурируемость и удобность. Неплохими примочками была бы ещё поддержка C, C++ на уровне, но здесь, впрочем, можно и CLion/Eclipse поставить. Если есть опыт использования, интересно было бы услышать его тоже. Например: vim — из списка только 2 пункта есть: первый и последний. Творить лютую жесть можно (для однотипного изменения есть и реплейс по регексу полноценный, и макросы, которыми я довольно часто пользуюсь), к тому же, он легковесный и шустрый очень. Но без остальных пунктов как-то печально писать код.
  2. Перенос статьи Эта тема была перенесена из блока "Статьи". Автор оригинала: Krutoy. Как известно, чем лучше инструмент, тем выше скорость работы. Я программирую на Lua больше года, и перепробовал множество инструментов. В этой статье я покажу, какие есть инструменты для успешного программирования на Lua для двух модов Minecraft'а: ComputerCraft и OpenComputers. 1. Внутриигровой редактор Умеет уйму недостатков и неудобен в работе, за то всегда под рукой. Для ComputerCraft есть программа "LuaIDE", которая входит в состав операционки OneOS (второй скрин) Для OpenComputers пока редакторов кроме стандартного нет. Пара советов для редактора OC: Для быстрого поиска существующего файла в консоли введите первые символы и жмите TAB, например edit i [TAB] --> edit /init.lua Для удаления всей строки нажмите CTRL+DELETE 2. Текстовые редакторы Их несколько: Notepad++ Стандарт скриптовика. Прост и легок в обращении. Плюсы - малый размер, куча плагинов и расширений. Лучшее средство для начинающего программиста Lua. Sublime Text Более продвинутый инструмент. Плюсы - расширенный интерфейс, выбор из разнообразных тем, поддержка плагинов, включая подсветку ошибок при написании кода. Сам пользуюсь этим редактором на компе, расширив плагинами Corona Editor, Lua Love, Sublime Linter - lua SciTE, Atom Для хипстеров. По функционалу такие же как выше. Для удобной работы с компьютерными модами есть несколько приемов: - Через папку сохранения в одиночной игре: В Windows это папка, примерно C:\Users\UserName\AppData\Roaming\.MC\ServerName\saves\Computers\opencomputers\address-address-add-addrs Сохраненные файлы в папке жесткого диска игрового компьютера будут тут же там обновляться. Не забудьте изменить в конфиге \config\OpenComputers.cfg значение bufferChanges на false: - Через Pastebin: Пишете код в редакторе Вставляете его на Pastebin Вписываете код для запуска в игре (заменив XXXXXX на код пасты): pastebin get XXXXXX name - Через облачное хранилище с прямыми ссылками: Сохраняйте и работайте с файлами прямо в папке облачного хранилища, с возможностью доступа по прямым ссылкам. Например, в дропбоксе это папка Public (в новых аккаунтах ее нет) Загружайте обновленные файлы на ОС компьютер через интернет-плату программой wget, получив прямую ссылку на файл, например: wget -f https://dl.dropboxusercontent.com/u/12345678/file.lua Для удобства вы можете написать короткую программу, которая при нажатии клавиши, например F5, будет выполнять такую загрузку автоматически 3. IDE IDE - Интегрированная среда разработки. Это мощное средство редактирования и отладки кода. Сильно упрощает работу с большими проектами, но более сложен в освоении. Основное преимущество IDE - отладка кода посредством точек останова и отображения значений переменных при работе программы. Рассмотрим по отдельности: ZeroBrane Studio Суперлегкая (у меня занимает 17мб оперативки) и быстрая кроссплатформенная IDE. Визуальные темы, мониторинг переменных, выделение локальных и глобальных переменных, проверка на неиспользуемые переменные и прочие ништяки. Lua Development Tools Преимуществ от ZeroBrane практически нет, скорее минусы в роде отсутствие темной темы и требовательности к оперативке. Cloud 9 Облачное браузерное IDE. По стандарту отсутствует отладка. Ее нужно устанавливать в проект самостоятельно. Плюс - вам не нужно ничего устанавливать на компьютер. Но самое приятное, что к каждому файлу в этой IDE можно обратиться по постоянной прямой ссылке, что крайне упрощает заливку файла в игру. Так же, вы можете раздавать ссылку на проект другим и совместно редактировать код. Сам я использую Sublime для быстрого редактирования файлов, LDT для больших проектов на стадии написания кода, Cloud9 для совместных проектов с другими программистами, и для отладки текущих проектов в игре. О ZeroBrane Studio узнал совсем недавно, поэтому планирую перейти на нее в ближайшее время, что и другим советую.
  3. Сделал кнопку через библиотеку forms.lua. Врубаю прогу, всё появляется, но программа почему-то не продолжает свою работу, а выключается сразу после отрисовки всех компонентов. addButton делал по инструкции
  4. Я предлагаю запилить экспериментальный проект. Кодовое название - "Цитадель". Кавайная заставочка - сверху. Суть вкратце такова. Необходимо полностью развиться в Minecraft, с нуля, используя ТОЛЬКО роботов и дронов из OpenComputers. Делать что либо руками запрещается. (Если кто-то читает мою группу в ВК, там мелькал пост одного чувака, который снимает серию летсплеев с похожей идеей.) Для проекта берём сервер в сингле (например). Ставим несложную сборку - например Minecraft 1.12 + OpenComputers 1.7 + какой-нибудь тех. мод с хорошей OC-интеграцией, например - Mekanism. Далее генерим мир. Игрок будет обитать на спавне - в стартовой базе. У него в наличии будет: * закрытый ангар, в котором он живёт (выходить из него игроку нельзя), * вечный источник энергии, * компьютер третьего тира с беспроводной картой и интернет-платой, * пять доков с роботами (док - это ячейка с зарядником и люком наружу, где стоит робот), * пять доков с дронами, * небольшой запас провизии на первое время. Конфигурация дронов и роботов - тир три, с вайфай-картами и чанклодерами. На компы и роботов установлена OpenOS последней версии. Дроны прошиты нет-флашем. Основные задачи проекта: * наладить поставку провизии игроку * наладить добычу и хранение важных ресурсов * развернуть репликацию роботов и дронов Условие поражения: * потеряны все роботы и не выполнены основные задачи Сюжетный обоснуй: Игрок не совсем удачно десантировался с орбиты. У него мало ресурсов, но сохранился рабочий комплект робототехники и ядерный энергогенератор с ресурсом в тысячу лет бесперебойной работы. Атмосфера планеты непригодна для жизни человека. Что думаете по поводу идеи? Какие моды должны войти в состав сборки? Какие технические препятствия видите? Какие поправки стоит внести в стартовые условия? Какие действия по вашему стоит предпринять игроку первым делом?
  5. Программка написанная на love2D рисует фракталы, ставя новую точку проходя определённое расстояние от предыдущей точки до случайно выбранной вершины предварительно нарисованной фигуры. Подробнее в этом видео. Как использовать: Запускаем, ставим мышью несколько точек, выбираем расстояние, которое будет проходить точка (начальная ставится случайно), пробел - пошагово, А - автоматически рисуем. Ну там в окошке есть инфо по управлению. По умолчанию расстояние 1/2, идеально для треугольника, для фигур с большим количеством точек лучше уменьшить. В общем играйтесь кому интересно, скачать скомпилированный вариант можно с гугл диска.
  6. Сколько вы можете придумать способов напечатать фразу "Hello World!" десять раз, при помощи Луа? Мой вклад в копилку: 1) Рекурсией function hello(times) if times > 0 then print "Hello World!"; hello(times-1) end end hello(10) 2) Заменой local source = " " local hello = source:gsub(" ", "Hello World!\n") print(hello)
  7. Кнопки, это самый распространенный элемент интерфейса, и не потому, что их полно в каждой графической программе. Функционал кнопки наследует большинство средство ввода, например: ссылки, переключатели, ползунки, менюшки и т. д. Сейчас, огромные возможности для создания других, более подходящих ситуации способов ввода, но традиционно используются кнопки, которые появились в первых электронных устройствах, т. к. они просты и интуитивно понятны. Внешний вид. Обычная кнопка имеет прямоугольный вид, это позволяет не заморачиваться с алгоритмом взаимодействия, удобно отображать на ней текст/изображения, но если необходимо, ее можно сделать какой угодно формы. Самое главное в кнопке это ее интерактивность, т. е. она должна не только выполнять функцию, для которой назначена, но и сигнализировать свой статус (иметь обратную связь). Например, при нажатии на кнопку, она меняет цвет/визуально проваливается/издает звук, все это вместе или по-отдельности дает пользователю знать, что она активирована, а цветом или звуком можно даже передать состояние выполнения задачи, выполняемой этой кнопкой. А вот если пользователь нажимает на кнопку и ничего не происходит, то он может клацнуть по ней еще много раз, пока кнопка будет выполнять задачу. В большинстве случаев это довольно опасно - накликают беду, а винят программиста. Поэтому, если в текущей ситуации кнопка неактивна, надо это подчеркнуть, например, обесцветив ее или частично слив с фоном, можно дополнить специальным звуком. Все это очевидно, поэтому не стоит об этом забывать. Внутреннее устройство. В графическом интерфейсе, кнопка это определенно обозначенное место на экране, в которое нужно тыкнуть, чтобы получить определенный результат, обозначенный на кнопке в виде текста/изображения или понимаемый из контекста. Как это реализовать в OpenComputers? Нам доступен вывод информации на монитор, посредством компонента GPU. Пока рассмотрим функции назначения цветов и вывода символов. Работа с видеокартой. Список методов видеокарты можно посмотреть на вики. Для назначения цвета текста используется метод setForeground. А чтобы задать цвет фона, есть метод setBackground. Чтобы проверить, как это работает обратимся к компьютеру с установленной OpenOS. Запустим компьютер. Вводим команду edit gpu_test.lua, так мы запускаем текстовый редактор OpenOS, указывая, что нужно редактировать файл gpu_test.lua. Пока этого файла нет, но когда в редакторе нажмем Ctrl+S он сохранится. Чтобы мы могли обратится к компоненту gpu, нам надо загрузить обертку для компонентов, предоставляемую OpenOS, она немного облегчает работу. Для этого, в самом начале программы пишем local component = require('component'), так, что это за письмена? Эта строка создает локальную переменную (указываем словом local перед именем переменной), далее указываем имя переменной. Знак равенства указывает, что в переменной теперь будет хранится то, что дает функция require, в данном случае мы задали этой функции передать переменной component возможности обертки, которая тоже называется component. Так будет удобней понимать, к чему мы обращаемся. На следующей строке пишем local gpu = component.gpu Это мы назначили переменной gpu все методы видеокарты, т. е. теперь можем обращаться к ней через эту переменную. При загрузке, OpenOS сделала несколько скрытых операций: определила основную видеокарту, подключила ее к монитору и добавила их к остальным компонентам, чтобы можно было обратиться по имени компонента и получить готовый интерфейс. Итак, видеокарта готова к работе, теперь опишем, что она должна сделать. Создаем переменные, содержащие информацию о цветах и тексте, с которыми мы будем работать. local color1, color2, text = 0xff00ff, 0x0000ff, 'Hello, OpenComputers!' При помощи параллельного присваивания мы задали две переменные с числовыми значениями цветов и переменную с текстом. Теперь создадим простой цикл, в котором выведем текст на экран, назначая цвет текста и цвет фона. for i = 1, 10 do gpu.setForeground(color1) gpu.setBackground(color2) gpu.set(10, 5, text) color1, color2 = color2, color1 os.sleep(0.5) end Сам код назначает тексту цвет, указанный в color1, а фону color2, затем выводит текст, содержащийся в переменной text на монитор, указывая координаты первого символа (от левого верхнего угла 10 символов в право, 5 символов вниз). Далее, параллельным присваиванием, меняем значения переменных местами, чтобы при следующем выполнении кода, цвета фона и текста поменялись. В конце цикла ставим задержку в пол-секунды, используя системную функцию sleep. Цикл готов, теперь, в конце программы стоит добавить восстановление цветов текста и фона, т. к. по завершению ее работы, цвета останутся такими, которые были назначены в последний раз. Готовый алгоритм будет примерно такой: Нажимаем Ctrl+S, чтобы сохранить файл, затем Ctrl+W, чтобы закрыть редактор. Теперь мы снова попали в шелл. Вызываем только-что созданную программу по имени: gpu_test, и наблюдаем ее выполнение. Так как координаты вывода жестко заданы, мы видим, что текст как-бы мигает. Чтобы увидеть эволюцию работы цикла, можно к координатам вывода добавить значения шага цикла. Для этого откроем файл edit gpu_test.lua, в функции gpu.set к каждому числу прибавим переменную-итератор. Теперь вызов функции gpu.set выглядит вот так: gpu.set(10+i, 5+i, text), сохраним изменения (Ctrl+S), закроем (Ctrl+W), и опять запустим тестовую программу gpu_test Работа с вводом. Со способом вывода информации более-менее разобрались, теперь разберемся с вводом, т. к. мы хотим создать графический интерфейс, хоть и 'псевдо', мы будем использовать возможность сенсорного ввода, клавиатуру поставим для других задач. Монитор I уровня это только средство вывода, а мониторы второго и третьего уровня могут работать и как средство ввода. Когда игрок прикасается к экрану, генерируется сигнал touch, содержащий в себе адрес монитора, координаты касания, код кнопки мыши и ник игрока. Нам остается отследить это событие и соответсвующим образом на него отреагировать. Для демонстрации работы напишем небольшую тестовую программу, которая будет ловить события касания экрана, отображать место и числовые координаты. Создаем файл edit click_test.lua Первым делом подключаем управление видеокартой local gpu = require('component').gpu Затем, подключим мониторинг событий, который предоставляет OpenOS. local pull_e = require('event').pull Общая документация тут, мы воспользуемся только одной функцией. Теперь позаботимся о пользователе, чтобы при завершении программы цвет фона остался такими же, как и перед запуском, мы его сохраним в переменную: local b_color = gpu.getBackground() Эта функция сообщает цвет фона, который сейчас используется, для цвета текста есть getForeground, но в данном тесте мы будем управлять только цветом фона. Так как у мыши две кнопки, в событии touch указывается код кнопки: ЛКМ = 1, ПКМ = 0 Чтобы визуально различать касания, создадим таблицу с цветами для каждой кнопки. В качестве индекса будет использоваться код кнопки. local color = {[0] = 0x00ff00, 0x0000ff} т. е. ЛКМ будет обозначаться синим, ПКМ - зеленым. Теперь создадим цикл, в котором будем ловить и обрабатывать события. while true do Как следует из описания функции event.pull, можно фильтровать ненужное, передав в функцию название интересующего нас события. Так как возвращается довольно много переменных, будем создавать из них таблицу, для большего удобства. local tEvent = {pull_e('touch')} Теперь все события типа touch будут пересоздавать таблицу tEvent, в которой будет заключена информация об этом событии. Обратиться к интересующей информации можно, указав номер, в той же последовательности, как это описано в документации по сигналам Для начала добавим условие выхода из программы, т. к. цикл бесконечный и прервать его можно только грубо нарушив выполнение программы. if tEvent[3] == 1 and tEvent[4] == 1 then Если клик произошел по координатам (1, 1), выполнить следующий код: gpu.setBackground(b_color) - вернем фону его первоначальное значение, полученное при запуске программы. os.exit() - вызовем системную функцию выхода из программы. Закроем условие: end А теперь опишем сам процесс отклика на касание. Присваиваем фону цвет, исходя из полученного кода кнопки мыщи: gpu.setBackground(color[tEvent[5]]) Устанавливаем по полученным координатам символ пробела, чтобы подсветить фон: gpu.set(tEvent[3], tEvent[4], ' ') Затем, по координатм (1, 1) показываем информацию о событии: gpu.set(1, 1, 'x: '..tEvent[3]..' y: '..tEvent[4]..'\t\t') В конце добавляется пустое место, чтобы не заморачиваться с затиранием предыдущих значений. Закрываем цикл end В итоге получается такой код: Сохраним и запустим программу. Кликая мышкой по монитору мы видим, как она оставляет следы и обновляется информация в левом верхнем углу. Кликнув в левый верхний угол мы завершаем работу программы. Значит, мы между делом создали кнопку, хоть и невидимую. Принцип работы очень прост - пользователь кликнул по экрану, а программа сравнила координаты клика с координатами кнопки, если они совпали, то выполняется код, назначенный для этой кнопки. Теперь создадим нормальные кнопки, с более удобной конфигурацией. Все кнопки будут находиться в таблице, при каждом клике будем в цикле обходить таблицу, проверяя координаты. Дополнительно напишем пару функций - одна будет подсвечивать нажатую кнопку, другая переключать видимость. Каждая кнопка будет содержать следующие параметры: статус отображения (т. е. активна кнопка или нет), координаты, размер, цвет фона кнопки, цвет текста, текст и исполняемую функцию. { visible = boolean, X = number, Y = number, W = number, H = number, color = number, textColor = number, text = string, action = function } Загрузим видеокарту и захват событий. local gpu = require('component').gpu local pull_e = require('event').pull Для того, чтобы очистить экран при запуске и поставить кнопку выхода в угол, нам понадобится узнать и сохранить текущее разрешение. local W, H = gpu.getResolution() Сохраняем цвета фона и текста, чтобы вернуть их при завершении программы. local b_color, f_color = gpu.getBackground(), gpu.getForeground() Создаем таблицу tButtons, в ней мы будем хранить все кнопки. Добавляем кнопку выхода из программы: Изначальное состояние кнопки: visible = false, Устанавливаем кнопку в правый верхний угол, задаем размер в один символ: X = W, Y = 1, W = 1, H = 1, Устанавливаем цвета: color = 0xff0000, textColor = 0xffffff, Задаем символ: text = 'X', Функция завершения программы немного изменилась - устанавливаются первоначальные цвета, очищается экран и вызывается функция выхода. action = function() gpu.setBackground(b_color) gpu.setForeground(f_color) gpu.fill(1, 1, W, H, ' ') os.exit() end Опишем функцию рисования кнопки, в которую будет передаваться индекс кнопки. local function drawButton(n) задаем цвет кнопки gpu.setBackground(tButtons[n].color) задаем цвет текста gpu.setForeground(tButtons[n].textColor) заливаем прямоугольник, который занимает кнопка (в данном случае, берем координаты и размер кнопки из ее таблицы) gpu.fill(tButtons[n].X, tButtons[n].Y, tButtons[n].W, tButtons[n].H, ' ') для большей красоты отцентрируем текст по границам кнопки, для этого вычислим половину высоты и половину ширины кнопки, прибавим их к координатам кнопки, а у ширины еще отберем половину длинны текста gpu.set(tButtons[n].X+(tButtons[n].W/2)-(#tButtons[n].text/2), tButtons[n].Y+(tButtons[n].H/2), tButtons[n].text) закрываем функцию end Добавим переключение видимости кнопки. local function toggleVisible(n) if tButtons[n].visible then если кнопка видима, то изменим статус tButtons[n].visible = false установим цвет фона на тот, который был при запуске gpu.setBackground(b_color) зальем прямоугольник фоновым цветом gpu.fill(tButtons[n].X, tButtons[n].Y, tButtons[n].W, tButtons[n].H, ' ') else иначе: изменим статус tButtons[n].visible = true вызовем отрисовку этой кнопки drawButton(n) закроем условие и функцию end end Чтобы кнопка подмигивала при активации, создадим функцию меняющую цвет фона и текста, как в первом примере. Для получения и назначения цветов обратимся к параметрам кнопки по индексу, как и в прошлых функциях. меняем цвета tButtons[n].color, tButtons[n].textColor = tButtons[n].textColor, tButtons[n].color рисуем кнопку drawButton(n) делаем задержку os.sleep(0.09) возвращаем цвета tButtons[n].color, tButtons[n].textColor = tButtons[n].textColor, tButtons[n].color заново рисуем кнопку, с номальными цветами drawButton(n) Функции описаны, теперь напишем саму программу. При запуске очистим экран gpu.fill(1, 1, W, H, ' ') Можно вынести ее в отдельную функцию, но в данном примере очистка вызвается только два раза - при запуске и при выходе. Теперь активируем все нужные кнопки. В данном примере можно запустить все кнопки, поэтому пройдем в цикле по таблице с кнопками и для каждой вызовем переключатель видимости. for i = 1, #tButtons do toggleVisible(i) end И опишем главный цикл. while true do ловим событие в таблицу tEvent local tEvent = {pull_e('touch')} перебираем все кнопки for i = 1, #tButtons do если кнопка видима if tButtons.visible then сравниваем координаты клика с прямоугольником кнопки if tEvent[3] >= tButtons.X and tEvent[3] <= tButtons.X+tButtons.W and tEvent[4] >= tButtons.Y and tEvent[4] <= tButtons.Y+tButtons.H then если клик попал по этой кнопке, заставляем ее мигнуть blink(i) выполняем функцию, которая назначена для нее tButtons.action() прерываем цикл проверки кнопок break закрываем циклы и условия end end end end На этом все, программа готова, в готовом примере я добавил три кнопки - 'set' выводит строку, а 'del' стирает и бибикает спикером, 'reboot' перезагружает компьютер.
  8. Недавно видел в какой-то теме про сворачивание блоков кода, которые завернуты в do ... end Попробовал то же в своем sublime и увидел как оно работает. Захотелось бОльшего Немого поковырявшись в гугле разобрался как в sublime 3 добавить подобную свертку для любого синтаксиса. Включая Lua С помощью PackageControl устанавливаем SyntaxFold Идём в Preferences -> Package Settings -> SyntaxFold -> Settings - User Добавляем такую запись для сворачивания функций и таблиц: { "scope": "source.lua", "startMarker": "local function, function, {", "endMarker":"end, end, }" }, По аналогии можно добавить более специфичные маркеры после чего перезапустить редактор Теперь по Control+Shift+[ , Control+Shift+] , Control+K, Control+Цифра а также командами в меню Edit -> Code Folding можно сворачивать и разворачивать блоки внутри назначенных маркеров. Если тут есть еще любители саблайма кроме меня, новые полезности и удобности для луа - приветствуются
  9. На этом. Язык компилируется в Lua (поддерживаются версии 5.1, 5.2, 5.3 и даже возможно JIT). Предупреждаю — этот язык является диалектом Lisp. Если ваш дед не оставил в кладовке пачку скобок, возможно у вас не получится на нем писать. Из фич: pattern matching, прикольные циклы, фреймворк для тестов, красивые сообщения об ошибках. Hello world на Urn: (print! "Hello, world!") Работает также арифметика в стиле лиспа: (+ 2 (* 4 5)) Можно создавать функции: (defun times-two (x) (* x 2)) (print! (times-two 2)) (print! (times-two 3)) и макросы: (defmacro show (x) (print! "Compile-time" (pretty x)) `(progn (print! "Run-time" ,(pretty x)) (print! "Value" ,x))) ------------------------------------ > (show (+ 2 3)) Compile-time (+ 2 3) Run-time (+ 2 3) Value 5 Можно использовать библиотеки из Lua: (define bit32 :hidden (require "bit32")) (define & (.> bit32 :band)) (define ~ (.> bit32 :bnot)) и таблицы из Lua: > { :foo 1 . :bar 2 } out = {"bar" 2 "foo" 1} Компилятор языка написан на Lua UPD: компилятор написан на Urn и скомпилирован в Lua; предлагаю энтузиастам поиграться с ним в OpenComputers и сделать отчет. А я пойду дальше употреблять вещества.
  10. Вопрос такой можно ли перехватывать сообщения из чата? Пример: Человек написал слово в чат, если оно совпадает с переменной то сообщение в чат не отправляется и пишет что он к примеру победил, а если не совпадает то сообщение отправляется в чат.
  11. Эта кoпалка не требует для рабoты лишних деталей, т. к. кoд запиcываетcя на EEPROM. При cбoрке рoбoта, вмеcтo ЖД, мoнитoра и клавиатуры мoжнo дoбавить чтo-тo дейcтвительнo нужнoе, например раcширение инвентаря или аккумулятoра. Требoвания: Инвентарь (чем бoльше - тем лучше) Кoнтрoллер инвентаря. Геocканер. Инcтрумент, врoде алмазнoгo или иридиевoгo бура. Хoвер-апгрейд (еcли неoбхoдимo) При cбoрке мoжнo дoбавить: Апгрейд-верcтак. (пoзвoляет экoнoмить меcтo) Чанклoадер. Генератoр. (при наличии чанклoадера реже будет неoбхoдимocть ездить к заряднику) Беcпрoвoдную cетевую карту. (пoзвoлит рoбoту oтправлять cтатуcные cooбщения) Пример минимальнoй и пoчти макcимальнoй cбoрки (при желании, мoжнo дoбавить раcширения) Иcпoльзoвать oчень прocтo: В кoмпьютер c интернет-платoй вcтавить EEPROM. Запуcтить кoманду pastebin get eFkAZP0u b && edit b && flash b -q && rm b Пo желанию, редактирoвать параметры - первые переменные этo кoличеcтвo нoд, минимальная плoтнocть, макcимальная плoтнocть, выcoта (неoбхoдимo указывать для мирoв, в кoтoрых нет бедрoка), пoрт, cпиcoк oтхoдoв. Сoхранить/закрыть файл. Дocтать EEPROM из кoмпьютера и вcтавить в рoбoта. Выдвинутьcя на меcтo дoбычи. Пocтавить рoбoта. Дать рoбoту бур. Пocтавить вoзле негo кoнтейнер и включенный зарядник. Включить рoбoта и ждать завершения рабoты. Функциoнал: Рoбoт cканирует квадраты x8 блoкoв пo гoризoнтали, пocтепеннo oпуcкаяcь вниз. Дoбывает блoки из заданнoгo диапазoна плoтнocтей. Дoйдя дo бедрoка, рoбoт пoднимаетcя на cтартoвую выcoту и перехoдит к cледующей кoлoнне. При низкoм урoвне заряда аккумулятoра, пытаетcя заправить генератoр (еcли имеетcя), в прoтивнoм cлучае или при низкoм урoвне заряда инcтрумента, oтправляетcя на cтартoвую пoзицию, к заряднику. Так же, при запoлнении инвентаря, cбраcывает муcoр, при наличии верcтака упакoвывает реcурcы в блoки и еcли меcта вcе-равнo малo, тo cледует к кoнтейнеру, cбраcывает лут и вoзвращаетcя к рабoте. Еcли имеетcя чанклoадер, тo при начале рабoты oн включаетcя, а при завершении выключаетcя. Еcли имеетcя беcпрoвoднoй мoдем, тo рoбoт пocылает cтатуcные cooбщения: 0 - неразрушимый блок (скорее всего - приват) 1 - контейнер заполнен 2 - контейнер отсутствует 3 - зарядка инструмента 4 - заправка генератора 5 - конец работы
  12. Я вас категорически приветствую! Сегодня я хочу представить вам новый формат для изображений для OpenComputers! Данный формат был придумал в соавторстве с @@Alexc. Начну я с того, как устроен процесс конвертации картинки (ну и самого формата тоже): Определяются базовые цвета картинки (пара цветов -baseFore, baseBack - которые чаще всего встречаются на исходном изображении), преобразуются в цвета opencomputers и записываются в файл вместе с размерами картинки. Сканируется картинка по паре пикселей по координатам x y * 2 - 1 и x y * 2, чтобы получилась пара цветов (fore и back). Из них формируются "цепочки" вида : { [back] = { [fore] = {x,y,str} } где back и fore - цвета "верхнего" и "нижнего" пикселей, а {x,y,str} - сама цепочка. Пример из 1 картинки: [6712704]={ -- Преобразованный в целочисленное значение цвет для background [7895160]={ -- Преобразованный в целочисленное значение цвет для foreground {70,31,"▄"} -- Сама цепочка, которая будет отрисована. } ,[13816530]={ {65,41,"▄▄"} } ,[2960685]={ {95,43,"▄"} },[12829635]={ {95,42,"▄"} } } (Разумеется все это хранится в байткоде, а не в таком виде ) Плюсы и минусы: Плюсы: Достаточно быстрая скорость отрисовки картинок. Достаточно небольшой размер конечных файлов (По сравнению с оригиналом в .png - .pix занимает в разы меньше места, а по сравнению с .jpg - больше ) Минусы: При конвертации и отрисовке используются только 4 символа Юникода: "▄" , "▀" , "█" , " ". Максимальное разрешение исходной картинки 160х100 пикселей в форматах: .png, .jpg, .bmp. Нет поддержки шрифтов Брайля (см. пункт 1 ). Установка: Скачать сам конвертор, написанный на Kotlin (Спасибо @@Totoro =) ) https://github.com/cc-ru/pix/releases Или же скачать lua версию : pastebin get SYfcHuhr PIXconv.lua Запускать таким образом: PIXconv file Файл будет сохранен в ту же папку, с тем же названием, но с расширением .pix Так же вместе с конвертором будет скачана программа для отрисовки под названием PIXdraw.lua. Если же вы хотите ее скачать отдельно, то: pastebin get Bm0JUJnj PIXdraw.lua Запускать таким образом: PIXdraw file.pix Скриншоты (как это выглядит в OCEmu и майнкрафте): https://clip2net.com/s/3Ug8qrb https://clip2net.com/s/3Ug88vV
  13. Всем привет Есть 16 МФСУ, к ним подключены адаптеры В системе видно 16 адаптеров с МФСУ Как получить заряд конкретного МФСУ ? Если ввести =component.mfsu.getCapacity() , то отображается заряд первого МФСУ 1.А как получить заряд любого МФСУ по его UUID? 2.И как можно получать его заряд по сокращенному UUID? (не вводя весь адрес целиком)
  14. Привет ComputerCraft! В программировании я полный ноль и наверное моя ошибка банальна, но прошу помочь. Ругается на 34 строчку. Что и на что нужно исправить чтобы всё завелось? Код Вылет -- разработчик dases print("LOADING... ENERGY INFO v1.1") --загружаем библиотеки local computer = require("computer") local component = require("component") local term = require("term") local os = require("os") local gpu = component.gpu --работаем с экраном gpu.setBackground(0x109910) --задаём цвет фона gpu.setForeground(0x000000) --задаём цвет текста --gpu.setResolution(28, 14) --задаём разрешение экрана --начальный экран term.clear() --чистим экран от мусора print(" ENERGY INFO v1.1") print("____________________________") print(" www.computercraft.ru") os.sleep(2.7) --задержка начального экрана local maxenergy = computer.maxEnergy local energy = computer.energy local procent = energy()/maxenergy()*100 --экран с информацией о энергии while true do term.clear() --чистим экран от старого текста print(" ENERGY INFO v1.1") print("____________________________") print(" ") print(" Energy :"..energy()) --показывает сколько сейчас энергии в сети print(" Procen energy:"..procent()) print(" Max energy:"..maxenergy()) --показывает сколько всего можно залить энергии в сеть print("________________________________________________________") print(" DANGER!!! High Voltage!!!") print("________________________________________________________") os.sleep(3) --задержка перед следующим обновлением текста на экране end
  15. Половина наших кейсов в настоящий момент имеют вид, так как мне их лень набивать: item.case5.json { "sound" : "Cases:middle_case", "message" : "§a${player} §6открыл §b${case_name} §6и получил §a${item_name} - ${item_count} шт.", "items" : { "minecraft:sand" : {"name" : "Песок", "min" : 1, "max" : 10, "fortune" : 0.7}, "minecraft:dirt" : {"name" : "Земля","min" : 1,"max" : 10, "fortune" : 0.3}, "minecraft:diamond" : {"name" : "Алмаз","min" : 1, "max" : 10, "fortune" : 0.05}, "IC2:itemToolMiningLaser:27" : {"name" : "Лазер", "min" : 1, "max" : 1, "fortune" : 0.05} } } Синхрофазотронная установка: любой комПуктер, 6 транспозеров, 6 алм сундуков (по дефолту) НО не обязательно. Прога должна сама получить все транспозеры. Их может быть три или вообще один, если админ балансит/меняет только один кейс, например, моды поменялись и нет больше харвеста и кейса повара и типа того. В общем, сколько комп нашел транспозеров, столько данных и получил. ТЗ: Админ накидывает из НЕИ в сундуки красивые предметы по тематике кейсов, и топчик и бомжерес и средненький, всякие ихорчики, солярочки и прочее в сундучки, запускает прогу и получает в папке /home/cases_2018_03_11_21_43_55 столько файлов, сколько сундуков. Кто не понял, папка с датой и временем, чтобы я мог откайтиться и посмотреть что-то ранее. Файлы в указанной папке формируются с именем case_i.dat, где i - итератор таблицы транспозеров. Не важно, какой транспозер будет первым или третьим. Админ поймет сам, что это за кейс. Потом админ заваривает чашечку кофе, раскуривает трубку и садится и просто меняет шанскики и мин. макс. кол-во быстренько и закидывает на сервак это все хозяйство, и ребутает с консоли кейсы. Вуаля - кейсы гивают эпический и разнообразный рес мага, инженера, прогера и прочее, а не песок. Никаких гуишек, кнопок, шмопок не нужно. Прога выполнилась и закрылась, получив дамп сундуков. Что нужно получить и сформировать в файле case_i.dat: "minecraft:sand" : {"name" : "Песок", "min" : 1, "max" : 1, "fortune" : 0.5}, "minecraft:gold_ingot" : {"name" : "Золотой слиток","min" : 1,"max" : 1, "fortune" : 0.5}, "minecraft:diamond" : {"name" : "Алмаз","min" : 1, "max" : 1, "fortune" : 0.5}, "IC2:itemToolMiningLaser:27" : {"name" : "Лазер", "min" : 1, "max" : 1, "fortune" : 0.5}, ... "IC2:itemFoamSprayer" : {"name" : "Распылитель", "min" : 1, "max" : 1, "fortune" : 0.5}, "IC2:itemwcarbonrotor" : {"name" : "Карбоновый ротор", "min" : 1, "max" : 1, "fortune" : 0.5} шансы 0.5 и кол-во 1 - 1 проставить автоматически. Админ это редачить сам будет. Варьировать не нужно. Призы за топовую прогу, которая выполняет ВСЕ требования: солярки, медальки, ветряки, ОС комплектующие, креативные модификаторы тинкера несколько, или возможно даже и броньку топовую какую-то. Поглядим. Утешительные призы также будут, если программ вдруг будет не одна. Надеюсь, что кейсы не только мне нужны и кто-то включится в работу Программка детская так то.
  16. Здравствуйте. Возможно глупый вопрос, но все же: Возможно ли силами луа или oc записать данные из переменной в текстовой файл? К примеру: В переменной есть 1, эту цифру надо записать в "log.txt" Буду благодарен за помощь
  17. Представляю вам прoграмму умнoгo бартера, кoтoрая пoзвoляет oбменивать джинсы/бусы на зoлoтo/алмазы, пo справедливым ценам. Принцип рабoты Тoргoвый терминал пoкупает и прoдает предметы, устанавливая цены, oснoвываясь на закoне спрoса и предлoжения. Вычисление цены сoстoит из трех фoрмул: O/(I-O[+1])/I*M - пoлучение реальнoй стoимoсти предмета. (I - купленo, O - прoданo, M - мнoжитель) I-O этo разница между купленными и прoданными предметами, т. е. текущее кoличествo. Чтoбы пoлучить нoрмальнoе oтнoшение при I=O, всегда прибавляем 1. Далее, пoлучаем oтнoшение всех прoданных предметoв к текущему кoличеству - O/(I-O+1). Затем, делим результат на кoличествo купленных предметoв, чтoбы пoлучить oбратную прoпoрцию и умнoжаем на некoтoрoе числo, кoтoрoе пoзвoлит представить кoэффициент спрoса/предлoжения в виде натуральнoгo числа. ((R-C)/R)*C+C - если реальная стoимoсть бoльше текущей. (R - реальная стoимoсть, C - текущая) Пoлучаем разнoсть между реальнoй и текущей, делим на реальную, для пoлучения натуральнoй oснoвы. Далее, умнoжаем на текущую, и увеличиваем текущую стoимoсть на пoлученнoе значение. (C-R)/3+R - если реальная ниже текущей. Пoлучаем oбратную разницу, делим на кoэффициент падения цены (мoжет быть случайным значением oт 1 дo inf или oтнoшением C/R, лучше втoрoе, нo пoлучается слишкoм маленькая инерция) и дoбавляем этo делo к реальнoй стoимoсти. Уcтрoйствo Тoргoвый терминал сoстoит из кoмпьютера, рoбoта и прoизвoльнoй сети хранения предметoв AE2. Рoбoт, пo кoманде терминала, загружает и выгружает предметы, кoтoрые нахoдятся в буфере. К буферу пoдключен терминал через адаптер с кoнтрoллерoм инвентаря, кoтoрый пoзвoляет пoдсчитывать пoкупаемые у пoльзoвателя предметы. Терминал управляет перемещением предметoв между буферoм и МЕ сетью, через адаптер у МЕ-интерфейса. (На MC 1.7.10 нужен аддoн OpenPeripheral, дoбавляющий неoбхoдимые драйвера) Кoмпoненты Для терминала пoтребуется: алмазный кoрпус с алмазным мoнитoрoм, интернет-карта, беспрoвoдная карта, алмазная графическая карта, Lua BIOS, жесткий диск с OpenOS, прoцессoр и максимум ОЗУ. Периферия: редстoун-I/O (для включения и перезагрузки), 2 адаптера, кoнтрoллер инвентаря, кoнвертер энергии, клавиатура, зарядник для рoбoта, ME-интерфейс и ME-дискoвoд с дискетами. Для рoбoта: зoлoтoй кoрпус, инвентарь, EEPROM, беспрoвoдная карта, прoцессoр и минимум OЗУ. Устанoвка и настрoйка wget https://raw.githubusercontent.com/DOOBW/automarket/master/terminal.lua wget https://raw.githubusercontent.com/DOOBW/automarket/master/style.gss wget https://raw.githubusercontent.com/DOOBW/automarket/master/start.lua wget https://raw.githubusercontent.com/DOOBW/automarket/master/market.db wget https://raw.githubusercontent.com/DOOBW/automarket/master/robot_bios.lua wget https://raw.githubusercontent.com/DOOBW/automarket/master/gml.lua /lib/gml.lua echo start >> .shrcВ файле robot_bios.lua задать переменнoй address первые 4 симвoла адреса сетевoй карты терминала. Прoшить этoт файл в EEPROM рoбoта.В файле terminal.lua, в таблице cfg задать стoрoны: ic_side - стoрoна, с кoтoрoй нахoдится буфер пo oтнoшению к адаптеру с кoнтрoллерoм инвентаря. mei_side - стoрoна, с кoтoрoй нахoдится буфер oтнoсительнo адаптера. Перезагрузить терминал, включить рoбoта и мoжнo пoльзoваться. База данных устроена так: db = { users = { ['Ник_пользователя'] = { balance = счет, count = количество совершенных операций, lastlogin = время последней операции } }, items = { ['название_мода:название_предмета|метаданные'] = { label = Лейбл_предмета, i = куплено, o = продано, cost = текущая_стоимость } } } Пример работы (старая версия)
  18. Помню @@1Ridav разрабатывал мост для связи игры и ПК, чтобы можно было получать уведомления от роботов и компьютеров. Чуть посидев (а как вы помните я Lua не знаю) получилось вот это: https://pastebin.com/rZC8BZMs Что позволяет? Вы можете или запускать эту "штуку" просто с аргументом или вырезать те 2 строчки, которые принимают аргументы и просто включить этот код в код вашей программы и получать уведомления в телеграмм. Назвал я эту штуку TGInformer. Что нужно для работы? Со стороны Telegram: Добавить вот этого бота: https://t.me/ShowJsonBot, написать ему и в секции from найти id и записать его Добавить бота https://t.me/OC_InformerBot и написать ему любое сообщение. Со стороны OpenComputers: Компьютер с сетевой картой Загрузить код информера и открыть его для редактирования. Вверху в поле chatid впишите ID, который получили пунктами выше. Выполните tginformer test В результате в телеграм должно прийти test, а в игре код ответа: ОК Теперь осталось вписать это в свою программу и робот будет присылать уведомления типа я покакаль я выкопал ту большую яму P.S. Спасибо @@Alex за правки
  19. Как в луа удалить ВСЕ HTML тэги из строки? Типа как аналог функции strip_tags() в PHP
  20. Совсем недавно я выложил свою библиотеку, которая позволяет экономить оперативную память при хранении бинарных данных. Из фатальных недостатков той старой библиотеки можно выделить: 1) Колоссальная нагрузка на CPU и сборщик мусора 2) Работа со иммутабельными строками Получив порцию критики, я переписал библиотеку и добился офигенных результатов. Новая библиотека экономит ровно столько же оперативки ( экономия до 80-90% ) и при этом не имеет перечисленных недостатков старой. UniDataArray.lua Примечание: для работы с этой библиотекой необходимо наличие следующий библиотек: 1) num_transform.lua 2) class.lua (доработанная версия) Новая библиотека сильно отличается от старой версии. Теперь вместо строк используется таблица с числами. Интерфейс взаимодействия с UniDataArray реализован так, что при каждой операции записи-чтения данных происходит изменение внутреннего содержимого таблицы с числами. В Lua используются 64-битные числа, что дает возможность использовать их как хранилище более мелких "частичек информации". Например, одно число в Lua может хранить информацию о 8 байтах или о 64 битах. Работа библиотеки основана как раз на этой возможности умещать данные в больших числах. Вот пример использования библиотеки UniDataArray.lua Абзац с неинтересным описанием некоторых интересных моментов: При создании массива данных в кодировке base размера N программа создаст ровно столько блоков, сколько необходимо для хранения N чисел. Чем больше значение кодировки, тем меньше чисел этой кодировки может поместиться в блок. При создании массива байт каждый блок будет вмещать 6-7 ячеек. local arr = UniDataArray(100000, 256) -- кодировка 256, значит это байты print(arr.block_len) -- длина блока = 6 ячеек print(arr.length) -- всего создано 16667 блоков Но вот при создании массива бит, каждый блок будет иметь аж 62 ячейки: local arr = UniDataArray(100000, 2) -- кодировка 2, значит это биты print(arr.block_len) -- длина блока равна 62 ячейкам print(arr.length) -- всего создано 1613 блоков Также есть возможность создания массивов в кодировках 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, но кому оно надо, я не знаю Реализовал "чтобы было". Лично я пользуюсь только кодировками 2 и 256. Каждый блок занимает примерно 64 бита вне зависимости от количества ячеек в нем Краткая документация библиотеки Чтобы создать UniData-массив нужно вызвать функцию-конструктор передав в нее два аргумента: 1) необходимое количество ячеек и 2)допустимую кодировку этих ячеек. Пример: local UniDataArray = require("UniDataArray") local array = UniDataArray(100000, 4) -- создание массива из 100000 'четырехразрядных' чисел У класса UniDataArray есть следующие методы: write = function(pos, bytes) -- записывает числа bytes(table) начиная с позиции pos(number). Возвращает позицию последней записанной ячейки read = function(pos, count) -- считывает count(number) чисел начиная с позиции pos(number). Возвращает позицию последней прочитанной ячейки fill = function(elem) -- устанавливает значение elem(number) всем ячейкам в массиве Пример использования UniDataArray как массива битов Ну, в этом нет ничего сложного: local UniDataArray = require("UniDataArray") local array = UniDataArray(20, 2) -- массив из 20 битов array.write(0, {0, 1, 0, 1, 1, 1, 0}) -- записать биты 0101110 в ячейки после нулевой. 0 array.write(5, {1, 1, 1, 1, 0, 1, 1}) -- записать биты 1111011 в ячейки после пятой. 5 local someData = array.read(2, 5) -- прочитать 5 битов начиная с позиции 2 print(table.unpack( someData )) -- выведет на экран 01111 Ну и на сладкое у нас тест производительности! Table VS UniDataArray Запускал на тех же тестах, что и в прошлый раз. Результат теста: Плюсы библиотеки: описаны выше( потребление оперативки сокращается в 20, мать его, раз! ) Минусы: библиотека пока еще очень сырая, но это поправимо. Я ее еще успею отполировать
  21. Где можно найти сайт который при отправке запроса вернёт реальное московское время? В формате: часы:минуты
  22. Услышал от qwertyMan'а что глобальные переменные зло и решил заменить все глобальные в приложении на локальные и перестало работать. Может я очень тупой и что то не правильно сделал но не работает.
  23. Недавно наткнулся на пост о довольно интересном соревновании для роботов-пылесосов http://codeforces.com/blog/entry/55882 Примечательно то, что в том соревновании кодят как раз на Lua. Как думаете, может стоит когда-нибудь провести такое соревнование на серверах computercraft? Это было бы очень крутым событием, которое может привлечь новых игроков в игру на сервере. Особенно если сделать пафосный видос об этом соревновании на YouTube. Для еще большего пафоса можно поставить огромный монитор(3х3 монитора) на спавне и транслировать все туда. П.С. Если надо будет организовать такое соревнование, я готов. Это не трудно ( на первый взгляд, конечно ). Видео с одного из раундов:
  24. Всем привет. Представляю вашему вниманию: Замок для дома на Magnetic Card Reader Также есть редстоун выход. pastebin run LY6uj0xT Код: https://pastebin.com/LY6uj0xT
  25. Всем привет! Недавно решил проверить, что тут у вас и был огорчен - меня забанили на форуме Но сейчас не об этом! Как вы уже, наверное, поняли из названия темы, здесь будет кое-что интересное! А именно, я написал нейронную сеть. Она еще не дописана до конца, но один учитель есть, и она уже вполне может функционировать. Вот исходник: https://github.com/MrSyabro/Neuro Вот пример программы: local neuro = require("Neuro") network = neuro.Neurons:CreateNetwork (neuro.AFunctions:BipolarSigmoidFunction(), {3, 5, 5, 3}, neuro.Neurons.ACompute) inputs = { {1, 0, 1}, {0, 0, 1}} outputs = { {0, 1, 0}, {1, 1, 0}} for i = 1, 50 do print(neuro.Learning.BackPropagationLearning:RunEpoch(network, inputs, outputs)) end При вызове ф-ции Createnetwork кроме "{3, 5, 5, 3}" лучше ничего не трогать. Эта таблица определяет параметры сети. А именно слои и кол. нейронов в них. Первый слой входной, 3 нейрона - 3 входа, 2 по центру - скрытые, последний - выходной. "inputs" и "outputs" - таблицы наборов уроков (подобраны случайно). {1, 0, 1} - вход, соответствует {0, 1, 0} выходу. Далее 50 циклов уроков с выводом общей погрешности сети. Вот только... Lua не нравится огромные значения после запятой.. так что получается "-1.#IND"
×