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

Лидеры


Популярный контент

Показан контент с высокой репутацией за 23.02.2019 во всех областях

  1. 19 баллов
    Для тех, кто спешит: 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!
  2. 15 баллов
    (проект в разработке) Цель данного проекта - создание нейросети и условий для ее самообучения. В идеале, это будет бомжовый робот минимальной комплектации (возможно даже без жесткого диска), который в зависимости от окружающих условий будет определять свою полезность. Также, он будет "программироваться" снаружи с помощью окружения оставленного другими роботами, формирующими "улей". Апогеем будет саморепликация. Кроме достижения цели, важен и процесс. Наблюдать за самообучением и выбором действий у нейросети очень интересно. Нейросеть изнутри: Мигающие точки - нейроны, линии - синапсы (связи), справа эмулятор мира майнкрафт на движке Love 2d. Нейросети устроены похожим образом. Есть входные значения, скрытые слои и выходные значения. В моей программе робот собирает информацию вокруг себя. На вход подается: Есть ли блоки над, под и перед ним Насколько много клеток он "разведовал" за последнее действие Его позиция в виде значений x,y,z от 0 до 1 Иногда я тестирую со значениями стороны куда он смотрит, возможностью двигаться, расстоянию до последней удачной копки Нейросеть "думает" и выдает 5 значений, которые соответствуют действиям движения 1) вперед, 2) вниз, 3) вверх, 4) вправо, 5) влево. Робот выполняет большее из этих значений. Далее, после действия, я вычисляю коэффициент полезности r [0..1] для этого действия. -- swingSucces: количество вскопанных блоков за действие [0..3] -- input.exploreSucces: коэффициент разведки [0..1], где 0 - уже разводовал все 3 блока, 1 - впервые проверил эти 3 блока -- logic(input.sweetsD < input.old.sweetsD): расстояние до последней удачной копки увеличилось 0, или уменьшилось 1 r = (swingSucces + input.exploreSucces + logic(input.sweetsD < input.old.sweetsD)) / 5 Нейросеь обучается, и в выбранное выходное значение приписывается r a остальные уменьшаются\увеличиваются на 1-r for i=1, #output do output[i] = switch i when actKey (output[i]+val^2)/2 when rndKey (output[i]+(1-val))/2 when oppositeKey (output[i]+(1-val))/4 else output[i] nn:propagate(output) Теперь матан. В начале я использовал обычный Персептрон, найденный готовый на ЛУА, но который мне пришлось править. Проблема в том, что он не может учитывать последние состояния. Нейросети с памятью называются "Long short-term memory" или LSTM, где каждый нейрон выглядит вот так: Найдя библиотеку synaptic.js, хитрыми путями я извлек из нее готовую LSTM сеть, которая получилась на 53 000 строк. Но это не проблема, если зайдет, я перепрограммирую ее на LUA. Текущее состояние сети - отстой. Я неправильно ее обучаю, так как не знаю какие значения выдавать для "обратного распространения ошибки". Круча разные коэффициенты, у меня получилось научить ее двигаться по спирали, как карьерный робот. Сейчас, когда я добавил во входные значения расстояние до последней удачной копки, он научился "кушать" как яблоко, но с огромный количеством лишних действий. В самом майне блоков намного больше и это выглядит вот так. На первом скрине работал 1 робот, на втором штук 6. Сейчас в их действиях слишком много шума. Я специально не даю им кирки, что бы они не унеслись в бесконечность. Фидбек Мне нужно помощь. Подскажите, что лучше подавать на вход, и как обучать сеть. Главная проблема, что для обучения я должен указать какие значения должны быть на выходах при текущих условиях, а я и сам не знаю. Обычно, робот теряется в пустом пространстве и я не знаю какое действие ему казать как "единственно правильное". А так, буду сюда отписываться и отчитываться о процессе разработки. Update 20.06.19, веб-версия эмулятора
  3. 13 баллов
    Всем привет. Представляю вам программу для почти полного управления дроном. Но сначала короткая предыстория: Из возможностей отмечу следующее: Перемещение по сторонам света без улучшения "Навигация"(Спасибо версии OC 1.7.3) Возвращение дрона к управляющему планшету(Компьютеру) Удалённый интерпретатор Привязка дрона к управляющему планшету(Почти полная невозможность угона) Красивый Динамичный интерфейс(Отображение заряда планшета, время, заряд дрона, уровень сигнала) Остальные функции можно найти в программе или в скриншотах. Установка: На планшет (Для обладателей интернет-карт): wget https://raw.githubusercontent.com/BrightYC/DRC/master/tablet.lua drc.lua Для дрона (Для обладателей интернет карт): wget https://raw.githubusercontent.com/BrightYC/DRC/master/drone.lua drc-flash.lua && flash -q drc-flash.lua drc.lua (Код без минификации: https://raw.githubusercontent.com/BrightYC/DRC/master/non-minify-drone.lua) После вынимаем биос и вставляем в дрона. Первый запуск: Первый запуск сопровождается привязкой дрона к порту(Порт можно увидеть открыв дрона) и адресу беспроводной карты. Из-за этого возможность угнать дрона стремится к нулю, так как для первичной настройки нужно стоять не дальше 5 блоков от дрона. Пишем: drc <порт дрона> После этого дрона невозможно угнать, если рядом никого не было и он не мог подслушать сообщение(Перезагрузка привязку не ломает) Пара скриншотов: Видео: P.S Процент справа от шкалы сигнала обозначает не силу сигнала, а мощность передатчиков на планшете с дроном(поэтому для корректной работы нужны одинаковые карты беспроводной сети) На этом всё, дань уважения дронам выполнена, теперь могу спать спокойно.
  4. 11 баллов
    Некоторое время назад я публиковал программку - интернет-мост 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% срабатывает баг - буду очень рад и пофиксить его будет легче. С помощью описанной фишки можно придумать много хрени. Я показал самое простое что пришло в голову. Уверен, ваша фантазия будет покруче моей ) Пишите баг-репорты или пожелания по фиче, да и просто комменты в эту тему, либо мне в любой канал связи, где я онлайн.
  5. 10 баллов
  6. 9 баллов
    Иногда, особенно когда вы занимаетесь строительством реакторов, необходимо очень много укрепленного камня. Можно конечно и вручную залить нужную территорию, но согласитесь, лучше когда за вас это все сделает кто-то еще. Итак представляю вашему вниманию небольшую автоматическую систему по производству укрепленного камня. Вам всего то надо обеспечить эту ферму (генератор укрепленного камня) железными лесами, песком и энергией. Перейдем к постройке: Главным центром всей постройки является робот. Его устройство рассмотрим позднее. Справа от робота необходимо установить любую зарядку для бура/ваджары. Ну или если вы совсем бедные, и планируется что робот будет работать киркой, то установите сундук. Слева от робота устанавливайте Жидкостный/Твердотельный наполняющий механизм. Он заправляет распылитель сразу, за 1 прогон. Это будет наполнитель для зарядки распылителя. Рядом с зарядником распылителя рекомендую установить еще один Жидкостный/Твердотельный наполняющий механизм, который будет генерировать сжатую пену. В слоты улучшения обязательно установите "Выталкиватель жидкости". С подачей воды и смеси думаю разберетесь сами. Не забываем выставить настройки в механизмах как показано на скрине: За роботом нужна зарядка, чтоб он мог работать вечно! И не забываем её стукнуть ключиком, чтоб не заморачиваться с рычагами. Конвертор энергии не забудьте подключить к энергобуферу (или можете не устанавливать его, провода из ИС2 с ОС коннектятся) Над роботом установите сундук, и желательно побольше. В него необходимо засыпать железные леса и песок. Учтите, на 1 блок укрепленного камня необходимо 1 железные леса и 1 песок. Автоматизация засыпания расходников, уже на вас. Под роботом распологается сундук в который будет ссыпаться укрепленный камень. Так как наш робот будет нереально дешевым, не забываем сделать подставку на которой будет готовиться ваш камушек. Рекомендую вообще оградить это место, чтоб ни курица ни игрок не залезли перед роботом (иначе распылитель запенит все в округе). Собственно это все что необходимо вам знать при постройке этой фермы. Переходим к роботу. Программу я сделал для двух типов роботов, простейший Т1 и супердешевый на eeprom. Простой робот-генератор укрепленного камня: Супердешевый робот-генератор укрепленного камня: Настоятельно не рекомендуется лезть перед роботом иначе рискуете получить такое Не лезте своими шаловливыми ручками в слоты к работающему роботу. Можете забрать готовый камень, но расходники не трогайте, так как скорость смены инструмента огромная, и если робот что-то не найдет, вам грозит быть залитым в пену. (смотри скрин выше) Одной заправки распылителя хватает на 80 применений, потом робот автоматически перезаряжает инструмент и распылитель. А в остальном данная ферма работает довольно стабильно и исправно. А рассказал вам о ферме Asior, фармите укрепленный камень, гоняйте кур от фермы и удачи в тяжком труде реактостроителя! P.S. Укрепленный камень выдерживает ядерный взрыв, но радиацию сдержать увы не сможет. Осторожнее.
  7. 9 баллов
    Новые солнечные апгрейды(аддон к Opencomputers) выведут роботов на совершенно новый качественный уровень. Роботы станут почти автономными и смогут работать практически неограниченное время (если, конечно, робот будет проверять время суток, видимость неба и текущий заряд и вовремя всплывать на поверхность для подзарядки) Продвинутая, гибридная, ультимейт и квантовая панели обеспечат роботов и дронов неисчерпаемой энергией. Также аддон добавляет потрясающую и невиданную до сегодняшнего дня новую фичу - зарядку своих инструментов при необходимости прямо внутри инвентаря. Позитронный мозг робота/дрона программно уже сам сможет решить, по каким электрическим цепям ему в данный момент необходимо перенаправить могучие потоки энергии - в бур, в электро-краник для гевеи или в любой другой инструмент, который у него в инвентаре, или же в Главный аккумулятор, а при необходимости и направить всю свою мощь и энергию в миллионы ГВт для колоссального удара Теслой и разрушения на кварки всей живой материи в радиусе при опасности и при обнаружении врага на радаре. "Живучесть" и автономность роботов увеличивается на порядки. Также вы можете использовать своего робота в дальних путешествиях и просто дать ему подзарядить джетпак и свои квантовые или нано трусы, если они вдруг внезапно разрядились. Некоторые солнечные апгрейды, конечно же, не дешевые в крафте, но они того стоят. Роботы, наконец-то, шагнули в квантовую эру благодаря новым источникам энергии и новому аддону. Прощайте, архаичные ванильные угольные апгрейд-чайники. Вы хорошо послужили нам, но прогресс идет вперед. Уже приближается звук ударов иридиевых буров из шахт и слышится жужжание квантовых роботов и свист дронов. Замысел, геймдизайн: Alex Java кодинг: Neo
  8. 9 баллов
    Представляю вам опять программу для робота, которая позволяет добывать руду, не лазая по пещерам. Робот, используя геолизер, может самостоятельно находить и добывать руду. Реализованы еще не все возможности, поэтому прошу тестировать и сообщать мне о багах. Требования: Корпус компьютера (уровень II или III) Апгрейд инвентарь (больше - лучше) Апгрейд контроллер инвентаря Жесткий диск EEPROM с прошитым Lua BIOS Геосканер Память (уровень I или выше) Процессор (любой) Апгрейд полета (I уровень) Алмазная кирка или аналогичный инструмент. Опционально: Апгрейд верстак Беспроводная сетевая карта Апгрейд батарея Апгрейд опыта Апгрейд чанклоадер Апгрейд генератор Апгрейд солнечная панель Эндерсундук из мода EnderStorage Установка: Скачать и сохранить файл как init.lua wget https://raw.githubusercontent.com/DOOBW/geominer/master/miner.lua init.lua Закинуть этот файл в корень диска. Добавить диск при сборке робота. Установить робота на платформу из твердых блоков. Дать роботу кирку. Поставить возле робота контейнер и зарядник. Нажать кнопку питания и наслаждаться процессом.
  9. 9 баллов
    Упал, отжался, отозвался. Да, человечество уже давно мечтает о программе, которая позволит легко создавать lua скрипты. Но дальше разговоров дело не продвинулось до сих пор. Создавать lua скрипты стало даже сложнее, чем 20 лет назад. Обязательно! Но только если создавать lua скрипты в такой программе и вправду будет легко. В идеале нужно максимально упростить интерфейс. Если можно, оставить лишь две кнопки: "создать lua скрипт" и "создать графический интерфейс", а всё остальное программа должна сделать сама. Это очень бы упростило бы процесс создания lua скриптов и графических интерфейсов. Взаимно)
  10. 8 баллов
    Не-е, нельзя быть таким пессимистичным. Всё можно, и вопрос решается очень легко. В HTTP/1.1 есть хедер Range, который позволяет скачивать файлы кусками. Кроме того, OC умеет посылать и получать хедеры. local socket = component.internet.request("https://logs.s7.mcskill.ru/Hitechcraft_Public_Logs/public_logs/Hitechcraft_Public_Logs/14-02-2020.txt", nil, { Range = ("bytes=%d-"):format(start) }) local data = "" while true do local chunk = socket.read() if not chunk then break end data = data .. chunk end local _, _, headers = socket.response() print("Got: " .. #data) print("Content-Length: " .. headers["Content-Length"][1]) print("Content-Range: " .. headers["Content-Range"][1]) Вместо start подставить количество байт, уже прочитанных. Там указывается начало диапазона номером байта (начиная с 0), от которого нужно выдать ответ. См. доки. Поэтому тактика такая: Посылаем запрос с методом HEAD (4 параметр к component.internet.request), чтобы получить только хедеры. Читаем в хедерах значение Content-Length. Начинаем запрашивать куски файла с конца, пока не наберём нужно кол-во строк. После получения начальных строк запомним позицию последнего байта и дальше запрашиваем инфу после него.
  11. 8 баллов
    Для тех, кто торопится: https://github.com/BrightYC/RipMarket/tree/master Всем привет, решил выложить свою программу-магазин. Экономикой, в отличии от не обладает. Так же, интерфейс позаимствован с программы выше. Скажу сразу, программа писалась для себя. Работать без OpenPeripheral/AE2 не будет. Возможности: Продажа/покупка товара Обменник руды(Коэффицент можно настроить в файлике items.lua - ratio) Раздатчик бесплатной еды(Кол-во выдаваемой еды настроить можно только через код =\, но по стандарту - 16 яблок/арбузов) Лотерея(Делалось наспех, для заполнения меню) Инфо-панель(Поддерживает только цвета, настроить можно в начале - FAQ Возможность оставить отзыв об магазине Установка: Настройка, увы, не из простых. Нужно заиметь какой-нибудь vds, так как вся информация хранится на стороне. По стандарту, NodeJS сервер запускается на 1414 порту. После, нужно придумать уникальный ключ, и вставить его в код всех терминалов. Так же, нужно разместить таблицу со всеми предметами, и вставить ссылку в код(В таблице хранится вся информация - какую руду обработать, какая еда доступна к выдаче и т.д) По поводу хранения информации всех пользователей - они хранятся в виде txt файлов в JSON. Хранятся они в относительном пути, где установлен сервер. К примеру: /home/user/pi/ripmarket/users Логи покупок/регистраций хранятся по такому же пути, но вместо users - logs /home/user/pi/ripmarket/logs Монтирование всего в игре - к каждому терминалу нужно подключить PIM, снизу PIM'а мэ интерфейс(мэ интерфейс нужно подключить к МЭ сети). Ко всему этому надо подключить адаптеры. В видео можно увидеть как это всё выглядит в игре. Запуск: Желательно запускать код через start.lua, который есть в репозитории. Так как если будет какая-то ошибка - программа вылетит. Поэтому нужен лаунчер. Все логи терминала(Не путать с сервером!) хранятся в директории /home/logs Видеодемонстрация: Инструкция по установке modem версии
  12. 8 баллов
    Когдато в далеком прошлом я и krovyaka написали прожки для казиношек. Но мы были слишком жадные что б выкладивать их в паблик и зажали ток себе. Но поже мы все перенесли на игт в паблик репозиторий и случилась бяка (их нашли и посливали друг другу). Теперь я думаю выкласть их здесь. https://github.com/lfreew1ndl/OpenComputers-Casino Валюта находится на отдельном сервере и вам что б запустить их нужно будет переписать durexdb.lua на свое хранилище валюты. (по назвах методов думаю поймете). Есть и деплоер который вам не поможет потому что вам нужно переписать durexdb.lua Какашками не бросайтесь мне просто лень переписивать для общего пользования но хочу выложить что б кто захочет сделал это и если ему не жалко заатачил переписаные файлики здесь или лучше даже кинул пул реквест на мою репу и я прийму его. Скринчики ниже. P.S. Для кого интерфейс вырвиглазный УХАДИ. Блек джек Больше меньше Видео покер Лабиринт Рулетка Терминал (на скрине не видно но игрок стоит на PIM)
  13. 8 баллов
    Примитивная Операционная Система для слабых компьютеров Возможности: Простое API для быстрого и лёгкого написания своих программ (Документация: в розработке) Удобный Файловый менеджер для работы с файлами и папками Наличие редактора кода (Больше не знаю, что еще сказать, но думаю вы всё поняли) Кнопки: Стрелки Вверх и Вниз - навигация по файлам Enter - запустить програму, или открыть папку Tab - переключения по доступным дискам (дискетам) Alt - Открыть системное меню Ctrl - Открыть меню файла/папки (в текстовом редакторе - меню сохранения) Системные требования: Корпус компьютера, екран - 1 Tier Процесор - 1 Tier Видеокарта - 1 Tier Память - 1.5 Tier (x1) Жерсткий диск - 1 Tier Дисковод, клавиатура, Lua BIOS - должны присутствовать Установка: Вставляете чистую дискету в комп (с OpenOS) Вводите команду в консоль: pastebin run ngQT9YF8 Выбираете пустую дискету из спика файловых систем Когда всё будет готово - вынимаете теперь уже инсталлер данной ОС Собираете слабый комп и устанавливаете ОС с дискеты Буду рад отзывам, которые помогут мне улучшать систему. Скриншоты: Внимание! Просмотр кода может вызвать побочные ефекты: ужас, стыд, депрессия, потеря сознания
  14. 8 баллов
    Всем привет. Написал небольшую программу для автоматизации телепорта из EnderIO. В роботе должны присутствовать: Улучшение "Чат" Улучшение "Контроллер инвентаря" Улучшение "Инвентарь"(Больше - лучше, с 4 инвентарями будет доступно 64 точки) Плата на красном камне(Любой уровень) Собственно, сама программа: https://raw.githubusercontent.com/BrightYC/Other/master/telepad.lua В программе можно настроить symbol(Префикс команд) whiteList(Другие игроки не смогут использовать телепорт) side(Сторона телепорта - верх, низ, спереди) bufferSide(Нужно только для версий выше 1.7, там вместо настройщиков нужно класть в инвентарь телепорта распечатку, а достать оттуда распечатку невозможно, хотя получить имя предмета - можно, поэтому ставим буфер/сундук с трубой) version(Версия работы - selector для 1.7, paper - для версий выше) Текстовая инструкция, как сделать точку телепортации: Берём настройщик координат(Если у вас версия выше 1.7 - нужно будет прихватить бумагу) Тыкаете(пкм) в то место, где хотите поставить точку. Если у вас 1.7 - можете идти домой(P.S для назначения уникального имени на 1.7 нужно переименовать настройщик в наковальне). Если нет - у вас открывается интерфейс, где можно назначить имя точки. Кладём в робота. Пишем в чате ?update Пишем ?list и проверяем наличие точки. Итог - копия плагина MyWarp(чат-команды практически заимствованы оттуда), доступно до 64 "варпов", немного дописав можно приделать доп. инвентарь, тогда количество точек стремится к бесконечности. Видеодемонстрация:
  15. 8 баллов
    Штурман, у нас разрыв свиньи! Придётся катапультироваться.
  16. 8 баллов
    Не так давно решил я немного нафармить обсидиана, но прыгать по озерам лавы, тушить её водой, а потом долго и нудно собирать как-то не то. Хотелось автоматизировать этот процесс. Да есть специальные генераторы обсидиана, но там требуются расходники в виде красной пыли или другого горючего материала, что для меня было неприемлимо. Поэтому был собран первый прототип генератора обсидиана. Портатип генератора обсидианта Version 1.0 Довольно сложная но красивая конструкция. Время генерации 1 стака ~ 2 минуты 30 сек. Внешний вид: Инструкции по сборке: По времени работы меня такой результат вполне устраивал, но потом @Romanok2805 показал свою версию похожего генератора. Описывать его я не буду, поясню что смысл работы того генератора, он черпает ведром лаву из бочки, выливает её рядом с источником воды, меняет ведро на бур и разрушает обсидиан. И так по кругу. Обмозговав алгоритм его работы, был придуман улучшенный генератор обсидиана. Генератор обсидианта Version 2.0 Довольно легкая конструкция, дешевый робот. Время генерации 1 стака ~ 15 сек. Внешний вид: Инструкции по сборке: Генератор обсидиана Version 2.1 Довольно легкая конструкция, дорогой робот. Внешняя бочка не требуется. Время генерации 1 стака ~ 15 сек. Внешний вид: Инструкции по сборке: Генератор обсидиана промышленный Version 3.0 Дорогая конструкция, дорогой робот. Навешано чуть больше расчетов, в связи с чем время генерации обсидиана увеличено, но зато данный генератор может обновлять расходники. Время генерации 1 стака ~ 17 сек. Внешний вид: Инструкции по сборке: Собственно такие вот получились варианты сборки фермы обсидиана, я конечно хз зачем вам столько его потребуется, но, коль уж есть программа почему бы ею не воспользоваться. Всем удачи, копайте обсидиан быстрее, чем вам сосед P.S. Большое спасибо за демонстрацию и помощь в написании программы @Romanok2805, за информацию по багам @M_O_R_F_I_K
  17. 8 баллов
    Небольшое обновление: Доделал интерпретатор, теперь почти неотличим от оригинала. Теперь не нужно писать return чтобы вернуть значение, так же добавил возможность прекратить код через CTRL+D при исполнении Так же добавил утилиту загрузки по сети. Чтобы загрузить программу на дрона. То есть, можно запустить любую программу командой net <program_name> И она сию минуту загрузится на дрон: Установка: wget https://raw.githubusercontent.com/BrightYC/DRC/master/network-load.lua net.lua Так же, в интерпретаторе есть функции: update() - обновляет данные на планшете print(...) - помогает отправить данные на планшет в работающем коде sleep([timeout: number]) - сон он и в африке сон pull([timeout: number]): name, ... - ожидает какой-либо сигнал не ломая связь move(dx: number, dy: number, dz: number, wait: number) - блокирующий drone.move distance(): number - возвращает расстояние до планшета, если ответ не пришёл в течении 3 секунд - возвращает 0 moveToUser() - перемещает дрон к планшету slot([slot:number]) - безопасно выбирает слот(К примеру - в дроне всего 4 слота, но slot(5) выделит самый последний и не выкинет ошибку) clear - очищает терминал
  18. 7 баллов
    Предлагаю увеличить радиус радара из OpenPeripheral и Computronics до 20 блоков. 7 блоков слишком мало, чтобы нормально разместить эти радары. UPD: Если у радаров из OpenTechnology радиус 32 блока, тогда может стоит и обычным радарам такой же радиус сделать?
  19. 7 баллов
    О прошлой версии я умолчал, но исправляюсь. Вышла 1.7.5 с чаем и сладкими фичами. Новинки Анализатор, которым адреса компонентов получаем, теперь вставляется в планшет. Он займёт компонент barcode_reader, но методов у него нет. Зато он вернёт в ивенте tablet_use адреса и типы всех компонентов внутри блока, если планшетом нажать на него и удерживать до писка. Известно, что в компы вставлять можно любой объём текста не более 256 строк. Дело в том, что из-за ошибки каждая строка отсылает отдельное событие clipboard, а на компьютере есть лимит очереди необработанных сообщений. Равный 256. Поэтому остальные строки отбрасываются. Теперь этот лимит можно менять в конфиге. В internet.request разрешили использовать экзотические HTTP-методы вроде PUT. Ангельские апгрейды, которые позволяют ставить блоки без опоры, теперь вставляются в дронов. Наконец-то. [MC 1.12] Зарядники заряжают предметы в инвентаре игрока рядом с ним. Апгрейд опыта показывает уровень прокачки ещё и в тултипе. [MC 1.12] Если банки с эссенцией из Thaumcraft просканировать через контроллер инвентаря, то добавляется информация о том, что за ссенция в ней находится. [MC 1.12] Поддержка многожильных кабелей из SimpleLogic. [MC 1.12] Поддержка WE-CBE. [MC 1.12] Изменено Вокруг экрана не будет рамки, если не приседать. Добавлено ещё сколько-то имён для роботов. Обновлён китайский перевод мануала. Поменяны некоторые комментарии в конфиге. gpu.bind работает быстрее. В computer.pushSignal можно пихать таблицы! Кроме вложенных. Сделана более логичной нумерация уровней APU. Она соответствует теперь уровню процессора в нём. В RAID все диски переключаются в режим с ФС при вставке. Ну и форматируются, конечно. Починено Роботы научились черпать вёдрами. Очередной дюп жидкости. Два даже. Модемы T2 ловят и проводные сообщения, наконец-то. robot.swing правильно рапортует статус, даже если блок крушится очень быстро. Сообщения между серверами серверной стойки передавались медленно и неторопливо. Реле правильно показывают проходящий трафик. Всякие проблемы с передачей сообщений через реле. Если itemDamageRate поставить в 0, роботы теперь вообще не будут ломать инструмент. Краш из-за hologram.copy. Метод isSunVisible геолайзера на планшете теперь таки работает. Раньше true возвращал всегда. Краш из-за удалённых терминалов. Робот без инвентаря дропнутые предметы сжирал и не давился. TLWY не выкидывался, когда надо было. Можно было сервер положить. Теперь эту ошибку нельзя перехватить в pcall/xpcall. См. коммент об изменении в поведении xpcall. Краш при взрыве работающего компьютера. С включённым LuaJ не все архитектуры были доступны. Краши, баги, недочёты с AE2. Краш с IC2 Classic. Изменения в OpenOS Ошибки, связанные с установкой oppm. Таймеры не вызывались во время event.pull. Команда reset ставит максимальное разрешение экрана. Фиксы в либе vt100. Добротно падает, если принтить объекты с недоброкачественным метаметодом __tostring. Стоит отметить, что OpenComputers больше не будет обновляться для версии MC 1.11.2. На 1.7.10, 1.10.2 и 1.12.2 всё останется по-прежнему. Впрочем, более половины новых фич только для 1.12.2. Качать можно отсюда.
  20. 7 баллов
    Доброго времени суток, дорогие друзья. Давно я ничего не постил на этой площадке. Сегодня я расскажу историю о том как мы с @FluttyProger решили создать простенькую игру на телефоны. Идея пришла к нам быстро. Я хотел что то про космос да и Флатти хотел воскресить какую то игру про космические войны, захваты планет, кланы-шмланы, но самое главное мы сошлись на том что это кликер. Все это мы и решили взять за основу, в итоге у нас вся графика мертвой игры, Флатти на пальцах пытается рассказать какая же офигенная была та игра и как мы ща все быстро соберем и будет у нас готовый продукт со своей аудиторией. Вроде все просто, мы делим обязанности, что я занимаюсь графикой и UI, а Флатти кодит. Буквально за пару часов из готовой графики, а так же дорисовки на скорую руку я склеиваю интерфейс в фотошопе чтоб понять что мне делать в Unity (да не сказал делать проект решили в Unity), результат ниже. Результат показал что графика, из-за того что мы вводим свои прокачки и механики, слегка вырвиглазная и нужно что то менять. Я начинаю делать новые спрайты для всех панелей прокачек и не могу попасть в стиль с готовыми кораблями, фонами и прочим(забыл сказать готовую графику я все же изменил в иллюстраторе чтоб не было проблем авторских). Флатти говорит и так сойдет, давать делать игру, но я не согласен и в наш "быстрый" проект добавляется задача "Новая графика". Не долго думая я решил что самой быстрой будет в производстве пиксельарт (и это ошибка) и взялся за работу, Флатти же в свою очередь создал сцену с Пепегой в которую можно было кликать и ждал. С горем пополам я склепал часть недографики и начал стоить каркас UI. Методом проб и ошибок создали что то похожее на изначальный план и Флатти начал кодить. Машина создания запустилась и мы думали что месяц и все будет готово. Но не тут то было, без ТЗ, без полного представления что мы хотим получить все стало ломаться, я делал очередную панель, описывал Флатти что она должна делать, он делал, я что то менял и все ломалось, прошел месяц мы продвинулись процентов на 30% и все стояло на месте, фиксили одно, ломалось другое, стало понятно что нам нужно как то структурировать нашу работу. Мы начали создавать карточки в Trello и все стало получше, мы совершили прорыв и игра была вроде как готова. Я тут понял что не рассказал о чем же игра. Мы решили создать кликер в котором игрок бы летел по космосу от планеты к планете, по пути встречая разных жителей космоса, мы сошлись на трех: Враги - их мы убиваем, Альянс и Учеными - с ними мы дружим и торгуем. Так как встречи разные, наделили корабль параметрами: Силой - для врага, Наукой - для Ученых и Технологиями - для Альянса. Так же сам корабль можно улучшить чтоб дольше летел, большее бил врага, больше денег добывать и тд. Но параметры это улучшение уникальное и влияет на улучшения корабля, а чтоб повысить параметр нужно нанять на планетах юнита нужного класса: Сила - Воин, Техн. - Инженер, Наука - Ученый. К этому всему добавили механику скиллов которые работают от местной "маны" - Нестабильной материи. Систему репутации чтоб игроки соревновались. Возможность капитану "выбирать" планету к которой лететь и еще всякие микроплюшки. От игры оживить которую мы хотели осталось только начало названия Galaxy и пару фонов. Так вот, игра почти готова, Флатти ловит жуков в игре, а я занялся проверкой баланса который мы наманьячили. И тут понеслось, как оказалось делать 100500 механик которые друг друга увеличивают и уменьшают от кучи условий в разных этапах развития игрока создавать было не лучшей идеей. Время шло я предлагал что изменить, Флатти менял, я тестил, мы плевались от результата и все по новой. И вот прошло полгода с начала создания "простого кликера" и мы все же релизнули его в Google Play, да так и не доведя баланс до идеала, да не с тем продуктом который мы задумывали, но все же с нашей игрой, и мне с Флатти хочется поделиться ею с вами. Половить тапки в свой адрес, а может и приятный фитбек. Спасибо большое за внимание! Ссылка на игру Galaxy Grinder Так же накидаю скинов с этапов создания игры.
  21. 7 баллов
    Программа находится в разработке. Постараюсь упростить процесс настройки программы. Данная программа сканирует содержимое вашей МЕ системы и поддерживает заданное количество указанных в списке предметов. Иными словами предварительно крафтит (preCraft). Это полезно на развитых индустриальных базах, где практически всегда есть медленные рецепты с высокой импульсной нагрузкой, так что если заранее их выполнить можно повысить быстродействие вашего автокрафта. Основой системы является то, что me_interface предоставляет нам информацию о содержимом МЕ и о списке крафтов, а так же предоставляет объекты управления заказанными из OC крафтами. К сожалению получить информацию от текущих крафтах заказанных не из ОС не возможно. Так же API содержит ряд багов по работе со списком предметов в МЕ, а именно некорректно написан фильтр (подробнее можете сами посмотреть на git AE если конечно понимаете scala). В связи с вышеперечисленным требуется много ОЗУ >2mb. Из периферийных устройств нужен adapter подключенный к ме интерфейсу и database https://ocdoc.cil.li/item:database_upgrade для формирования списка прекрафтов. Я постарался минимизировать блокирующие вызовы, однако сканирование списка крафтов при начальной инициализации системы занимает много времени. Установка pasebin get 5hnW78DU preCraft.lua Настройка Первоначально вам необходимо отредактировать код программы. (позже сделаю утилиту конструктор) edit preCraft.lua советую провести манипуляции в текстовом редакторе а потом вставить изменения в ОС На 32 строчке программы находится local preCrafts = { { size = 1000, label = nil, alias = "SoC", craft = nil, progress = nil }, { size = 1000, label = nil, alias = "ASoC", craft = nil, progress = nil } } 33 и 34 строчки это и есть прекрафты, вам необходимо заполнить поля size = сколько штук поддерживать поле alias необходимо т.к некоторые моды что используют свою систему предметов например GregTech, Immersive Engineering выдают не человеко читаемые имена блоков. Если вас это устраивает alias = nil если нет пропишите имя руками alias = "название вашего предмета" теоретически длинна списка не ограничена, однако database t3 содержит 81 предмет и в данный момент дописывание в конец списка не реализовано. для увеличения списка просто вставьте между 33 и 34 строчками еще строчек и отредактируйте их { size = 1000, label = nil, alias = "SoC", craft = nil, progress = nil }, обратите внимание что в конце списка строка не содержит запятой { size = 1000, label = nil, alias = "ASoC", craft = nil, progress = nil } параллельно с составлением списка добавляйте предметы в database первый слот database соответствует первой строке списка и так далее local preCrafts = { первая строка списка{ size = 1000, label = nil, alias = "SoC", craft = nil, progress = nil }, вторая строка списка{ size = 1000, label = nil, alias = "ASoC", craft = nil, progress = nil } } После окончания заполнения списка и database положите database в адаптер и запустите программу с параметрами --int2ext --pclName=preCraftList.lua preCraft.lua --int2ext --pclName=preCraftList.lua программа создаст файл preCraftList.lua после чего database больше не требуется Запуск программы preCraft.lua --extList --pclName=preCraftList.lua --thrLim=4 параметр --thrLim=4 определяет сколько крафтовых процессоров использует программа одновременно, по умолчанию 2 (если этот параметр не указывать) автозапуск программы можно организовать добавив вашу строку запуска preCraft.lua --extList --pclName=preCraftList.lua --thrLim=4 в .shrc https://pastebin.com/5hnW78DU p.s написано под разрешение 160*50. работать будет на любом но консоль отобразится некорректно
  22. 7 баллов
    В общем я много думал, и это не вариант. Если превратить выходные нейроны во внутренний слои и с них снимать значения, то последний один нейрон а.к.а "полезность" просто настроится всегда показывать 0. Для нейросети это беспроигрышный вариант - робот забился в угол, нейросеть определяет что польза будет 0, и ты ей обратным распространением ошибки подкрепляешь и передаешь 0. В общем, не выйдет так делать. Последние 3 дня работаю над экспортом эмулирующей программы в браузер, но и развлекаюсь добавляя анимации
  23. 7 баллов
    ДИСКЛЕЙМЕР При просмотре исходников серверов возможны противопоказания необходима консультация специалиста. Побочные эффекты при просмотре исходников серверов: Эбола, эпилепсия. Ни в коем случае не использовать код карты на практике. Всем привет! После большого перерыва я сделал новую карту. Суть карты взломать аутентификацию маршрутизатора и разрешить доступ в интернет. Сюжет карты: вы школьник, вам около одиннадцати лет, вы учитесь очень плохо. В один день вы принесли домой пять двоек, на вас очень сильно разозлилась мама и решила что во всём виноват интернет. Вызвав компьютерщика, она рассказала ему ситуацию и он в свою очередь заблокировал доступ в интернет на маршрутизаторе, поменял пароль для главного аккаунта, чтобы никто кроме него не мог изменить статус доступа в интернет. Насмотревшись как открывать порты в ютубе, вы замечали в роутере родительский контроль и подумали что сейчас у вас всё получится. После попытки входа, вы увидели сообщение, после которого вы чуть не сломали себе монитор. Ваша задача взломать ваш домашний маршрутизатор (роутер) с помощью вашего компьютера (пинать ногами роутер не нужно) и разрешить доступ в интернет. Чтобы удостоверится, что вы разрешили доступ в интернет - нужно попробовать зайти на сайт wikipedia.org и у вас должен высветится этот сайт. Правила карты (На вашу совесть, чтобы было интересно): Запрещается просмотр исходников серверов (роутера и сайта wikipedia). Команда для открытия браузера: browser Подсказки по прохождению карты можно попросить у меня во ВКонтакте: https://vk.com/superrolan51 Ссылка на небольшой ролик по карте: Клик Ссылка на сборку: Клик Ссылка на портативную сборку: Клик (Для версии Forge 1.7.10) Удачи в взломе! P.S. Не пишите в комментариях подсказки к карте Если у вас есть идеи для новых квестов - отписывайте сюда.
  24. 6 баллов
    В связи с тем что компоновка OT мне не нравится, было решено сделать ребрендинг ОТ. Фичи из ОТ будут перенесены и доработаны, не все конечно. Здесь мы будет информировать вас о грядущих обновлениях, здесь принимаем фидбек, идеи, баги, так же можем иногда выкладывать видео-ролики с интересными фичами мода, например как этот ниже. Разработчики мода: @NEO @vx13 Большое спасибо @LeshaInc за модель солнечной панели.
  25. 6 баллов
    Предлагаю добавить свадьбы и кланы. К дополнению к WarpDrive, а то как-то не полноценно получается.
  26. 6 баллов
    Срочная новость! Нападение на спавн! Администратор в заложниках!
  27. 6 баллов
    Тут никому не надо бежать. Все уже прибежали. Предположим, сначала на варп пришёл обычный игрок. Он стоит, смотрит по сторонам. И тут приходит игрок из чёрного списка, срабатывает датчик, и телепорт уносит обоих игроков в измельчитель. За такое админы могут наказать владельца варпа. Если подобная ситуация не создаёт проблем, то можно использовать простое решение: Прошиваем EEPROM этим кодом: -- программа, телепортации игроков из чёрного списка -- телепорт из IC2 управляется красным сигналом -- перед использованием исправить список игроков, -- окрестность варпа и сторону с телепортом local black_list = { "black", "schwarz", "niger" } local x1,x2,y1,y2 = -2.5, 1.5, -1.5,2.5 local rs_side = 3 local redstone = component.proxy(component.list("redstone")()) -- преобразование таблицы для удобства использования for k = #black_list,1,-1 do black_list[black_list[k]] = true black_list[k] = nil end -- ожидание перемещений игроков на варп -- и телепортация игроков из чёрного списка local _, signal, x,y, player while true do signal,_,x,_,y,player = computer.pullSignal() if signal == "motion" and black_list[player] and x1<=x and x<=x2 and y1<=y and y<=y2 then redstone.setOutput(rs_side,15) redstone.setOutput(rs_side,0) end end Встаём лицом на север, ставим самый простой корпус компьютера, справа от него конвертер энергии, к нему подключаем MFSU, а перед корпусом ставим телепорт: Сверху на компьютер ставим датчик движения (Motion Sensor из OpenComputers). В компьютер вставляем прошитую EEPROM, и самые дешёвые: красную карту, процессор и планку памяти Стоя на телепорте примерно по его центру, создаём варп. Где-то ставим целевой телепорт, его запитывать энергией необязательно. Связываем телепорт на варпе с целевым телепортом. Никаких дополнительных удобств моя программа не предусматривает. Для изменения чёрного списка тупо исправляем код и заново прошиваем EEPROM. Можно иначе расположить телепорт относительно корпуса компьютера. В этом случае в коде потребуется изменить сторону подачи сигнала редстоуна. А при изменении положения телепорта относительно датчика движения и сторон света следует изменить границы окрестности варпа.
  28. 6 баллов
    Недавно узнал о том, что в праздничные дни при крафте предметов из OC можно получить подарки с халявными вещами из того же OC. А самый простой крафт - клавиши со стрелками. Инфу дал@BrightYC Ведомый вожделением халявы и неприятием гринда я обратился к заповедям Церкви Доброй Автоматизации... Представляю вам систему автоматического получения подарков! Основная идея состоит в том, чтобы робот скрафтил 4 стака кнопок и разместил их в слотах верстака инженера(tinkers construct) Чтобы делать это максимально быстро каждый из 4 слотов заполняется отдельным роботом извлечение камня из некоторого источника выполняют отдельные роботы, асинхронно, т.к. работа с инвентарями имеет задержку. Однако задержка искусственная, робот на самом деле дропает сразу и в освободившийся слот другой робот может в это время вставить новую порцию материала Под Inserter-ами должны находиться инвентари с камнем, я использовал магматические пресы(thermal expansion) Вариант билда: Скриншоты с разных ракурсов: https://imgur.com/a/ibudY9k Программа для Crafter(eeprom) https://pastebin.com/ahwfBBRd Программа для Inserter(eeprom) https://pastebin.com/cj1viKmx Программа для управляющего терминала(OpenOS) версия для PIM: https://pastebin.com/bU64bTg5 версия для транспозера(1.12.2): https://pastebin.com/iMnistit Использование: 1. Включаем всех роботов 2. Запускаем терминал доступные команды: `afk eject` - извлекает из вашего инвентаря все и помещает в инвентарь со стороны `chestSide`(с.м. код терминала в начале) `afk pick up` - возвращает вещи в ваш инвентарь `start` - отправляет роботам сигнальное сообщение и начинает извлекать из вашего инвентаря клавиши и подарки в соответствующие инвентари `trashSide`, `presentSide``(с.м. код терминала в начале) 3. Открываем верстак 4. Кладем кирпич на клавишу Shift, включаем автокликер на слот результата 5. Идем пить чай или чего у вас там 6. ??? 7. Profit! На версии 1.7.10 роботы, к сожалению, не могут вставить кнопки в слоты верстака инженера, поэтому нужно поискать другой подходящий верстак в вашей сборке Минимальные билды роботов: Inserter Crafter Терминал +транспозер, монитор 1 лвл Благодарности: @BrightYC за информацию о подарках @eu_tomat за вдохновение @Fingercomp за помощь в отладке программы Спасибо вам, ребята, без вас бы этого поста бы не было)
  29. 6 баллов
    Ну, надеюсь точно доделал. Доделал почти всё что хотел. Из новинок: Возможность выбрать режим поиска(весь инвентарь/1 слот) Запуск с EEPROM(никаких зависимостей, программа целиком и полностью на голом HDD) Админ-панель. Ну, чтож, теперь "админы" в программе указываются в EEPROM, ибо для обновления/запуска программы требуется знать, кто же администратор. В админ-панели можно банить игроков, обновлять базу данных предметов, вводить терминал в режим тех-работ, удалить ключ с диска. Небольшая переделка интерфейса, так же теперь игроки при первом логине ОБЯЗАНЫ прочитать "помощь"(Это отсеивает игроков, которые не понимают что это вообще такое) Ключ не указывается в программе, его теперь нужно вставлять через буфер обмена. Сохраняется на жёстком диске по пути в корне диска key.lua Немного адекватнее стал конфиг. Добавил openperipheral selector, позволяет показывать предмет, который пользователь выбрал. И еще куча всяких вещей, вроде того что скроллбар работает с мышью. К слову, теперь установить программу можно вроде как проще. Прошиваем EEPROM, и она автоматически скачивает программу с репозитория. Обновить можно будет комбинацией клавиш CTRL+D. Появилась утилита автоматического экспорта. Позволяет автоматически экспортировать предметы, если в таблице items указать параметр needed. Будет поддерживать это кол-во в мэ сети, но нужен мост между основной мэ-сетью и сетью магазина. Buffer - это сколько предметов должно быть в сети, чтобы можно было экспортировать предмет(Необязательный параметр). Для работы этого экспорта нужна деревянная мотыга в сети. Даже не спрашивайте зачем Пачка скриншотов:
  30. 6 баллов
    Стоит ещё отметить, что ни один гайд или программа, которые бы мне известны были, не до конца учитывают отображение монитора, и находимые разрешения не идеальны, хотя обычно несущественно. "Правильную" формулу для нахождения пропорций я показывал в посте здесь. Но там я не останавливался на этом. Распишу подробнее. Сначала говорю сразу. "Правильная" пропорция измерений — , где — ширина экрана в блоках, — высота. Возьмём экранчик 1×1. На рисунке сверху он схематически показан. Как видно, чёрная зона, в которой показываются символы, окружена рамкой. Во-первых, это голубая рамка снаружи, по которой можно судить об уровне монитора. Если мы примем длину и ширину блока равными 16 пикселей, то толщина голубой рамки составит два пикселя. Во-вторых, есть ещё одна рамочка. На рисунке она показана серым, хотя на деле она тоже чёрная. Её толщина — 0.25 пикселей. Вторая рамка появляется потому, что содержимое экрана дополнительно смещено внутрь от голубой рамочки на 0.25 пикселя. Таким образом, вместо 4 в формуле нужно использовать 2 × (2 + 0.25) = 4.5. В посте, про который я говорил, я рассчитывал оптимальное разрешение для экрана 8×3. График из него: Абсцисса — это разница между отношением сторон точки и нужным. Ордината — площадь в "квадратных символах" (w × h). Пропорция, которой мы добиваемся для данного сетапа, по формуле равна 494/87. Лидер на графике — 159×28. Его дельта равна ~0.000411. Она больше нуля, поэтому ширина будет забита полностью, но будет внутренняя чёрная рамка сверху и снизу. Дальше я подсчитал, что её толщина составит 1/27666 высоты внутренней области (чёрной зоны на картинке выше) — это ~0.000638 пикселя. То есть с безумной точностью всё сходится. А ниже я нарисовал график, но использовал формулу не "правильную", а ту, о которой знают больше. Разрешение 159×28, которое, вообще-то, больше всего подходит, не только имеет дельту в почти −0.05, но даже не кажется самым лучшим, затмеваемый 160×28. ...И всё-таки забавно, как много можно писать о том, как подобрать оптимальное разрешение экрана.
  31. 6 баллов
    Всем приветы. Программа-редактор для создания моделей 3dm на платформе андроид. Принцип как в редакторе МайнОСа, но с учетом невозможность использования ПКМ и колеса прокрутки. Скачать можно по этой ссылке: https://github.com/alexexe82/3dEditor/raw/master/MineCRED3d.apk В дальнейшем планирую расположить там же руководство по использованию, пока пробуйте разобраться сами) Можно спрашивать всякие вопросы, подскажу. Несколько скринов с интерфейсом.
  32. 6 баллов
    За пару часов написал вот такую программу. Позволяет подключить любое количество мфэх и табличек. Возможность горячего добавления или убирания мфэх или табличек во время работы программы. Вывод в процентах. Программа сама находит сторону, где находится табличка. Работает в фоне. Также если мфэх больше 4 штук, то на табличке идёт прокрутка по очереди всех мфэх. Обычная версия: Скачать: pastebin get mjF0Qw4x mfsu.lua Команды: mfsu - Запустить программу mfsu setSpeed mfsu/sign [количество] - Указать скорость Пример: mfsu setSpeed sign 2 - Данные на табличках будут обновляться каждые 2 секунды mfsu stop - Остановить обновление Версия для rc: Скачать: pastebin get mcvBWAfH /etc/rc.d/mfsu.lua Команды: rc mfsu start - Запустить программу rc mfsu setSpeed mfsu/sign [количество] - Указать скорость Пример: rc mfsu setSpeed sign 2 - Данные на табличках будут обновляться каждые 2 секунды rc mfsu stop - Остановить обновление и закрыть программу
  33. 6 баллов
    С небольшим запозданием, но я таки обновил сервер снова, и исправил все баги. Итак, теперь сервер постоянно обменивается с клиентами пингами. Это позволяет поддерживать соединение "в тонусе" и не давать ему отвалиться, как на TCP подключениях, так и на веб-клиенте. Для теста я держал соединение между веб-клиентом и программкой в эмуляторе OC открытым примерно два часа. Ничего не сломалось. Кроме того я добавил больше контроля над состоянием соединения. В веб клиенте фон будет загораться красным в случае проблем с соединением, так что это будет легко заметить и обновить страничку. В библиотеке для OpenOS добавились новые методы: server:ping(content[, timeout]), boolean - позволяет послать серверу Stem пинг. В качестве контента указываете любой кусок данных. Сервер должен будет его вернуть в точности чтобы подтвердить пинг. Метод блокирующий, ждет ответа от сервера вплоть до таймаута (который по дефолту 5 секунд). Возвращает true или false. server:isConnected(): boolean, error - проверка того, установлено ли подключение к серверу Stem. Если установлено, вернет true. Если не установлено - вернет nil и сообщение об ошибке. server:reconnect(): server, error - если что, этой командой можно переподключиться к серверу. Вернет ссылку на самого себя (объект server) в случае успеха. В случае ошибки, как водится, nil и строку с сообщением об ошибке. Подробный список команд можно полистать тут. Установить новую версию библиотеки можно по прежнему из Hel: hpm install stem Если библиотека уже была устанвлена, можно только обновить: hpm upgrade stem Если вы не пользуетесь Hel, то качайте по прямой ссылке: wget https://gitlab.com/UnicornFreedom/stem/raw/master/stem.lua
  34. 6 баллов
    ВНИМАНИЕ!!! ОБНОВЛЕНИЕ. Сервер STEM ночью был обновлен и перезагружен, всё что было к нему подключено - отключилось. Что нового? Новая веб-страничка. Теперь там появился веб-клиент. Мы можете подключиться к любому каналу и почитать, что там пишут. И даже написать самому. Конечно свободы там меньше чем если работать через OC напрямую - послать любые данные не получится, только UTF-8 текст. Но зато не надо писать код, а можно просто с сайтика всё отправлять. Кроме того, я отрефакторил внутреннюю структуру сервера, поменялось довольно много кода. Всё пока еще сырое, активное тестирование и сообщение о багах приветствуется. В ближайшие несколько дней буду фиксить баги и добавлять остальные обещаные плюшки, типа ping пакета.
  35. 6 баллов
    Маленький бонус к солярочкам: Железный сундучок на 32, алмазный на 64 слотика сразу. Раньше для максимально возможной прокачки пузика робота требовалось 4 апгрейда сундучка( к слову, робот "аппаратно" ограничен 64-мя слотиками) Но теперь не нужно пихать 4 ванильных сундучка, можно положить один алмазный сундучок и робот полностью апнут максимально по размеру инвентаря. Апгрейдики не особо дорогие в крафте, тир скорее всего установим 1-й в конфиге, максимум, это второй алмазке. Экономия слотиков роботов даст возможность напихать больше разнообразной начинки роботам при сборке.
  36. 6 баллов
    Уважаемые игроки! Просьба принять участие в тестировании Персонального загрузчика чанков (аддон для Opencomputers) на сервере EvilWorld, который работает только при онлайне хозяина. Апгрейд только для робота и дрона. На данный момент установлен лимит на одного игрока: 3 одновременно работающих загрузчика. Каждый загрузчик грузит область 3 на 3 чанка. Разработчик аддона: vx13 Все наблюдения и результаты по работе данного апгрейда просьба оставить в этом топике или на github разработчика.
  37. 6 баллов
  38. 6 баллов
    OpenPeripheral предоставляет мощный функционал по созданию собственных интерфейсов в виде очков дополненной реальности "Terminal Glasses". К сожалению, полного списка функционала и всех нюансов по работе с этими очками не найти. Присутствуют некоторые отрывки, небольшие видео с результатами работы и прочие поделки. Но! Спустя пару бессонных ночей, декомпилированного кода и трёх литров чая, удалось описать полный функционал этих очков. Основные возможности очков и периферии: Отображение геометрических объектов различной сложности и цветовой гаммы. Отображение текста. Отображение жидкостей и предметов. Взаимодействие с мышью/клавиатурой. Чтение сообщений чата. Специальные команды чата, не отображающиеся в нем. Возможность индивидуальной работы с каждым пользователем терминала. Установка очков в любой шлем. Возможности данных очков я опишу по разделам, в лучших традициях вики Для начала, определю некоторые понятия. Система терминальных очков состоит из трёх предметов: терминала, очков, беспроводной клавиатуры. Терминал является центром всей системы, через него происходит общение между компьютером и очками. Также он хранит все данные интерфейса и пользователей. На очки выводится вся графическая информация, а сами очки передают сообщения или команды чата на терминал. Беспроводная клавиатура позволяет дополнить всю систему, своей возможностью контроля элементов при помощи клавиатуры и мыши. Как выводить информацию на очки: local com = require("component") local opb = com.openperipheral_bridge -- Построение интерфейса происходит во внутреннем буффере терминала (он же мост). local text = opb.addText(10, 10, "", 0xffef7f) -- Создаем компонент "Текст". -- Его нужно создать только один раз, в остальное время можно обращаться по ссылке и изменять любой параметр. local counter = 0 while true do -- В качестве примера будет выводится счетчик секунд. text.setText(tostring(counter)) -- Обновляем текста компонента. opb.sync() -- Для отображения графики на экране, необходимо отправить буффер на очки. os.sleep(1) -- Ждем секунду и прибавляем счетчик. counter = counter+1 end API Перед тем как перейти к API, нужно знать: Color:number -- Число в формате TrueColor RGB (по умолчанию 0xffffff). Opacity:number -- Прозрачность, число от 0.0 до 1.0 (по умолчанию 1). Знак '?' -- Опциональный параметр/функция. События Строковые константы VerticalAlignment:[TOP, MIDDLE, BOTTOM] HorizontalAlignment:[LEFT, MIDDLE, RIGHT] GuiElement:[OVERLAY, PORTAL, HOTBAR, CROSSHAIRS, BOSS_HEALTH, HEALTH, ARMOR, FOOD, MOUNT_HEALTH, AIR, EXPERIENCE, JUMP_BAR, OBJECTIVES] Структуры данных Абстрактные объекты Графические объекты Объекты контроля Вот такая шпаргалка по очкам, надеюсь пригодится
  39. 5 баллов
    Вот что лично я думаю и как вижу ситуацию. Мод в целом мне нравится. Он атмосферный, но требует глубокой проработки для ровного геймплея. Но пока мы будем все это отлаживать, допиливать механизмы получения животных, лут, генерацию отравленных рек будем делать и переделывать, писать квесты для пустоши, рецепты под пустошь подгонять, пройдет еще неделя, а может месяц. А может вообще потом перехочется играть, мне так точно. Давайте так сделаем. Давайте просто играть в ОС и то что у нас есть. Поиграем, отладим всё, экономику отладим, шероховатости найдем, а параллельно в фоном режиме на форуме будем придумывать генерацию и новые моды в сборку для следующего вайпа спокойно. Мы сейчас поиграем 2-3 месяца, все всё скрафтят, построят свои лагодромы, и начнуть просить вайпнуть мир и что-то добавить. А у нас уже все готово будет (новая генерация, пару модиков на замену или добавление и тп.) Мне уже хочется просто тестить аддоны, которые написали Нео и vx13, а не реки генерить какие-то. Хочется просто запустить сервер и играть в ОС. И чтобы уже у нас был минисерверок уютный с ОС на форуме, где каждый может этот мод пощупать и применить роботов на сервере и какую-то свою программку, а заодно и повыживать и поиграть в пыщ пыщ.
  40. 5 баллов
    Всем иногда приходится получать реальное время в OC. Обычно я использую такой код: local fs = require("filesystem") local function getTime() local f = io.open("/tmp/time", "w") f:write("time") f:close() local timestamp = fs.lastModified("/tmp/time") / 1000 + 3600 * 3 --Умножаем на часовой пояс, в моём случае GMT +3 return os.date("%d.%m.%Y %H:%M:%S", timestamp) --Реальное время в формате День.Месяц.Год Час:Минута:Секунда end print(getTime) Тут всё просто и понятно. Открываем файл в (Это важно!) /tmpfs, записываем любое значение, и получаем метку времени последнего изменения файла. Про этот способ, наверное, уже все знают, и тем не менее. И тут недавно меня осенило. Я всегда знал, что эта файловая система есть и на голых компьютерах без ЖД, дронах. Но если /tmpfs есть даже у микроконтроллеров, зачем тянуть время с интернета? Предлагаю вот такой код: local filesystem = component.proxy(computer.tmpAddress()) local function getTime() local handle = filesystem.open("/time", "w") filesystem.write(handle, "time") filesystem.close(handle) local timestamp = filesystem.lastModified("/time") / 1000 + 3600 * 3 return os.date("%d.%m.%Y %H:%M:%S", timestamp) end Этот код будет работать на любом компьютере. Вывод - тянуть время с интернета не нужно - например так сделано у @Asior в теме с бинарными часами: Всё гениальное - просто. @Fingercomp предлагаю добавить этот код сюда https://fingercomp.gitbooks.io/oc-cookbook/content/lua/real-time.html Возможно, это я такой идиот, а все остальные использовали /tmpfs. Но надеюсь кому-то поможет.
  41. 5 баллов
    Вместо вступления: Я не считаю C-подобный синтаксис лучше синтаксиса lua и не буду заставлять вас переписывать все ваши программы на TypeScript! Я просто хочу поделится с вами альтернативой и рассказать про ее преимущества и недостатки. # Что такое TypeScript? TypeScript — язык программирования, представленный Microsoft в 2012 году и позиционируемый как средство разработки веб-приложений. Он создан для расширения JavaScript и он компилируется в JavaScript, но также существует инструмент для преобразования TypeScript кода в Lua. Вам может показаться, что этот транслятор крайне ограничен, но, поверьте мне, его возможности впечатляют. # Почему его стоит попробовать? Я сначала продемонстрирую некоторые возможности TypeScript графически, а потом подробно расскажу про установку и настройку необходимых инструментов. Я покажу вам далеко не все возможности TypeScript, а только самые основные и интересные. Из-за большого размера контент каждого раздела будет скрыт под спойлер. 1. Статический анализ 2. Автодополнение 3. ООП 4. Стандартная библиотека и возможности языка # Как это работает? Конечно же все не так просто. Компилятор просто так не узнает типы методов и полей объектов, с которыми мы будем работать. Для того, чтобы описать наше окружение необходимо написать так называемые файлы декларации или тайпинги. Хочу сразу вас обрадовать - это не ваша задача. Существует репозиторий с такими декларациями, в котором, на данный момент, существуют типы для большинства API и компонентов OpenOS и библиотеки GUI. От вас требуется только установить все необходимые инструменты и правильно их настроить. # Установка Редактор кода Вы можете использовать любой редактор кода с поддержкой TypeScript. Я рекомендую VSCode, который поддерживает его из коробки. NodeJS Он необходим нам для установки необходимых пакетов (он поставляется с пакетным менеджером npm) и для запуска транспилера. Вы можете скачать последнюю стабильную версию с официального сайта. Использование плагина для VSCode (рекомендуется): Создание проекта вручную: Для компиляции используйте команду npm run build. Сгенерированные lua файлы появятся в папке dist. # Что дальше? Дальше, если вас действительно заинтересовал TypeScript, вы можете подробнее ознакомиться с языком и транспилером. Ссылки на документацию я оставлю ниже. Прошу также отписаться в тему по поводу гайда, инструментов, тайпингов и вообще высказать ваше мнение. Гайд достаточно сырой и его необходимо будет доработать, надеюсь на вашу помощь. Кроме того, я постараюсь ответить на все ваши вопросы и помочь с решением проблем, возникших при установке, настройке и использовании. # Ссылки Официальный сайт и документация TypeScript (англ) Серия русских статей по TypeScript TypeScriptToLua Wiki (англ) Тайпинги
  42. 5 баллов
    Так как в планшете всего один слот для контейнера сменного компонента и при этом слотов для карт меньше чем для апгрейдов имеет смысл использовать контейнер для карт. Однако, это обычно лишает возможности использовать апгрейд навигации в произвольном месте: сменить в нем карту местности нельзя, не вытаскивая апгрейда. Для решения этой проблемы можно использовать эту небольшую загрузочную библиотеку. Установка pastebin get SHnEguTY /boot/05_navigation.lua Далее, если нужна навигация в области, выходящей за пределы карты апгрейда, устанавливаем в этой области путевую точку и называем ее(пкм) координатами через пробел. Обратите внимание, имя точки должно соответствовать координатам блока на который она указывает(см частицы) После этого апгрейд навигации будет опираться на первую попавшуюся путевую точку. Довольно удобно, прозрачно и не требует изменять имеющиеся программы. Спасибо @Fingercomp за инфу о путевых точках
  43. 5 баллов
    В сказке: слетел сокол с дуба, ударился оземь и обернулся добрым молодцем. В майне: слетел свин с дрона, ударился оземь и обернулся добрым холодцом.
  44. 5 баллов
    Всем привет. Сегодня вечером сделал довольно простенькую вещицу. Это недо-вирус(Сам себя не распространяет, запускает его злоумышленник) Вообще, если кто не в курсе - эта ошибка возникает у тех, кто хочет сэкономить, и покупает Xiaomi китайской версии(Т.е для продажи только для китайского рынка) и пытаются сделать её глобальной - и в итоге убивают прошивку. Что делает эта штука в OC - перетирает все файловые системы(ака rm -rf /), прошивает EEPROM и делает его ридонли. Запустить довольно просто - работает в MineOS, или OpenOS - запустите его в интерпретаторе, или еще где-нибудь. Код: Полная версия https://raw.githubusercontent.com/BrightYC/Other/master/full-virus.lua Минифицированная https://raw.githubusercontent.com/BrightYC/Other/master/minified-virus.lua
  45. 5 баллов
    Актуальность Раньше, чтобы обновить прошивку дрона или микроконтроллера нужно было записать прошивку на eeprom через компьютер, снять устройство, заменить eeprom через верстак поставить устройство Довольно геморно если устройств много или часто вносятся мелкие изменения во время разработки Решение Чтобы не демонтировать устройство можно отправлять ему прошивку по беспородной сетевой карте. Устройство в свою очередь принимает обнову и применяет ее. Использование Загружаем файлы из этой папки(wget) https://github.com/hohserg1/OpenComputersPrograms/tree/master/wireless_flash Прошиваем наш eeprom прошивкой wireless_flash_eeporm.lua и вставляем в устройство Копируем адрес сетевой карты устройства Запускаем устройство Вызов команды wireless_flash покажет usage Последний использованный адрес сетевой карты устройства запоминается Теперь можем быстро тестировать прошивки Программа пока не особо функциональна, но вполне юзабельна. При разработке ПО для дрона рекомендую юзать планшет. Какие фичи еще стоит добавить(наверное, я это сделаю): Сохранение принятой прошивки Получение текущей прошивки устройства Сохранение множества адресов беспроводных карт
  46. 5 баллов
  47. 5 баллов
    За пару минут написал вот такую вот программу: local component = require("component") local mfsu = require("component").mfsu local sign = require("component").sign print("MFSU Monitoring for OC") print("Using sign I/O Upgrade") os.sleep(2) print("Look at sign! :)") while true do energy = mfsu.getStored()..' EU' sign.setValue(1, energy) os.sleep(2) end Не судите строго т.к. это была программа которую я написал одной из первых для OC Для создания вам понадобиться: 1.Компьютер 2.Адаптер(x2) 3.MFSU 4.Табличка 5.Улучшение Sign I/O(которое надо установить в адаптер) Табличка должна быть установлена на адаптер(есть возможность настройки в коде программы путём изменения числа 1 на другое в строке sign.setValue(1, energy)
  48. 5 баллов
    Давным-давно делал модный файловый менеджер с графическим интерфейсом для опенкомпов. Переходы по папкам, запуск файлов, распаковака tarball'ов и просмотр картинок в одной программе, к тому же фичи в виде листания свайпами, экранной клавиатуры и горстки настроек. И все это добро занимало меньше килобайта. Но развивать идею не стал, код удалил и осталась только одна картинка тестовой версии. Недавно решил это дело возродить, без зависимостей и лишних свистоплясок. Для начала напишем функции, которые добавят дополнительные возможности для пользователя. Когда игрок тыкает в экран, создаются два события - touch и drop. Когда зажимает и тащит - touch, потом куча drag и в конце drop. Из имеющихся событий, можно развить дополнительные события - клик, двойной клик и свайп. Можно даже добавить сложные жесты, но пока не понятно, как они могут пригодиться. На все нужные события повесим слушателей и будем сохранять результат в переменную. Слушатель для события touch будет проверять, было ли предыдущее событие drop. Затем сравнит с временем от последнего клика, вычислит расстояние между точками, в которых произошло событие. При совпадении координат и заданным временем между кликами пошлет событие double_click. Для события drop надо проверить, было ли предыдущим touch и по тому же параметру скорости проверять время между событиями, чтобы не захватывать долгие нажатия. Если предыдущим событием было drag, то надо определить расстояние между началом и концом действия, вычислить угол и послать это все в виде события swipe. В итоге получится примерно такой код: local computer = require('computer') -- подгрузить обертку для uptime & pushSignal local event = require('event') -- подгрузить библиотеку событий local lastEvent = nil -- последнее действие local lastTouch = nil -- последнее касание local eventTime = nil -- время от последнего события local clickSpeed = 0.5 -- время, за которое совершается клик и дабл-клик event.listen('drag', function(...) lastEvent = {...} -- просто сохранить событие end) event.listen('touch', function(...) local e = {...} -- сохранить событие в таблицу if e[5] == 0 and lastEvent and lastEvent[1] == 'drop' then -- если нажата ЛКМ и предыдущее было drop if eventTime and computer.uptime()-eventTime < clickSpeed then -- если прошло меньше времени, чем задано if lastTouch and lastTouch[3]-e[3]+lastTouch[4]-e[4] == 0 then -- если координаты событий не отличаются computer.pushSignal('double_click', e[2], e[3], e[4], e[6]) -- послать дабл-клик с координатами end end lastTouch = e -- сохранить последнее касание end eventTime = computer.uptime() -- обновить таймштамп события lastEvent = e -- сохранить событие end) event.listen('drop', function(...) local e = {...} -- сохранить событие в таблицу if e[5] == 0 and lastEvent then -- если нажата ЛКМ if lastEvent[1] == 'touch' then -- если предыдущее событие было касанием if eventTime and computer.uptime()-eventTime < clickSpeed then -- если прошло меньше времени, чем задано computer.pushSignal('click', e[2], e[3], e[4], e[6]) -- послать клик с координатами end elseif lastEvent[1] == 'drag' then -- если предыдущее было тасканием local dx, dy = lastTouch[3]-e[3], lastTouch[4]-e[4] -- найти дельту до координат касания computer.pushSignal('swipe', e[2], dx, dy, math.floor(math.deg(math.atan(dx/dy))), e[6]) -- послать свайп с дельтой и углом end end eventTime = computer.uptime() -- обновить таймштамп события lastEvent = e -- сохранить событие end) Пока он ничего не делает, только создает события, когда будет готов функционал отрисовки и взаимодействия с файловой системой, добавим к этим слушателям управляющие функции.
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...