ProgramCrafter
Пользователи-
Публикации
245 -
Зарегистрирован
-
Посещение
-
Победитель дней
41
Тип публикации
Блоги
Профили
Форум
Багтрекер
Магазин
Все публикации пользователя ProgramCrafter
-
Или так, или вообще переписать OpenComputers и сделать среду выполнения Lua на Java. (Кстати, тогда не понадобится та dll, которая идёт в комплекте с модом.) @hohserg предлагает возвращать управление джаве, но это невозможно из-за ограничений самого Lua: coroutine.yield нельзя вызывать из кода, запущенного библиотекой debug. Возможно, в этом есть и своя логика: во время выполнения той функции checkDeadline управление принадлежит не пользовательскому коду, и yield может прервать не тот поток.
-
Идея состоит вот в чём: код запускаемой программы компилируется стандартной функцией load, а выполняется уже системой (то есть система выполняет роль виртуальной машины Lua). После интерпретирования каждой K-ой команды байткода система уступает управление с помощью coroutine.yield. Таким образом, прерывания будут происходить независимо от кода программы и достаточно часто, чтобы не вылетать в нормальных условиях. Бонус - можно заново написать библиотеку debug, чтобы отлаживать пользовательские программы. Хотя сразу возникает проблема с подачей событий: они начнут или пропускаться, или активно копиться в буфере. Если несколько игроков будут активно тормошить компьютер, он может вылететь с нехваткой памяти.
-
Disclaimer: 1. Ниже в этой теме может встречаться код, который может нанести ущерб вашему серверу. Эти образцы предоставлены лишь в ознакомительных целях! Я не несу ответственности за положенные ими сервера Майнкрафта. 2. Я не залазил глубоко в исходники OpenComputers, поэтому могу где-то ошибаться. Одна из часто встречающихся проблем в OpenComputers - превышение таймаута выполнения программы. При этом выбрасывается ошибка TLWY (too long without yielding). При лагах сервера эта ошибка может возникать совершенно случайным образом, иногда даже в консоли OpenOS. Иногда компьютер может вообще выключиться с синим экраном. Чтобы создать стабильную систему, проблему TLWY надо решить. У меня были такие идеи: 1. Обёртки из pcall. Это будет некрасиво выглядеть и понизит максимальную глубину рекурсии. 2. Принудительная вставка yield в код. Проблемы такого подхода - потеря множества событий и необходимость парсинга кода. 3. Принудительное прерывание кода по обращениям к глобальным переменным. Проблема - невозможность отследить вызов анонимной функции. Например, так не прервать код (function(f) return f(f) end)(function(f) return f(f) end). 4. Интерпретировать байткод Lua. Самое доступное решение, но надо знать формат байткода и обновлять с выходом каждой версии Lua. 5. Переписать виртуальную машину Lua так, чтобы она сама уступала управление другим потокам (тогда ошибка TLWY уйдёт в прошлое). Для этого надо договориться с разработчиками OpenComputers и уметь программировать на Java. Есть ли какие-то варианты избежания TLWY, которые я упустил?
-
Видимо, файл не так составлен, как программа ожидает, или принтер почему-то не подключился. Стандартные модели печатаются или нет?
-
заказ Benchmark - тестируем эмулятор OpenComputers
ProgramCrafter ответил в тему Totoro в Новые заказы
Новый рендер действительно похож на Minecraft. Единственное, что мне не нравится - это неограниченное потребление памяти браузером - достаточно запустить такой код, и реальный компьютер станет лагать: while true do for i = 1, 50 do print(string.char(math.random(56, 126))) end os.sleep(0) end -
Постоянное возвращение в операционную систему
ProgramCrafter ответил в вопрос Bogdikon в Помогите найти ошибку
Насколько я помню, команда return вне функции выполняет выход из программы. Скорее всего, там нужно что-то вроде print(redstone.setAnalogOutput("bottom", 15)). -
заказ Benchmark - тестируем эмулятор OpenComputers
ProgramCrafter ответил в тему Totoro в Новые заказы
@hohserg Закинул: https://pastebin.com/raw/qdYmD7Bw Только что перепроверил, вроде все тесты работают. Единственная странность - что Юникод рендерится дольше, чем простой ASCII, хотя вызовов к gpu.set остаётся столько же. Возможно, быстрее исчерпывается бюджет вызовов, но это сомнительно. -
OpenOS надо устанавливать с дискеты на жёсткий диск, как и в Minecraft. На дискете с OpenOS файл создать невозможно - файловая система дискет защищена от записи.
-
Только что проверил в майне. Стандартные значения входов (если редстоун не подключен / не запитан) равны 0. Лимиты по output - от -2 147 483 648 до 2 147 483 647. При превышении лимита значение приводится к этим порогам (ошибок нет). При этом для красной пыли реальное значение напряжённости (в мире, а не для компьютера) приводится к диапазону от 0 до 15.
-
В связи с отсутствием готовых программ конкурс продлён на неопределённое время (скорее всего, до зимы). Если вы уже начали программировать Нью-Байта, то продолжайте работу, ваша программа обязательно будет принята!
-
Решил попробовать эту штуку. Эмулятор с возможностью менять компоненты на лету (кроме того, и выдающий при этом событие component_removed/component_added) - это интересно. В эмуляторе есть возможность подключить диск в режиме unmanaged (чтение/запись по байтам, а не по файлам)? Предложения по дальнейшему развитию: 1. Сделать подсветку сторон компьютера в зависимости от сигнала редстоуна. 2. Заменить стандартные значения входов редстоуна с -1 на 0. 3. Сделать ограничения на выход редстоуна (я только что поставил выход с силой -161, это почему-то работает). 4. Создать компонент "лампа", светящийся при сигнале красной пыли. 5. Сделать компонент drive (если его нет) и дать возможность менять вид диска по ПКМ.
-
Мне кажется, что это пока ещё только альфа. Пока нету чего-то, похожего на работающий интерфейс, версию обычно не называют "бета". Есть хотя бы идеи, как интерфейс должен выглядеть? Макет ведь тоже можно выложить, чтобы другие его оценили. Или идеи засекречены, чтобы другие не написали оболочку раньше?
-
Интересная идея. Надеюсь, сам интерфейс не будет выглядеть, как беспорядочная куча элементов. По поводу многозадачности: как будут обрабатываться программы, долго не передающие управление (например, с тяжёлыми вычислениями)? У меня есть только одна идея по этому поводу: можно создать интерпретатор Lua на самом Lua, и выполнять команды в пользовательских программах по одной, чередуя их с возвратами управления системе. Он будет контролировать запущенную программу или проверять код на наличие зловреда? Если второй вариант, то я буду рад протестировать такую программу.
-
Возможно, чтобы измерить лаги, стоит держать корпус реактора в нагретом состоянии, а в выключенный реактор класть теплоотвод? Тогда компьютер сможет проверить, в какой момент изменилась температура реактора и насколько низок TPS. Компьютер можно запитать от таймера. При лагах, даже если он выключится, то он будет автоматически включен по сигналу редстоуна и снова станет ждать, когда лаги кончатся. Но вообще с проблемой TLWY может справиться что-то вроде pcall.
-
Разумеется, если реактор стабилен, то и говорить не о чем. С ним может справиться даже AE. Но если нужен больший выход, чем (например, ЯР запитывает генератор материи), то стабильные схемы будут проигрывать схемам, использующим микроконтроль со стороны робота. Пример такой схемы от @eu_tomat (https://computercraft.ru/topic/2822-mikrokontrol-yadernyh-reaktorov-ic2exp/?do=findComment&comment=39656):
-
Я обновил список компонентов, теперь там появился формовщик металла (для стержней) и датчик температуры из NuclearControl. Правда, если греется уже корпус, то (скорее всего) что-то в схеме сгорело и нужен запасной теплоотвод. Однако роботу не из чего будет его делать: ему доступны только железо, уран и золото (из термальной центрифуги). Робот может самостоятельно считывать и выдавать сигнал красной пыли. И я не рекомендовал бы выдавать сигнал на нагретый реактор вне зависимости от его температуры. Иначе на карте вместо домика может появиться большая дыра.
-
На форуме есть множество программ, копающих картошку-морковку, строящих домики, добывающих ресурсы, но нет ни одной программы по обработке добытой руды в машинах IndustrialCraft! Цель конкурса - исправить это недоразумение и создать робота, превращающего железную и урановую руду в иридий (или другие ценные ресурсы - по вашему выбору). Задача - спроектировать домик Байта и создать программу, позволяющую ему: 1) забирать брошенные предметы, 2) выкидывать все ненужные предметы в утилизатор, 3) утильсырьё перекладывать в генератор материи, 4) обрабатывать (по произвольному алгоритму) руду, 5) изготавливать урановые стержни, обслуживать реактор, не допускать его взрыва, 6) добывать при этом как можно больше иридия. Дополнительная задача - как-либо показать благодарность игроку, бросившему ресурсы. Например, ласково подмигнуть или бросить ему цветочек. (Главное, чтобы это была не роза иссушения, иначе игрок обидится!) Комплектация: 1) любой робот с любыми компонентами, кроме творческих; конвертер питания из IC2 в OC; зарядник (для робота); 2) бесконечный источник воды (если нужен); 3) электропечь; дробилка; компрессор; утилизатор; наполнитель; рудопромывочная машина; термальная центрифуга; формовщик металла в режиме "Выдавливание"; формовщик металла в режиме "Прокатка"; 4) генератор материи; репликатор с шаблоном иридия; 5) ядерный реактор (не жидкостный; количество камер - по усмотрению) с трансформаторами и энергохранилищами; датчик температуры из NuclearControl; 6) МЭ-сундук с диском. Улучшения-выталкиватели и втягиватели для машин IC2 запрещены! Изначально в ядерном реакторе выложена рабочая схема, чтобы робот мог начать обрабатывать руду. Номинации конкурса: 1) зрительские симпатии - общее голосование за лучшую программу; 2) эффективность - количество произведённого иридия на X железной и X урановой руды; 3) читаемость и расширяемость кода - также общее голосование по сложности добавления новых фич в программу; 4) красивое оформление - робот не висит в одном месте, пока уран в реакторе не закончится, а (например) танцует и переливается. Награда: 16 алмазов за победу в номинации вскоре после открытия TechnoCraft-а. Конкурс рассчитан примерно на месяц (до 24 августа), в конце августа будет недельное голосование за лучшие варианты.
-
Кажется, часть файлов (сама библиотека) нашлась: https://github.com/AtomicScience/OCNS Там нет программ вроде смены IP и прочего, т.е. команда change_mIP работать не будет. Но сама библиотека вроде цела. (уже фантазии) А может быть, идёт разработка новой версии стека, который займёт место старого? (Скорее всего, причина прозаичнее: автору могло понадобиться место на Яндекс.Диске.)
-
Немного допилил стандартный tape.lua, чтобы он мог считывать файл с кассеты: pastebin get pTVnhYwp /usr/bin/tape.lua Замечание: в исходном файле не должно быть нулевых байт.
- 33 ответа
-
- 1
-
-
- стример
- аудио-файл
-
(и ещё 1 )
Теги:
-
Автоподстановка компонентов - замена %имя_компонента% в аргументах программы на его адрес. Это можно использовать, чтобы разные программы взаимодействовали с разными компонентами и не пытались, например, передавать разные данные через один контроллер редстоуна или рисовать разные интерфейсы на одном мониторе. Сейчас в программе адреса видеокарт подставляются в том порядке, в каком их выдаёт component.list. Если видеокарт меньше, чем мест для подстановки, то список повторяется. Стоит ли сделать то же самое для других компонентов?
-
Вероятно, многие хотели запустить несколько программ на одном компьютере (на OpenOS), чтобы они работали одновременно. Моя программа даёт возможность это сделать (программы будут выполняться не совсем одновременно, таково ограничение OpenComputers). Важное условие: в каждой выполняемой программе должен быть os.sleep, event.pull или computer.pullSignal, чтобы она передавала управление другой. Инструкция: 1. Скачайте программу: pastebin get wsJqngC5 parallel.lua 2. Запустите её. 3. Введите пути к программам, которые необходимо выполнить параллельно, через пробел (если программа одна, то введите её один раз). 4. Введите число, сколько раз должна быть запущена каждая программа из списка. 5. Задайте аргументы для каждой запускаемой программы. Если несколько программ должны работать параллельно, то почему бы не запустить их на разных мониторах? Это возможно: просто напишите в аргументы программы %GPU%. Эта строка автоматически заменится на адрес видеокарты. В программе могут встречаться баги и несовместимости с другими приложениями. Просьба сообщать, если таковые найдутся.
-
Крафт OCTechnics. Часть 3 - назад в 1.7.10
ProgramCrafter добавил запись в блоге в Рецепты программирования
Портирование мода с 1.14 на 1.7.10 версию оказалось настоящим эпическим сражением, продлившимся целый день. Сейчас я опишу, как мне удалось в нём победить. Половину дня я пытался понять, почему один мой Gradle (для Minecraft 1.7.10) не может определить версию Java по строке «12.0.1», а другой (для 1.14) заявляет, что надо указать версию плагина «forge». Ключом к решению оказалось использование OpenJDK 10 и обновление Gradle до 4.1 версии. На этом проблемы не закончились. Gradle стал скачивать нужные файлы, но не смог скачать их все. Некоторые файлы (такие, как twitch-5.16.jar) отсутствуют на двух сайтах-источниках (minecraftforge.net и ещё один), а с официального сайта Minecraft Java скачать файлы не может, так как там есть проблема с сертификатом. Добавление корневого сертификата с minecraft.net в доверенные (тут как раз пригодилось то, что я скачал дополнительную Java) ничего не дало. Я скачал все недостающие файлы через браузер, и тут у меня возникла проблема: а в какую папку их надо положить? Не считать ведь хеш-суммы каждого файла и не раскидывать по отдельным папкам руками? Решение оказалось очень простым: если Gradle стучится и проверяет, нет ли файла на files.minecraftforge.net, то этот запрос можно перехватить и направить на локальный сервер, где файл уже есть. Как это можно сделать? Правильно, с помощью файла hosts. Тогда я прописал перенаправление с files.minecraftforge.net на 127.0.0.1, поднял локальный сервер и положил туда все нужные файлы. Запустил Gradle - ура, все файлы скачались! Сервер можно выключать. Дальше осталось совсем немного: посмотреть в исходники каких-нибудь модов под 1.7.10 и разобраться, как они работают. Поменять в своём коде пришлось (почти) только основной класс. Также изменился файл локализации. В каком виде мод работает (OCTechnics.java): Файл ./common/blocks/BasicFactoryBlock.java: assets/octechnics/lang/en_us.lang: tile.octechnics:basic_factory_block.name=Factory Base Текстуры немного переехали: из папки block попали в папку blocks. Наконец, я запустил мод и он заработал: в первой вкладке творческого инвентаря появился блок с моей текстурой, правильно названный и нормально ставящийся в мир. Этого я и хотел! Дальнейшие приключения (расширение ассортимента и добавление к блокам блок-сущностей) будут в следующей статье. -
Крафт программ. Пилим OCTechnics - часть 2. Создание блока
ProgramCrafter прокомментировал ProgramCrafter запись в блоге в Рецепты программирования
IntelliJ IDEA не пробовал ставить, а Eclipse просто не по делу тупит. Может быть, чуть позже и поставлю IDEA, но конкретно сейчас я пытаюсь разобраться с Gradle под 1.7.10. -
Крафт программ. Пилим OCTechnics - часть 2. Создание блока
ProgramCrafter добавил запись в блоге в Рецепты программирования
Из чего состоит любой завод в Minecraft? Из блоков! Поэтому их надо сделать. Для удобства сборки я создал .bat скрипт, выполняющий gradlew clean, gradlew build и копирующий мод в папку. Теперь можно поменять что-то в коде (или в другом файле), запустить скрипт и через полминуты уже включать Minecraft, чтобы проверить, всё ли заработало. В поисках документации, как правильно добавить блок и откуда импортировать пакеты, пришлось перерыть полинтернета. В результате лучшим источником оказались исходники других модов, вроде Forestry или Glassential (первый попавшийся мне под руку мод, добавляющий блоки). Кроме того, я обнаружил странную вещь: все моды используют импорт CreativeTabs, но мой мод с ним отказывается компилироваться, говоря про отсутствие пакета net.minecraft.creativetab. Ещё хуже с документацией, как заставить мод реагировать на события. Стандартная шина данных Forge (MinecraftForge.EVENT_BUS) не сработала ни для одного события, которое мне нужно. Пробовал установить Eclipse для удобства разработки, но он не распознал декомпилированный Minecraft и подсветил все мои импорты красным. Когда я открыл вкладку с задачами Gradle, среда зависла. Тогда я стал работать в Notepad++. Итоговый вариант, который у меня заработал и стал правильно добавлять блок (файл TestMod.java необходимо переименовать в OCTechnics.java): Файл org/octechnics/octechnics/common/blocks/BasicFactoryBlock.java: В папке resources: assets/octechnics/blockstates/basic_factory_block.json: assets/octechnics/lang/en_us.json: assets/octechnics/models/block/basic_factory_block.json: assets/octechnics/models/item/basic_factory_block.json: Текстуру блока я положил по адресу assets/octechnics/textures/block/factory_base.png. Следующий этап, который будет описан в отдельной статье - возврат на версию 1.7.10, где есть необходимые моды - IC2 и OpenComputers.
