Перейти к содержимому

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

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

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

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

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


Блоги

  • Робот Байт
  • Fingercomp's Playground
  • 1Ridav' - блог
  • Totoro Cookies
  • Блог cyber01
  • IncluderWorld
  • KelLiN' - блог
  • Крутой блог
  • eutomatic blog
  • Programist135 Soft
  • Сайт в сети OpenNet
  • PieLand
  • Очумелые ручки
  • Блог недоблоггера
  • В мире Майнкрафт
  • LaineBlog
  • Квантовый блог
  • Блог qwertyMAN'а
  • some blog name
  • Дача Игоря
  • Тут был Артур.

Форумы

  • Программирование
    • Программы
    • База знаний
    • Разработчикам
    • Вопросы
  • Игровой раздел
    • Игровые серверы
    • Предложения по улучшению игрового процесса
    • Моды и плагины
    • Жалобы на игроков
    • Ивенты
  • Общение
    • Вопрос-ответ
    • Беседка программистов
    • Беседка-флудилка
    • Шкатулка
  • Технический раздел
    • Багтрекер
    • Архив

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

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


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

  • Начать

    Конец


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

  • Начать

    Конец


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

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

  • Начать

    Конец


Группа


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


ВКонтакте


Gtalk


Facebook


Twitter


Город


Интересы

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

  1. Примитивная Операционная Система для слабых компьютеров Возможности: Простое API для быстрого и лёгкого написания своих программ (Документация: в розработке) Удобный Файловый менеджер для работы с файлами и папками Наличие редактора кода (Больше не знаю, что еще сказать, но думаю вы всё поняли) Кнопки: Стрелки Вверх и Вниз - навигация по файлам Enter - запустить програму, или открыть папку Tab - переключения по доступным дискам (дискетам) Alt - Открыть системное меню Ctrl - Открыть меню файла/папки (в текстовом редакторе - меню сохранения) Системные требования: Корпус компьютера, екран - 1 Tier Процесор - 1 Tier Видеокарта - 1 Tier Память - 1.5 Tier (x1) Жерсткий диск - 1 Tier Дисковод, клавиатура, Lua BIOS - должны присутствовать Установка: Вставляете чистую дискету в комп (с OpenOS) Вводите команду в консоль: pastebin run ngQT9YF8 Выбираете пустую дискету из спика файловых систем Когда всё будет готово - вынимаете теперь уже инсталлер данной ОС Собираете слабый комп и устанавливаете ОС с дискеты Буду рад отзывам, которые помогут мне улучшать систему. Скриншоты: Внимание! Просмотр кода может вызвать побочные ефекты: ужас, стыд, депрессия, потеря сознания
  2. Некоторое время назад я публиковал программку - интернет-мост Stem. Он очень простой в использовании, но к сожалению пока не лишен некоторых глюков. А кроме того, у него есть недокументированные возможности. Предлагаю сейчас поиграться с одной такой тайной фичей. Это будет интересно тем, кто немного знаком с HTML/CSS/JavaScript. В чём суть? Всё просто. У Stem есть веб-клиент. То есть если вы зайдете по адресу https://stem.fomalhaut.me (например), вы увидите окно, которое пригласит вас ввести ID канала и початиться прямо с сайта. После ввода ID канала, вас перекинет на страничку с "чатом", где вы сможете посылать сообщения вашему компьютеру/роботу в майнкрафте. Адрес этой странички будет выглядеть примерно так: https://stem.fomalhaut.me/channel?id=test Где test это ID вашего канала. Когда робот будет вам отвечать, это будет видно в логе. Примерно так: А теперь - тайная фича. Находясь на страничке канала, как на скриншоте, вы можете приписать к адресу дополнительный флаг: &render=true. Полный адрес станет выглядеть примерно так: https://stem.fomalhaut.me/channel?id=test&render=true И начиная с этого момента, все входящие сообщения от компьютера в OpenComputers будут не отрисовываться в лог, а попадать в JS функцию eval(...). Что это значит? Те кто имел дело с JS уже наверное поняли все последствия. Но я поясню. Это значит, что компьютер OpenComputers может прислать сообщение с JS кодом, и сайт Stem этот код выполнит. А это значит, что вы можете творить на сайте вообще всё что угодно. Вы можете удалить интерфейс, показать вместо него новый, скачать что-то с инета, запустить игрушку... да хоть майнить крипту. Поиграем Ничего вредоносного мы делать конечно сейчас не будем. Вместо этого, традиционно, попробуем сделать так, что сайт Stem превратится в сайт для управления светом в нашем доме в Майнкрафте. Шаг первый. Подготовим дом. Тут всё просто - стандартный компьютер, с интернет картой, от него кабель к I/O блоку, а на блоке - подопытная лампа. На компьютер ставим Stem. Например, ставим HPM такой командой, pastebin run vf6upeAN И потом пишем: hpm install stem Нажимаем Enter и готово. Шаг второй. Нам нужен сайт. Усложнять не будем, и наш революционный дизайн будет выглядеть так: Что нам нужно сделать, чтобы сайт Stem превратился в то что нам надо? Методом тыка, через консоль браузера определяем, что достаточно выполнить такой код: document.body.innerHTML = " <style>button:active { background: #fac700; }</style> <button onclick=\"sendMessage(\'toggle\')\">Toggle Light</button> "; document.body.style.alignItems = "center"; Первой строкой мы просто заменяем всё содержимое тега <body> на то что нам надо. Я добавил еще немного косметики в виде стиля для кнопки. Вторая строка - тоже косметика, я просто поправил стиль на теге <body> чтобы кнопочка была посередине. Один важный ньюанс - на кнопке повешено свойство onclick с кодом sendMessage("toggle"). Таким образом, когда пользователь тыкнет по кнопке, мы отправим сообщение обратно в OpenComputers. Функцию sendMessage нам дает веб-клиент Stem. Ей можно безвозмездно пользоваться в своих целях. Шаг третий. Соединяем это все вместе. Теперь надо набросать программку для нашего компьютера в Майнкрафте, чтобы он выслал подготовленную JS-"бомбу" по нашему сигналу. Эники, беники... выходит что-то такое: local event = require('event') local stem = require('stem') local side = require('sides') local com = require('component') local redstone = com.isAvailable('redstone') and com.redstone or nil local channel = "test" local layout = [===[ document.body.innerHTML = "\ <style>button:active { background: #fac700; }</style>\ <button onclick=\"sendMessage(\'toggle\')\">Toggle Light</button>\ "; document.body.style.alignItems = "center"; ]===] local lampSide = side.top local lampTurnedOn = false print("Connecting to the #" .. channel .. " STEM channel...") local server = stem.connect('stem.fomalhaut.me') server:subscribe(channel) print("Done.") print("Press [q] to quit.") while true do local name, a, b = event.pull() if name == "stem_message" then local message = b if message == "connect" then print("Someone wants to connect - sending the layout...") server:send(channel, layout) elseif message == "toggle" then if redstone ~= nil then if not lampTurnedOn then redstone.setOutput(lampSide, 16) lampTurnedOn = true else redstone.setOutput(lampSide, 0) lampTurnedOn = false end end end elseif name == "key_down" then local char = b if char == 113 then break end end end server:disconnect() Я думаю тут большая часть очевидна и понятна. Мы подключаемся к серверу Stem, подписываемся на нужный канал и внимательно слушаем входящие сообщения. Когда пользователь присылает сообщение connect, мы отправляем ему подготовленный код, который мирно лежит в переменной layout. Этот код прилетит к пользователю, и, если пользователь смотрит страницу с включенной опцией render=true, код сработает и перерисует страницу. Если опция будет отключена - он просто увидит код в логе, как простое сообщение. Шаг четвертый. Тестируем. Откроем наш канал по ссылке: https://stem.fomalhaut.me/channel?id=test&render=true Появится пустой лог. Запустим программу в OpenComputers. Она отрисует наше приветствие, что-то вроде: Сonnecting to the #test STEM channel... Done. Press [q] to quit. Теперь пишем на сайте команду connect. Если мы все сделали правильно, и Stem не заглючил, интерфейс сайта исчез, и вместо него появилась наша кнопка. Нажимаем её. Вуаля! Дома зажегся свет. Постскриптум Это конечно же недокументированная хакерская фича, которую можно считать альфа-версией. Кроме того в Stem сейчас есть неуловимый баг, из за которого сообщения иногда не доходят. Не пугайтесь. Если кто-нибудь предоставит мне сценарий (прямо по шагам), при котором 100% срабатывает баг - буду очень рад и пофиксить его будет легче. С помощью описанной фишки можно придумать много хрени. Я показал самое простое что пришло в голову. Уверен, ваша фантазия будет покруче моей ) Пишите баг-репорты или пожелания по фиче, да и просто комменты в эту тему, либо мне в любой канал связи, где я онлайн.
  3. Небольшая программка для записи информации через Card Writer из мода OpenSecurity. Очень полезно когда работаете с множеством контроллеров. Загрузить можно в App Market'e или в моем гитхабе
  4. Для тех, кто спешит: https://ocelot.fomalhaut.me/ На форуме давно мелькают упоминания Ocelot. Это эмулятор OpenComputers, который находится в разработке примерно с 2015 года, был несколько раз переписан и наконец увидел свет в закрытом альфа-тесте зимой 2018. Я немного отвлекся на другие проекты (привет Stem), но теперь возвращаюсь к разработке Ocelot, и с гордостью предствляю вам тизер-анонс и, по совместительству, открытый альфа-тест Ocelot. Ещё один эмулятор? Да. Будем честны. Нормального эмулятора OpenComputers не существует. Те что есть - полны костылей, не совсем соответствуют реальному моду, сложны в установке, заброшены... и так далее. Ocelot - это решение всех этих проблем. Основная идея Ocelot - взять уже существующий код мода OpenComputers, тщательно отделить всё не нужное (Майнкрафт), затем осторожно переписать то что получилось с поправкой на реалии эмулятора. Благодаря этому, Ocelot эмулирует OpenComputers с ранее невиданной точностью. Вплоть до того, что в эмуляторе могут встречаться те же самые баги, что и в моде. Что он умеет? Практически всё. В перспективе. Ocelot позволяет воссоздать схему любой сложности из любого количества блоков - мониторов, компьютеров (любой конфигурации), проводов, модемов и прочих компонентов. Он позволяет управлять скоростью работы компьютеров, позволяет изменять "игровое" время, ставить его на паузу, сохранять состояние работы компьютеров и потом возобновлять работу с любого сохранения. Сейчас доступен базовый набор компонентов и блоков. Это кабель, корпус компьютера, APU/CPU, плашки памяти, видеокарты, дата-карты, EEPROM, дискеты, жесткие диски (managed и unmanaged режимов), интернет-карта, линкед-карта, сетевая карта (проводная и безпроводная), редстоун-карта / блок и монитор. Список будет расширяться. В перспективе будет эмуляция всех блоков и компонентов стандартного OC, роботов, дронов, микроконтроллеров, серверных стоек, плюс эмуляция адаптера и интеграции с ванильными блоками и блоками других модов. Что можно потрогать? Ocelot задуман как модульный проект. А именно: Ocelot Brain Основа эмулятора - это библиотека Ocelot Brain. Она написана на Scala и может быть подключена к любому другому проекта на Scala (и, может быть, Java). Ocelot Brain - это как раз переработанный код OpenComputers в компактной и удобной форме. Отвечает за всю эмуляцию кода и компонентов, а также сохранение / загрузку проектов. Вы можете использовать его для своих проектов, можете помочь с разработкой и патчами. Проект открыт и доступен по адресу: https://gitlab.com/cc-ru/ocelot/ocelot-brain На данный момент Ocelot Brain актуален версии OpenComputers 1.7.4. Ocelot Online На основе проекта Ocelot Brain, в качестве демонстрации его возможностей, создается проект Ocelot Online. Ocelot Online это эмулятор OpenComputers в виде сайта. Да. Всё что вам нужно для его запуска - это открыть сайт. Ссылка: https://ocelot.fomalhaut.me/ Исходный код тоже доступен: https://gitlab.com/cc-ru/ocelot/ocelot-online Поскольку проект пока находится в альфа-релизе, большая часть возможностей закрыта. Доступен только один монитор на всех, который позволяет взаимодействовать с уже настроенным демо-проектом. Конфигурация проекта: Креативный корпус, CPU T3, видеокарта T3, две планки памяти T3.5, managed жесткий диск T3, unmanaged жёсткий T3, интернет карта, редстоун карта T2, дисковод с дискетой Open OS, монитор T2, клавиатура и EEPROM с Advanced Loader от товарища Luca_S. Отличия от стандартного OpenComputers: * В OpenOS уже установлен HPM. Благодаря этому можно быстро ставить разные программы через hpm install. * Вставка текста заменена с Insert на Ctrl + V. Браузер не дает изменить этот хоткей. * В редакторе edit кнопка выхода заменена на Ctrl + E. Стандартная комбинация юзается браузером для закрытия вкладок - и переопределить её нельзя по соображениям безопасности. * Иногда не печатаются стек-трейсы. Это последствия одного фикса против одного вредного эксплойта. Проблема уже сообщена разработчикам OC. Как только нормальный патч появится в OpenComputers - я пропатчу и Ocelot. * Вместо OpenOS EEPROM используется Advanced Loader. Это сделано для удобства и наглядности. * Не работает лок на пользователя - по понятным причинам. Ocelot Online должен так же работать на смартфонах. Однако возможно придется отключить T9 - он портит эвенты клавиатуры. В разработке находится более сложная версия, где все получат возможность зарегистрировать аккаунт и создавать личные проекты любой конфигурации. Но это дело будущего. Ocelot Desktop Это классический вариант эмулятора Ocelot в виде программы, которую можно скачать и запустить на любой операционной системе, где есть Java. Построен на Ocelot Brain и библиотеке LWJGL (как и сам майнкрафт). Разработкой занимается товарищ @LeshaInc. Я не буду спойлерить и рассказывать про его проект - если он захочет, сам расскажет. Альфа-тест Итак, дорогие пользователи, пишите ваши хотелки, сообщайте о багах, обо всем что работает не так как должно, и как в оригинальном OC. Я, со своей стороны, постараюсь проект не забрасывать, развивать и своевременно (или не очень) обновлять. Благодарности Над проектом также работали: @LeshaInc, @Laine_prikol, @Fingercomp и @MeXaN1cK. За что им огромное спасибо и респект. Не забудем также всех, кто помогал с альфа-тестированием, Сангара - за чудесный мод, и мейнтейнеров OpenComputers за то что его не забросили (всё ещё ждем от них фикс). Enjoy!
  5. GPS это куча оборудования, трата энергии и времени, но иногда может понадобится там, где нет встроенного акселерометра, как у робота. Попробуем разобраться, как настроить и построить сеть спутников, по которым можно вычислить свои координаты. Где-то была готовая программа, но я ее не нашел, поэтому восстановил основной функционал, по примеру КомпутерКрафта. Для начала нужен компьютер с установленной OpenOS. Скачиваем для него программатор хостов: pastebin get ZD8GysNP /bin/fgps.lua Эта программа позволяет устанавливать прошивку для спутников-микроконтроллеров, которые будут рассылать свои координаты по запросу. Далее, соберем несколько микроконтроллеров с беспроводными картами, при необходимости обеспечим их энергией. Теперь надо установить прошивку для первой партии: узнаем координаты, где будет стоять очередной хост вставляем EEPROM в компьютер запускаем программатор, с указанием координат через пробел (например: fgps 1652 64 -152) Прошитые карточки вставляем в микроконтроллеры (в сетке крафта) и расставляем в соответствии с координатами, указанными при прошивке. Самое главное - не перепутать координаты. Если навести курсор на микроконтроллер и зажать LSHIFT, то будет виден лейбл биоса, который является подсказкой для его позиции. Когда первая партия размещена и активированна, остальные хосты можно прошивать без указания координат - они определят позицию сразу при включении (если они будут в радиусе действия четырех рабочих хостов) Но лучше, конечно, чтобы каждый хост знал свои точные координаты. Ибо в случае небольшой ошибки в начале постройки, по мере расширения сети, погрешность будет увеличиваться, т. к. поправка будет производится по неверно вычисленным координатам хостов. Теперь проверим работу системы в деле. Возьмем, например, планшет с беспроводным модемом. Скачаем библиотеку GPS: pastebin get Dja9ZceV /lib/gps.lua Запустим консоль Lua. Загрузим библиотеку: local gps = require('gps') И попробуем получить координаты: gps.locate(true) (параметр DEBUG передаваемый в функцию работает как и в ComputerCraft - выводит все вспомогательные сообщения) Каждый хост, при старте устанавливает wake-up сообщение и включается только чтобы ответить на запрос координат. Такой подход экономит огромное количество энергии и позволяет добиться полной автономности хостов - встроенной солнечной панели вполне хватает для работы. Для стабильной работы надо будет добавить data-карту и реализовать протокол управления спутниками по прошитому открытому ключу, чтобы удобно было прошивать новые координаты при перемещении хоста на новое место.
  6. Всем привет. Мы тут пишем эмулятор OpenComputers, и в процессе его нужно тестировать. Поэтому будет очень здорово, если кто-нибудь напишет утилиту-бенчмарк. Утилита должна выглядеть как программка для OpenOS, на Lua. В идеале её надо загрузить в Hel, чтобы было быстрее устанавливать. Для чего именно она нужна? Делать бенчмарк компьютера в Minecraft смысла особо нет - там и так понятно насколько будет производительной твоя "сборка". Но это имеет смысл делать в эмуляторе - потому что эмулятор может глючить, лагать, багать, и жрать оперативную память. (Например, сегодня мы запустили в Ocelot Online демку, которая очень быстро рендерила текст на экране, и в результате, у @Fingercomp браузер сожрал 5 гигабайт оперативной памяти, засвопился и вырубил на час весь компьютер.) Что именно она должна тестировать? Утечки оперативной памяти, производительность рендера и лаги эмулятора. Для этого можно например запустить интенсивный рендер на экране какого-нибудь цветастого мусора. Или любой другой вариант. Засечь время и потом сверить "внутриигровые" часы с настоящими, чтобы определить, не лагало ли оно. (Параллельно тесту можно будет уже вручную смотреть диспетчер задач - не жрет ли браузер или десктопный эмулятор ресурсы больше положенного.) Правильную работу компонентов. То есть проверить, соединяет ли интернет карта с интернетом, посылает ли сетевые сообщения модем, и так далее. Всю инфу надо потом красиво вывести на экран. Можно в графическом виде, можно в командной строке. Награда? Большое спасибо от всей души. Короче, если кто-то будет искать идею "что бы написать" - бенчмарк для эмулятора это вариант. Он нам пригодится.
  7. Помните мост Рида? Ну так вот. Я тут изучаю Rust на досуге, и пишу мини проекты. Так и получился у меня... Stem Это интернет мост для OpenComputers. Что такое мост Для тех кто не знает что такое мост, и для чего он нужен: мост дает примерно такие же возможности как и linked карта. Он позволяет связать между собой компьютеры OpenComputers, где бы они не находились. Только мост реализует это через интернет карту. Однако по сравнению с linked картой есть один очень крутой плюс. Вы можете подключиться к своему OpenComputers компу не только с другого OpenComputers компа из Майнкрафта, но и из реального мира. Например с телефона. Или с вашего домашнего компьютера. Отличие от моста Рида Я немного по другому подошел к архитектуре проекта. Вместо попарного соединения, Stem реализует систему каналов. Работает это очень просто. Вы можете: 1) послать сообщение в канал X 2) подписаться на сообщения из канала X Количество подписчиков не ограничено. Количество клиентов которые могут посылать сообщения в канал тоже не ограничено. ID канала (по которому происходит подписка и отправка сообщений) служит заодно и паролем к нему. Поэтому если вы хотите создать публично доступный канал - просто опубликуйте его ID. А если хотите создать свой, приватный, канал - просто возьмите ID подлиннее и никому его не открывайте. ID - это последовательность любых байт длиной до 256. Число комбинаций (256 в степени 256) это огромное число, так что уникальных ключей хватит надолго. Пример local event = require('event') -- подключаем STEM local stem = require('stem') -- присоединяемся к серверу STEM local server = stem.connect('stem.fomalhaut.me') -- просим сервер присылать нам сообщения с канала 'my-channel-id' server:subscribe('my-channel-id') -- слушаем эвент 'stem_message' в цикле while true do local name, channel_id, message = event.pull('stem_message') if name ~= nil then print(channel_id, message) end end -- ...или регистрируем листенер event.listen('stem_message', function(_, channel_id, message) print(channel_id, message) end) -- мы можем посылать сообщение в канал -- (причем не обязательно быть подписанным на этот канал -- достаточно просто его ID) server:send('my-channel-id', 'hello there') -- просим сервер перестать присылать сообщение с канала server:unsubscribe('my-channel-id') -- полностью отключаемся от сервера STEM server:disconnect() Одновременно можно работать с несколькими серверами Stem и с любым количеством каналов. Библиотека stem.lua Библиотечку можно скачать напрямую по этой ссылке: https://gitlab.com/UnicornFreedom/stem/raw/master/stem.lua Либо установить через HPM: hpm install stem Подробная документация по командам библиотеки находится здесь. Сервер STEM Дефолтный сервер STEM запущен у меня на VPS по адресу: https://stem.fomalhaut.me/ Можете смело его использовать. Единственное, что это тестовый сервер пока. Может пропадать или менять протокол. Новости постараюсь писать сюда. Исходный код проекта находится тут: https://gitlab.com/UnicornFreedom/stem Вы можете скомпилировать его под свою систему и запустить где угодно. Настраивается сервер файлом stem.toml в корневой папке. Дефолтный конфиг может выглядеть так: [tcp] host = '127.0.0.1' port = 5733 [web] host = '127.0.0.1' port = 5780 [general] ping_interval = 60 Чтобы получить полностью свой отдельный и независимый сервер STEM, достаточно будет просто запустить бинарник, получившийся после компиляции. Не забудьте также положить в папку с бинарником папки static и templates. Они нужны для веб-интерфейса. Сервер мультипоточный, и очень производительный. Должен тянуть довольно большие объемы трафика. Но точных бенчмарков я не проводил. Если есть желающие - пишите в IRC, скооперируемся и померяем. 😃 Для того чтобы видеть логи сервера, используйте переменную окружения RUST_LOG. Например чтобы включить полное отображение всех логов: $ RUST_LOG=stem ./stem Веб-интерфейс Если перейти по ссылке на сервер STEM то вы увидите... веб-интерфейс. Веб интерфейс показывает счетчик активных каналов и сессий (клиентских подключений). Кроме того, он дает возможность подключиться к любому каналу STEM и поучаствовать в приеме-передаче сообщений прямо через сайт. Единственное ограничение - как ID канала, так и контент сообщений ограничивается тем, что можно закодировать в UTF-8. Ну вот и все Мост в принципе уже полностью работоспособен. Все идеи, пожелания, отчеты о багах пишите сюда, либо на issue трекер в репозитории. Если кто-нибудь хочет помочь с написанием клиента STEM на своём любимом языке программирования - обращайтесь ко мне в ЛС, IRC или пишите в этой теме. Написать клиент несложно - для примера можно глянуть на код библиотеки для OpenComputers. Она состоит всего из 150 строк кода. Enjoy! 😃
  8. Давненько не было автокрафтеров тут. Может, кому-то пригодится моя версия. Предназначена в первую очередь для крафта всяких часто необходимых мелочей со сложными крафтами (например, компоненты OpenComputers) из примитивных исходных ресурсов (например, процессор из слитков золота и железа, тростника и редстоуна), которые у пользователя отнимают кучу времени на поиск всех транзисторов и крафт недостающих. Рассчитана на использовании робота и двух сундуков, один из которых - основное хранилище (может быть покрупнее), а другой предназначен для резервирования компонентов при крафте. Ссылка: https://pastebin.com/1gqtWLub Необходимая конфигурация робота: Проверялась работа на компонентах (корпус, память, процессор, жёсткий диск) второго уровня. Screen, Keyboard Crafting Upgrade Inventory Upgrade и Inventory Controller Видеокарта и экран первого уровня Для дальнейших потенциальных расширений: Беспроводная карта Upgrade Container Конфигурация установки: Перед роботом - контейнер ресурсов (любой из возможных инвентарей достаточного размера) Под роботом - контейнер-буфер (можно обычный сундук) Рядом желательно поставить зарядник Возможности: Рекурсивный крафт сложных рецептов. Ресурсов расходуется, по результатам практических испытаний, ровно столько, сколько необходимо. Каталог рецептов для крафта, разбитый на страницы по 10 предметов для более удобного пролистывания на маленьком экране робота. Портативность - требуется только робот, два сундука и исходные ресурсы. Желателен также источник энергии Сообщения о том, каких конкретно исходных ресурсов не хватает для крафта (исходные ресурсы - те, для которых не найдено рецепта) Процесс крафта подробно отображается на экране, чтоб за ним было не так скучно и одиноко следить (см. недостатки) Об окончании крафта робот сообщит приветливым писком. Равно как и о неудаче. Недостатки и известные недочёты: Скорость..... Крафт занимает значительное время. Например, изготовление процессора 3го уровня из примитивных ресурсов (тростник, красный камень, алмазы, дерево для резаков, слитки золота, железа) занимает около 5 минут. Стоит отметить что количество изготавливаемых предметов не сильно влияет на время (2 процессора, скорее всего, будут делаться те же примерно 5 минут). Не умеет работать с альтернативными ресурсами. Возможно, когда-нибудь исправлю. Не умеет работать с инструментами (имеются ввиду многоразовые, как молот ИК2). Возможно, так же когда-нибудь исправлю. Не умеет работать с количествами предметов более стака, а также не гарантируется корректная работа с предметами, не складывающимися в стак. Постараюсь исправить в ближайшее время. Нет поиска по именам компонентов (то есть, либо задаёте название компонента целиком, либо задаёте крафт через каталог). Когда-нибудь поправлю Проверок на наличие контейнеров не делается, так как программа писалась "для себя" и находится в разработке. В дальнейшем будут введены. Также не везде гарантируется наличие защиты от "Количество предметов: Привет". Особенности: Шаблоны содержатся в одном файле, что облегчает переносимость, но приносит определённые неудобства всвязи с размерами файла (12 строк на предмет). Буду думать, как лучше сделать (разбить на разные файлы?). Файл имеющихся шаблонов могу выложить при необходимости (на разных сборках эти шаблоны могут отличаться) Дальнейшее развитие (no promises!): Исправление имеющихся недочётов Поддержка работы по сети (заказ компонентов, сообщение о готовности - дистанционно). Работа с более сложными инвентарями - сборщики, и т.д. Работа с машинами-обработчиками ресурсов - когда-нибудь в отдалённом будущем, скорее всего. Управление: Интерфейс текстовый. Посмотреть команды главного меню можно, нажав "Enter" (оставив поле ввода пустым).
  9. Кто нибудь знает, есть ли интерпретатор вне майнкрафта для lua OpenComputers дабы более удобно проверять и дебажить код ибо в самом майнкрафте это крайне не удобно делать.
  10. Как собрать робота в 5 шагов (инструкция для самых маленьких) Абстрактное описание сборки робота я уже писал много раз, поэтому это будет короткое руководство на конкретном примере. Соберем и запустим Totoro Recursive Miner. Шаг 1. Подготовка Для создания робота нам потребуется сборщик (assembler). Чтобы он работал - подведите питание. Сборка робота потребует некоторого времени (примерно 5 минут) и энергозатрат. Шаг 2. Подбор железа Запчасти делятся на обязательные и необязательные. Детали обязательные: 1) Корпус Основа робота. Без него никуда. Для TRMiner нужен корпус 2+ уровня, потому что он должен содержать апгрейд-генератор. 2) Процессор Мощность процессора определяет количество выполняемых роботом операций в такт. Т.е. проще говоря - скорость его работы. Однако перемещаться быстрее робот не станет. Этот параметр можно улучшить "прокачав" робота (см. апгрейд-опыт). 3) Память Практика показала, что одной планки 1 уровня для нормальной работы на компьютере недостаточно. TRMiner хранит в памяти данные о жилах руды, поэтому требует как минимум две планки уровня 1.5. При меньшем количестве корректную работу не гарантирую. (Хотя возможно он будет работать.) 4) Монитор Достаточно 1 уровня. Робот не поддерживает цветные экраны. (Можно собрать робота и без экрана. Но это - для любителей хардкора.) 5) Видеокарта Также достаточно 1-го уровня. Требуется для вывода изображения на монитор. Без нее монитор будет просто черным. 6) Клавиатура Чтобы иметь возможность набрать что-то в консоли. 7) Дисковод Для установки OpenOS и копирования программы TRMiner. (Любители хардкора могут попробовать запустить робота без дисковода. Это возможно. Но я не скажу как :P ) 8) Жесткий диск Для хранения ОСи и программы. Первоэтапный диск в 1Мб хватит с головой. Это даже много. Будет занято ~20%. 9) Lua BIOS Этот чип нужен для корректной работы OpenOS. Крафтится из пустого EERPOM и книги. Детали обязательные для Totoro Recursive Miner: 10) Апгрейд-инвентарь. Робот хранит в нем добытую руду. Рекомендуется установить 2 или 3 апгрейда (т.е. 32 или 48 слотов). Больше можно не ставить, ибо обычный сундук, в который робот сбрасывает добычу имеет размер в 27 слотов. 11) Апгрейд-генератор. Нужен роботу для непрерывной работы. Робот будет сам заряжаться с его помощью, сжигая часть добытого угля. (Любители хардкора могу не ставить генератор. Программа будет работать. Вы можете заряжать робот таская за ним заряжающее устройство, или приделав пару солнечных панелей и выкопав вертикальный колодец до поверхности. ) Детали необязательные: 12) Апгрейд-опыт Позволит роботу прокачиваться во время добычи. Со временем он станет быстрее двигаться, меньше тратить энергию и медленнее ломать свой инструмент. Требует Корпуса 3-его уровня. 13) Апгрейд-батарея Ну тут все понятно. Увеличивает емкость аккумулятора. Полезная штука. Детали вредные (эксклюзив для IT 1.7.10): 14) Апгрейд-чанклоадер После включения робота, в момент опустошит его аккумулятор. На том все и закончится. Вот две рабочие конфигурации: Минимальная Рекомендуемая (UPD.: Тут уважаемый Krutoy любезно предоставил картинку, которая иллюстрирует, сколько всего ресурсов у вас уйдет на сборку рекомендуемой конфигурации робота: За что ему большое спасибо.) Уложите выбранные детали в сборщик и запускайте процесс. Шаг 3. Софт Раздобудьте дискету с OpenOS (крафтится из чистой дискеты и книги). Скачайте программу Totoro Recursive Miner на другую, чистую дискету. http://pastebin.com/L21VMm7S Для этого этапа нам потребуется компьютер. Свой или соседа, все равно. Он должен иметь выход в интернет (интернет-плата) и дисковод для дискет. Как скачать программу на новую дискету: 1) Вставить дискету 2) Посмотреть в инвентаре ее адрес. Запомнить первые его буквы-цифры. 3) Написать в консоли команду: label -a xxxx floppy Где xxxx - первые буквы-цифры ее адреса, а floppy - это будущее название (этикетка). В результате ваша дискета получит короткое и ясное название. 4) Написать команды: mount floppy fcd /f В результате вы окажетесь в корневом каталоге дискеты. 5) Скачать программу TRMiner: pastebin get L21VMm7S mine Для этого нужна интернет-плата. Программа будет сохранена на дискету под именем mine. 6) Извлеките дискету. (Также можно поискать игрока с ником Totoro и подоставать его, чтобы дал дискету с программой нахаляву. Тогда и компьютер не нужен.) Шаг 4. Установка Поставьте робота. Можно прямо на месте предполагаемой добычи руды. Чтоб два раза не ходить. Включите его и установите OpenOS (это надо сделать только один раз). Как установить OpenOS: 1) Вставить в робота зеленую дискету. 2) Включить его. 3) Написать в консоли: install 4) Он спросит на какой жесткий диск устанавливать. Напишите 1. 5) Согласитесь на рестарт (y). Теперь сбросьте программу TRMiner с дискеты на жесткий диск робота. (Можно каждый раз вставлять дискету и запускать программу прямо с нее, но это лишние действия. Зачем оно нам?) Как сбросить программу с дискеты: 1) Вставить дискету с программой в робота. 2) Убедиться, что он включен. 3) Написать в консоли робота: mount floppy fcp f/mine mine 4) Достать дискету. Все! Софт установлен. Дискеты больше в принципе не нужны. Но сохраните их на всякий случай. Шаг 4A. Настройка программы (необязательно) Для настройки программы Totoro Recursive Miner, введите в консоль команду: edit mine В двадцатой строке вы увидите константы набранные заглавными буквами: TECH_SLOTS = 6VANILLA_CHEST = truePATHWAYS = trueDROP_TRASH = false TECH_SLOTS - количество слотов с образцами "пустой породы" и сундуками. То есть тех слотов, которые не будут заняты добычей. VANILLA_CHEST - режим для работы с обычными сундуками. Есть возможность работать с сундуком Эндера. Для этого, установите константу в значение false и дайте роботу инструмент с зачарованием "Шелковое касание". В слот с сундуками положите один сундук Эндера. PATHWAYS - если true, робот проделает в шахте дорожки, для удобства хождения игрока DROP_TRASH - если true, робот будет выбрасывать булыжник и другую "пустую породу". После изменения констант, нажмите клавиши Ctrl+S (сохранение) и Ctrl+W (выход). Шаг 5. Добыча полезных ископаемых Принесите робота на место предполагаемой шахты. Поставьте робота в ее воображаемый правый передний угол, передней стороной вперед. Вот так: В инвентаре робота разложите образцы пустой породы (5 штук по дефолту). Причем (лайфхак для ускорения работы робота), кладите в порядке убывания распространенности. У меня это камень-земля-гравий-булыжник-камень Бездны (abyssal stone из RailCraft). В последний из технических слотов (6-ой по дефолту) положите сундуки (или сундук Эндера, если вы перенастроили программу). Роботу в "руку" положите кирку или бур. Чем прочнее и острее - тем лучше. Теперь включите. Введите в консоль команду такого формата: mine <длина> [ширина] [возвращаться_в_начало] Первые два параметра - числовые. Последний - true/false (Если не указать, равен false). Ура! Наконец все ездит, копает и складывает без нашего участия. Остается только иногда менять кирку. И уносить добычу. Enjoy!
  11. Мне нужно присвоить переменной grow значение метадаты блока из таблицы geolyzer.analyze(), но не знаю как это сделать. То что должно содержатся в grow выделено зелёным прямоугольником на изображении. Немного переборщил с размером изображения.
  12. Я решил попробовать написать софт для OpenComputers и написал небольшую софтину для получения информации о системе. Текущая версия: 2.1 Изменения в 2.1 (от 31.06.2019): Исправлена проблема с роботами Мелкие графические улучшения Изменения в 2.0 (от 21.12.2018): Появились некоторая дополнительная информация о роботах В конце вместо противного писка звук 1000 длиной 0.1 секунду и 1500 длиной в 0.15 секунд Во всех значениях пропали числа после запятой Изменения в 1.01 (от 20.12.2018): ОЗУ теперь в КБ Исходный код v 2.0: https://pastebin.com/6Nte3GZa Скачать v. 2.1 (нужна интернет карта): pastebin get 6Nte3GZa /bin/status.lua Исходный код v 1.01: https://pastebin.com/HtrMUj5p Скачать v 1.01 (нужна интернет карта): pastebin get HtrMUj5p /bin/status.lua Для запуска введите команду 'status' Скриншоты на ПК и роботе:
  13. Totoro

    3D-Принтер

    Трехмерная печать в Minecraft (инструкции для самых маленьких) Начиная с версии 1.5.4, в OpenComputers появляется интересный девайс - трехмерный принтер. Он дает возможность печатать декоративные блоки любой формы и цвета. Причем не только статичные блоки, но и двери/люки, кнопки и рычаги! Давайте рассмотрим, для чего он может пригодиться, и как именно с ним работать. 1. Цель Как и в предыдущих гайдах, первым делом поставим себе цель. Мы будем создавать стенную плитку со сквозным орнаментом, в виде морды крипера. Я не буду приводить в этом гайде рецепты предметов, так как их легко найти в NEI, или в статьях на gamepedia. 2. Обзор принтера 3D-принтер - это периферическое устройство, которое должно быть подключено к работающему компьютеру. Оно представляет собой блок, с двумя внутренними слотами: Верхний слот предназначен для специальной печатной массы (изготовляется из редстоуна, гравия, древесного угля и воды). Принтер вмещает два стека печатной массы (256 000 ед). Нижний слот занимает картридж с красителями. Объем внутреннего хранилища - два картриджа краски (100 000 ед). По команде от компьютера, принтер берет немного печатной массы и краски и "распечатывает" в крайний правый слот запрограммированную модель. На модель из этого гайда, состоящую из 21 фигуры, принтер потратил 424 единицы массы и 314 единиц краски. 3. Отпечатанный блок Модель для печати задается в виде списка "фигур" - параллелепипедов. Каждая фигура отмечена координатами противоположных углов. Она имеет свою текстуру, цвет оттенка (если необходимо) а также состояние (true/false). Максимальное количество фигур в модели - 24, по умолчанию. Координаты блока тремя числами (X, Y, Z) в пределах от 0 до 16. Блок может переключать свое состояние, когда игрок кликает по нему правой кнопкой мыши, или на блок подается сигнал редстоуна. По умолчанию блок имеет форму, заданную блоками с состоянием false, и сменяет ее на форму из блоков с состоянием true, при активации. Кроме того блок имеет несколько дополнительных общих флагов, которые определяют его название, описание и некоторые другие параметры. 4. Программирование принтера Есть два способа распечатать свою модель. Через компонент принтера и прямое управление, либо при помощи стардартной программки print3d от Сангара. 4.1 Компонент принтера Подключение принтера ничем не отличается от подключения любого другого устройства: local com = require('component')local printer = com.printer3d Компонент предоставляет набор функций для управления: reset() - сброс настроек и остановка печати setLabel(value:string) - задаем название будущего блока getLabel():string - получаем текущее название setTooltip(value:string) - задаем описание блока getTooltip():string - получаем описание setRedstoneEmitter(value:boolean) - определяет, излучает ли блок сигнал редстоуна в активированном состоянии isRedstoneEmitter():boolean - возвращает true, если блок излучает сигнал в активном состоянии setButtonMode(value:boolean) - определяем поведение блока при активации. Если true, то блок автоматически возвращается в неактивное состояние через несколько секунд после активации (как кнопка) isButtonMode():boolean - возвращает true, если блок находится в режиме "кнопки" addShape(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number, texture:string[, state:boolean=false][,tint:number]) - добавляет новую "фигуру" к форме блока. Фигура задана координатами. texture - название текстуры, state - для какого состояния фигура предназначена, tint - цвет оттенка фигуры getShapeCount():number - возвращает количество фигур в модели getMaxShapeCount():number - возвращает максимально возможное количество фигур commit([count:number]) - посылает принтеру текущую конфигурацию и начинает печать (count - количество копий, если не задано - равно 1) status(): string, number or boolean - возвращает состояние принтера - "buzy" и процент готовности, или "idle" и готовность предмета (true/false). 4.2 Программа print3d Код программы не включен в мод по умолчанию, поэтому его надо скачать из интернета. Последнюю версию можно найти на ГитХабе автора: https://github.com/OpenPrograms/Sangar-Programs/blob/master/print3d.lua Либо скачать с Pastebin: http://pastebin.com/b5rD8KcY (поставьте интернет-плату, и наберите в консоли компьютера команду pastebin get b5rD8KcY print3d) Эта программа по сути, читает параметры модели из текстового файла и передает принтеру. Формат вызова программы: print3d FILE [count] Где FILE - название файла с моделью, а необязательный параметр count - количество копий модели. Модели имеют простой формат - все параметры записываются в таблицу, по аналогии с Луа. Вот образец файла с моделью. { -- Это - название модели. Т.е. название будущего блока, которое будет видно -- в инвентаре и подсказке Waila. Название по умолчанию - "3D Print" label = "Example Model", -- Это описание предмета, такое, как будет видно в инвентаре. Если не задано, -- предмет не будет иметь описания tooltip = "Это демонстрационная модель, показывающая все возможности", emitRedstone = false, --[[ Если этот параметр равен false, блок работает как дверь, сменяя свое состояние при сигнале редстоуна. Если параметр равен true, блок работает как кнопка или рычаг - излучая сигнал при смене состояния. При этом блок не реагирует на сторонний сигнал. По умолчанию параметр равен false. ]] buttonMode = false, --[[ Если этот параметр равен false, модель работает как дверь или рычаг - то есть остается в том состоянии, в которое установлен игроком. Если параметр равен true, модель автоматически возвращается в неактивное состояние через несколько секунд после активации. По умолчанию параметр равен false. ]] -- Это список фигур модели, которые определяют, как она выглядит. -- Модель должна содержать как минимум одну фигуру (параллелепипед) -- в неактивном состоянии. -- Фигуры не могут быть "плоскими" т.е. не иметь объема. -- Каждая фигура задана шестью числами: minX, minY, minZ, maxX, maxY, maxZ. -- (Координаты двух противоположных углов.) -- Если смотреть спереди, ось X направлена вправо, ось Y - вверх и ось Z - вглубь. -- Дополнительно, каждая фигура длолжна обладать текстурой. Для того чтобы -- определить название текстуры, вы можете воспользоваться Определителем Текстуры -- (Texture Picker), кликнув им по нужному блоку. -- -- Модель имеет два состояния - неактивное (false, состояние по-умолчанию) -- и активное (true, состояние после активации блока). shapes = { -- Фигура идет от точки <0, 0, 0> (левый нижний угол) до <8, 8, 8> (середина), -- и имеет текстуру блока лазурита. { 0, 0, 0, 8, 8, 8, texture = "lapis_block" }, -- Фигура идет из точки <8, 8, 8> (середина) в <16, 16, 16> (правый верхний угол), -- и закрашена текстурой дубовой листвы. Фигура принадлежит активному состоянию -- модели и имеет светло-зеленый оттенок. { 8, 8, 8, 16, 16, 16, texture = "leaves_oak", state = true, tint = 0x48B518 } }} Т.е. описание модели просто содержит перечень всех тех параметров, которые задаются при помощи компонента, и список фигур из которых модель состоит. Набор тестовых моделей для изучения, можно найти здесь: https://github.com/OpenPrograms/Sangar-Programs/tree/master/models 5. Проектирование модели Разобьем мысленно рисунок запланированной модели на параллелепипеды. Она будет представлять собой тонкую плитку посередине блока, наподобие стекла или решетки. Руководствуясь сеткой координат и образцом выше, составим описание модели для текстового файла: { label = "Плитка 'Морда крипера'", emitRedstone = true, buttonMode = false, tooltip = "Секретный рычаг в виде головы крипера" shapes={ {0,14,7, 16,16,9, texture="quartz_block_side", tint=0x8eb200}, {0,2,7, 2,14,9, texture="quartz_block_side", tint=0x8eb200}, {6,10,7, 10,14,9, texture="quartz_block_side", tint=0x8eb200}, {14,2,7, 16,14,9, texture="quartz_block_side", tint=0x8eb200}, {2,2,7, 4,10,9, texture="quartz_block_side", tint=0x8eb200}, {4,8,7, 6,10,9, texture="quartz_block_side", tint=0x8eb200}, {10,8,7, 12,10,9, texture="quartz_block_side", tint=0x8eb200}, {12,2,7, 14,10,9, texture="quartz_block_side", tint=0x8eb200}, {6,2,7, 10,4,9, texture="quartz_block_side", tint=0x8eb200}, {0,0,7, 16,2,9, texture="quartz_block_side", tint=0x8eb200}, {0,14,7, 16,16,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {0,2,7, 2,14,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {6,10,7, 10,14,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {14,2,7, 16,14,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {2,2,7, 4,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {4,8,7, 6,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {10,8,7, 12,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {12,2,7, 14,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {6,2,7, 10,4,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {0,0,7, 16,2,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {2,2,8, 14,14,9, texture="quartz_block_side", tint=0xe0301e, state=true}}} Итак, наша плитка имеет двойной набор фигур - для двух состояний, окрашенных в текстуру кварца с зеленым оттенком. Кнопка будет работать как рычаг, испуская сигнал в активном состоянии. Откройте файл командой open creeper. Скопируйте код плитки выше и вставьте в файл кнопкой [insert]. Затем сохраните ([Ctrl]+) и покиньте редактор ([Ctrl]+[W]). 6. Печать Все готово, принтер заправлен, модель спроектирована. Отправляем ее на печать! print3d creeper 7. Итоги Enjoy!
  14. Всем привет! Я написал программу для дистанционного управления дроном (например, с планшета). Плюсы программы: Плюсы При запуске дрона требуется ввести случайный код (т.е. дрона никто не угонит). Можно изменять цвет подсветки дрона, надпись на его экране, скорость дрона. Доступен ввод своих комманд (например, для работы с лассо) Относительно нормальное управление дроном Скрины и мини инструкция для работы с программой Установка прог: Для пульта: pastebin get JTY87AiR control Для дрона: На компьютер скачиваем прошивку для дрона: pastebin get up53MtPM drone Вставляем в системник чистый EEPROM Вводим flash drone eeprom Пихаем в дрона полученную прошивку (eeprom) Включаем дрона!
  15. Новости по аддону. Тут принимаются идеи, баги, помощь. github: https://github.com/Avaja/OpenTechnology
  16. Дело было вечером, делать было нечего... И тут я случайно зажал горячую клавишу калькулятора, и меня осенило! А ведь калькулятора то для ОС никто не писал еще! Так появилась идея создания этого калькулятора. Что можно про него сказать? Базовый калькулятор который умеет выполнять стандартные математические операции. Требования к ОС: Видеокарта 2 уровня и выше Монитор 2 уровня и выше Компьютер/сервер любого уровня с установленной OpenOS Управление самое простое - мышкой. При создании программы была взята статья Псевдографические интерфейсы в OpenComputers и на основе кода из неё был создан калькулятор. Установка: version 0.2 pastebin -get PaVaRGcd Calculator.lua version 0.3 pastebin -get ZjCTrj5a Calculator.lua P.S. Выражаю благодарность @Doob за статью. Если найдете какие-то баги, недочеты, или возникнут идеи по улучшению, я всех с радостью выслушаю.
  17. - Запустил я Norton Commander. Вижу слева диск С и справа диск С. Думаю, нафига мне два диска С. Взял и грохнул один. (Старый-старый анекдот) Для людей, не привыкших работать с командной строкой, создан файловый менеджер Midday Commander. Разработчики: МС поддерживает работу с экранами разного разрешения и цветовой гаммой Возможно даже его удастся запустить на роботе. За основу внешнего вида взят известный линуксовский ФМ Midnight Commander, а также незабвенный Norton Commander. Кто постарше, тот помнит, поэтому проблем с интерфейсом быть не должно. Экран МС делится на две панели, в которых размещаются списки каталогов и файлов, имеющихся на дисковых устройствах компьютера. Каталоги помечены символом "/" и сгруппированы вначале списка. Ниже панелей находятся командная строка и меню основных операций, которые вызываются нажатием соответствующей функциональной клавиши. Навигация по панелям осуществляется клавишами Вверх/Вниз. Клавиша Tab переводит курсор на соседнюю панель. Для запуска программы или смены директории наведите курсор на программу или директорию и нажмите Enter. Чтобы запустить программу с параметрами, нажмите клавишу Enter, удерживая Ctrl. При этом имя программы переместится в командную строку. Введите параметры и нажмите Enter. F1 - выдает помощь по работе с МС F4 - открывает выбранный файл на редактирование. В качестве редактора используется стандартный редактор edit.lua. Чтобы создать новый файл, нажмите Shift+F4 и в открывшемся окошке "File name:" введите имя создаваемого файла и нажмите Enter. Для выбора пункта Cancel используйте кнопку Tab. F5 - копирует выбранный файл в директорию, открытую на соседней панели. В окошке "Copy file:" можно указать новое имя, под которым файл будет скопирован. F6 - перемещает файл. F7 - создает новую директорию F8 - удаляет файл или директорию. Перед удалением будет выдано предупреждение: Для выбора пункта Cancel используйте кнопку Tab. F10 - выход из МС Для поиска файла или директории на дисках компьютера нажмите Alt+F7 и в открывшемся окне "Find file/dir:" введите искомое имя. Результат поиска будет отображен в окне "Find:" Выбор какого либо из результатов в окне "Find:" приведет к перемещению в соответствующую директорию. При поиске файла можно использовать спецсимволы "?" и "*". ? - замещает собой любой символ; * - замещает любую последовательность символов. Например, для поиска всех файлов, начинающихся с буквы m, введите строку поиска "m*" Скачать Midday Commander можно, выполнив команду: pastebin get kE3jp6nD bin/mc.lua Планы на будущее: 1. русификация 2. поддержка мыши.
  18. Данная программа позволяет осуществлять сбор любой ванильной и ваниллаподобной культуры (не проверялось на кактусах, у тростника рекомендуется собирать только верхнюю часть). Под ваниллаподобной культурой следует понимать культуру, сбор которой укладывается в алгоритм: [проверить блок] - (проверить метадату) - [если проверки пройдены, собрать культуру ЛКМ/ПКМ] - (высадить блок ПКМ), где [] - обязательный пункт, а () - необязательный. Жердочки из IC частично поддерживаются (все, кроме резинового тростника и веномилии). Одним роботом может обслуживаться неограниченное (вернее, ограниченное вместимостью инвентаря робота и его ОЗУ) количество полей разных культур. Системные требования: Процессор второго уровня (рекомендуется) Две планки ОЗУ второго уровня (рекомендуется) Жесткий диск первого уровня Геолайзер Улучшения "Инвентарь" и "Продвинутый контроллер инвентаря" Улучшение "Притягивающий луч" как выяснилось, не требуется Видеокарта, монитор, клавиатура (крайне рекомендуется) Пример робота: http://i.imgur.com/q027ast.png Как использовать робота: Первым делом надо определить место установки робота. Программу можно будет запускать только с этого места! Место установки включает в себя координаты по всем трем осям и ориентацию (posx, negx, posz, negz). Под этим местом необходимо разместить воронку для выгрузки собранных айтемов. Также, если робот будет заряжаться, зарядник следует разместить так, чтобы не мешать проходу робота, например, в стене. После этого следует убедиться, что между всеми полями существует свободный проход и что над растениями свободен минимум один блок. Робот не имеет алгоритма поиска пути и будет идти "напролом", а значит, ему нельзя преграждать путь. Крайне рекомендуется располагать все поля в прямоугольной области, а также на одной высоте. Затем следует открыть исходный код и отредактировать переменные c четвертой строки по тринадцатую. Назначение переменных прокомментировано в самом коде. Изменив значения переменных, не листайте дальше, чтобы не увидеть велосипеды на костылях. Далее следует создать текстовый файл по адресу /fields.txt, в котором описать все поля, предназначенные к сбору роботом. После этого робот готов к работе. Установите робота на его место установки и запускайте программу. Cтруктура файла fields.txt: Каждое поле описывается одной строкой, поля идут в порядке сбора. Строка поля должна быть вида: startPosX,startPosZ,anotherPosX,anotherPosZ,fieldY,blockToTake,itemToPlant,fullGrownState,isRight startPosX и startPosZ это координаты начальной точки поля. С этой точки робот будет начинать сбор. anotherPosX и anotherPosZ это координаты противоположной точки (как точки, выделяемые при привате территории). Это не точка, где сбор будет заканчиваться. fieldY это координата, на которой располагаются растения. Робот будет летать на блок выше этой координаты, так, чтобы находиться над растениями. Если растение многоблочное, следует указать координату самой верхней части. blockToTake это name блока, который требуется собирать. Например, minecraft:carrots для моркови или minecraft:melon_block для арбузов. itemToPlant это name айтема, который требуется высаживать. Если после сбора ничего высаживать не требуется, следует написать nil. Можно написать и другое несуществующее name, но тогда робот будет все время пытаться найти ваш айтем (и, следовательно, работать медленнее). fullGrownState это metadata созревшего растения. Если metadata проверять не требуется, следует написать -1. isRight это необязательный флаг, указывающий, что культуру следует собирать ПКМ. По умолчанию стоит в false. Пример файла fields.txt: http://pastebin.com/H10k6QkV Ферма, соответствующая этому файлу: http://i.imgur.com/wP5gAaa.png Скачать: http://pastebin.com/K4DU8d3n Дополнительно: Просьба к играющим на МТ проверить работу робота с тамошними ваниллаподобными культурами, если такие там есть. Автор выражает благодарности: Totoro, который ответил на несколько моих глупых вопросов. AlexCC, который запретил сборщик урожая и тем самым побудил меня написать данную программу. Fingercomp, который натолкнул меня на мысль добавить поддержку сбора культуры ПКМ. UPD: Добавлена поддержка сбора культуры ПКМ. Это открывает возможности для частичной поддержки жердочек из IC - их состояние невозможно узнать, но большинство из них собираются только на последней стадии, так что с ними все-таки можно работать.
  19. Как пользоваться функцией scan? Итак, в этой функции можно задать два параметра, это относительные координаты по горизонтали (относительно блока геосканера/планшета или робота с геосканером), возвращаемое значение - таблица. Таблица содержит список плотностей блоков по вертикали. Чем дальше по вертикали находится блок (относительно геосканера), тем больше помех дает геосканер. Уровень помех можно настроить в конфиге мода. Ну тут вроде-как все понятно, разберемся с вертикальными координатами. При сканировании, геосканер возвращает таблицу, которая представляет собой столб из блоков. Кроме плотности ничего узнать нельзя. Возьмем, к примеру, scan(0, 0) это будет столб, выстой 64 блока, в котором находится устройство (геосканер/робот/планшет) В стандартнои конфиге радиус действия геосканера = 32 блока, следовательно можно просканировать кубоид 65x65x64 блока. Геосканер у нас находится на уровне 33 (индекс таблицы), на этом уровне при сканировании устройстрво почти не дает шумов, т. е. по горизонтали можно легко узнать истинную плотность блока. Индексы в таблице возрастают с высотой, т. е. блок с индексом 1 это -32 блок относительно устройства, 2 это -31 ... 33 это 0 и т. д. Теперь разберемся с горизонтальными координатами. Горизонтальные координаты хоть и относительные, но они не зависят от положения устройства в пространстве, т. е. отсчет идет по сторонам света. scan(1, 0) это столб на один блок на восток от устройства, следовательно, scan(-1, 0) - на запад. scan(0, 1) это южный столб, scan(0, -1) - северный. Для примера возьмем двойной цикл, который будет сканировать столбы и заносить их в таблицу. local tbl = {} for x = -32, 32 do for y = -32, 32 do if not tbl[x] then tbl[x] = {} end tbl[x][y] = geolyzer.scan(x, y) end end Он у нас будет сканировать с северо-запада на юго-восток, т. е. будет захватывать всю доступную зону. К примеру, нам надо сканировать определенный квадрат, стоящий по-диагонали от геосканера, обозначим их вот так: NE - северо-восточный, NW - северо-западный, SE - юго-восточный, SW - юго-западный. local function scan(d, r) -- направление, дальность if d == 'NE' then x1, x2, y1, y2 = 1, r, -r, -1 elseif d == 'NW' then x1, x2, y1, y2 = -r, -1, -r, -1 elseif d == 'SE' then x1, x2, y1, y2 = 1, r, 1, r elseif d == 'SW' then x1, x2, y1, y2 = -r, -1, 1, r end for x = x1, x2 do for y = y1, y2 do geolyzer.scan(x, y) -- тут должна быть фунция обработки или сохранения результатов сканирования end end end Чтобы просканировать квадрат со стороной 20 блоков, находящийся на юго-восток от геосканера надо запустить scan('SE', 20) Вроде-бы все очевидно. Функция analyze() намного проще, она возвращает таблицу с информацией о блоке, стоящем вплотную к устройству. Индексы таблицы не числовые, например, чтобы узнать плотность блока вводим analyze(сторона).hardness Чтобы задать сторону можно использовать sides API, либо просто задать цифрой. ...Будет дополняться...
  20. Часто необходимо писать программы для серверов. Это могут быть сервера для чатов, или файловые облака или что то еще, но всегда приходится писать велосипеды. Подумав об этом я решил написать программу для сервера. Программа работает просто. Подгружает модули из папки проекта, а потом начинает слушать все event'ы и обрабатывать. Представляю вам саму программу: Servercore v0.2.1 Исходный код: http://pastebin.com/NASX9sX0 Использование: Создаем папку проекта Создаем в этой папке файл .servercore Запускаем servercore указывая первым аргументом папку которую мы создали. Если не указывать аргумент то servercore запустится в рабочей директории. Наслаждаемся рабочим сервером, который пока ничего не делает. Любые файлы (кроме .servercore) которые находятся в папке проекта будут загружены как модули. Если модуль содержит ошибку наш сервер не полетит, а просто выведет тест ошибки на экран. При создании модулей можно использовать специальные функции, которые находятся в _G.sc. Описание этих функций: sc.info(info_type:string, message:string) - выводит информацию со временем и раскрашивает как на скринах. Принимает тип информации и само сообщение. Типов информации всего 4: ok,err,warn и info. sc.getTime() - возвращает время в формате unix timestamp. sc.on(event_name:string,handler:function) - добавляет слушателя на сигнал. Циклом слушаются все сигналы а потом запускают функцию обработчик для того сигнала который пришел. Пример простейшего модуля: sc.on("touch",function (e) sc.info("info","you touched!")end) Изменения в версии: Патч 1: убрана обязательная поддержка модемов. Старые версии: Произведение «Servercore» созданное автором по имени LeshaInc, публикуется на условиях лицензии Creative Commons «Attribution-NonCommercial-NoDerivatives» («Атрибуция — Некоммерческое использование — Без производных произведений») 4.0 Всемирная. PS: Название проги звучит как поджанр метала)))
  21. HeroBrine1st

    Lua Promise

    Для создания асихнронных библиотек по типу vk-fast-longpoll у nodejs. pastebin get 4Lh9ALEY /lib/Promise.lua Методы библиотеки: all(iterable: table) - создает промис, который ждет завершения всех переданных промисов (в виде таблицы) и в resolve шлет таблицу со всеми их значениями. Если хоть один завершится с ошибкой, вызовет reject с этой ошибкой race(iterable: table) - создает промис, который ждет первого завершения любого промиса, и проксифицирует его результат на себя (т.е. ошибку или результат перекидывает через себя, не обрабатывая) resolve(value:any) - создает промис, который успешно завершился с параметром value reject(value:any) - создает промис, который завершился с ошибкой value Магия ООП начинается с магии метатаблиц - вызывайте библиотеку как функцию. Просто Promise(...). Аргумент один - функция, принимающая 2 аргумента - resolve и reject. Если промис завершает работу успешно, он вызывает функцию resolve с одним (!) аргументом, а та передает его обработчикам. Если с ошибкой - вызывает reject, либо он вызывается автоматически при синхронной ошибке (attempt to call a nil value, error(...) и все подобное). Возвращает класс. У него 3 метода: next(onResolve:function,onReject:function): self: object (__name=Promise) - аналог then в NodeJS. catch(onReject): self: object (__name=Promise) - думаю понятно. await - ждет завершения промиса и возвращает его результат. Поддерживается чейнинг, но паралельные обработчики не добавить, и я не знаю, как это исправить :C Если во время чейнинга из обработчика вернуть промис, библиотека будет ждать его завершения и передаст результат в следующий обработчик. Если на уже выполненный промис навесить обработчик, он выполнится синхронно. На выполняющийся - асинхронно после завершения. Обьяснил возможно непонятно, обьяснение на learn.javascript.ru. Примеры кода: local Promise = require("Promise") local p = Promise(function(resolve,reject) print(123) os.sleep(5) print(234) resolve(5) end) --123 p:next(function(result) print(result) return 8 end) os.sleep(5) --234 --5 print(p.result) --8 a=Promise(function(a,b) os.sleep(5) a(1) end) b=Promise(function(a,b) os.sleep(1) a(2) end) c = Promise.all({a,b}) c:onResolve(function(values) print(serialization.serialize(values)) end) d = Promise.race({a,b}) d:onResolve(function(values) print(values) end) os.sleep(10) --2 --{2,1} Чистый исходный код на MoonScript Если туда не засовывать os.sleep, то промис заблокирует остальные потоки, как и если в основную программу не вставить os.sleep, она заблокирует промис. Учтите.
  22. Нужна прога для вывода на экран людей состоящих в привате и их статус(онлайн/офлайн)
  23. В луа можно обрезать строку? Например мне нужно читать сообщения из чата с помощью чат-бокса, искать в сообщении плохие слова и выдавать куда-то уже сообщения без плохих слов. В библиотеке string ничего не нашёл((
  24. Ничего сложного в этой программе нет, однако выкладываю код ради оценки его исполнения. https://pastebin.com/Mw88qQvr Последовательность запуска этой системы: Ставим N-ое кол-во узелстабов; Рядом с ними ставим таблички с номерами от 1 до N; Под ними ставим редстоун-контроллеры; Подключаем их все к компу; На комп ставим программу: pastebin get Mw88qQvr /home/bfnode.lua Запускаем программу с ключом -i для присвоения номеров адресам; После присвоения номеров программа продолжит свою работу в консольном режиме. Доступные команды: on off Аргументы к этим командам: Номер ноды all (т.е. запуск команды для всех нод) Пример:
  25. По этой теме уже существует отлаженный софт, успешно используемый многими игроками. Однако на днях я заметил забавную особенность местных видеокарт, позволяющую выставлять разрешение большее, нежели получаемое через gpu.maxResolution(). К примеру, если maxResolution для видеокарты третьего уровня вернет числа 160 и 50, то никто не мешает установить разрешение, скажем, в 20x158 пикселей. При этом при проверке валидности устанавливаемого разрешения соблюдается два правила: Результирующее разрешение по числу пикселей не должно превышать результат умножения чисел, возвращаемых maxResolution. То есть для T3 GPU не более 160 * 50 = 8000. Каждый параметр разрешения, будь то ширина или высота, не должен численно превышать значение возвращаемой ширины. То есть для T3 GPU не более 160. Не знаю, баг это или фича, однако подобное грех не использовать в своих целях. К примеру, старая версия программы при вертикально-удлиненном расположении мониторов позволяла выставить разрешение лишь в 30х50 (1500 пикселей в итоге), заполняя тем самым "черные полосы". В то же время обновленная софтина, учитывающая описанные выше особенности, выдает 69x114 (7866 пикселей), максимально приближаясь к предельной отметке в 8000: Согласитесь, лишние пиксели на дороге не валяются, и, думаю, кому-то будет интересно узнать про реализацию подобного софта. Прежде всего нам требуется определить точную пропорцию мультиблочного монитора: то, как относится его ширина к высоте. Взглянем на текстуру блока: она явно состоит из мелких "квадратиков" в количестве 16 штук, причем лицевая часть монитора имеет рамку толщиной в 2 "квадратика" с каждой стороны: Эти "квадратики" мы и будем использовать для расчета пропорции, так как они позволяют идеально точно получить размеры отображающей части монитора в игровом мире. А размеры "в квадратиках" можно посчитать по формуле: число_блоков_монитора * 16 - 4 Следовательно, пропорция монитора будет считается следующим образом: local gpu = component.gpu local screen = component.proxy(gpu.getScreen()) local blockCountByWidth, blockCountByHeight = component.screen.getAspectRatio() local proportion = (blockCountByWidth * 16 - 4) / (blockCountByHeight * 16 - 4) Также не забываем, что высота каждого псевдографического пикселя при отображении в 2 раза больше его ширины, поэтому формула пропорции слегка меняется. Заодно произведем некоторые сокращения, чтобы избавиться от лишних математических операций. Все три варианта эквивалентны: local proportion = 2 * (blockCountByWidth * 16 - 4) / (blockCountByHeight * 16 - 4) local proportion = (blockCountByWidth * 16 - 4) / (blockCountByHeight * 8 - 2) local proportion = (blockCountByWidth * 2 - 0.5) / (blockCountByHeight - 0.25) После вычисления пропорции монитора можно приступить к написанию программной логики. Для начала получим максимальное разрешение видеокарты: local maxWidth, maxHeight = gpu.maxResolution() Обладая этими данными, а также взглянув на условия, описанные в начале поста, мы можем составить систему неравенств для получения итогового идеального разрешения: Помним также, что ширину мы вполне можем выразить через высоту и пропорцию монитора: width = proportion * height Подставим этот вариант в систему: Оставим высоту в левой части неравенств: Подставляем имеющиеся переменные в каждое неравенство, рисуем числовую прямую и выбираем высоту, удовлетворяющую условиям неравенства для конкретного случая. Разумеется, в программировании никаких числовых прямых нет, зато есть любимые math.min() и math.max(): local height = math.min( maxWidth / proportion, maxWidth, math.sqrt(maxWidth * maxHeight / proportion) ) -- Выражаем ширину через пропорцию local width = height * proportion Все. Разумеется, полученные значения ширины и высоты нужно округлить в меньшую сторону, дабы не кормить видеокарту дробями. Заодно добавим поддержку масштабирования, чтобы выставлять половинное или, скажем, четвертичное от идеального разрешение. Сократив код, избавившись от лишних переменных, мы получаем следующее: local component = require("component") -- Получаем масштаб в качестве первого аргумента скрипта и корректируем его значение local scale = tonumber(select(1, ...) or 1) if not scale or scale > 1 then scale = 1 elseif scale < 0.1 then scale = 0.1 end local gpu = component.gpu local blockCountByWidth, blockCountByHeight = component.proxy(gpu.getScreen()).getAspectRatio() local maxWidth, maxHeight = gpu.maxResolution() local proportion = (blockCountByWidth * 2 - 0.5) / (blockCountByHeight - 0.25) local height = scale * math.min( maxWidth / proportion, maxWidth, math.sqrt(maxWidth * maxHeight / proportion) ) -- Выставляем полученное разрешение gpu.setResolution(math.floor(height * proportion), math.floor(height)) Надеюсь, это микро-знание кому-то было полезно. Лично я очень доволен, что могу наконец запилить графонистый интерфейс для контроля реакторов на вертикальных мониках без осваивания профессии "глиномес", да и соответствующая либа для автопобора разрешения в оське пригодится.
×
×
  • Создать...