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

Блоги

Популярные записи

  • Totoro

    Запускаем дронов!

    Автор: Totoro

    Дроны - как керосин. Они есть везде. Еще года два назад это было просто еще одно интересное видео на Ютубе. Год назад они вдруг оказались в интернет магазинах. Затем просочились в рекламу на ТВ, и вот теперь - они есть и в OpenComputers! Пришла пора с ними разобраться.   1. Матчасть Дрон, в данном случае - квадрокоптер, это беспилотный летающий аппарат, приводимый в движение двумя парами горизонтальных винтов. Приостановливая вращение винтов с одного боку, дрон двигается в сторону (стрейф). Эти винты вращаются в разном направлении (два - по часовой срелке и два - против), за счет чего дрон не нуждается в стабилизирующем хвостовом пропеллере (как вертолет). За счет этого же он и разворачивается в воздухе, замедлив вращение однонаправленной пары винтов. Дрон обладает небольшой массой, для экономии энергии, которой у него не много (на 10-30 минут полета в среднем). (с) Википедия   2. Дроны и OpenComputers Приблизительное изображение дрона в OpenComputers =): В мире Майнкрафта дрон представляет из себя "сущность" (Entity). Это значит, что он обладает возможностями мобов Майнкрафта. (В то время как робот - это блок.) Его можно сдвинуть с места толкая. Он умеет пролетать сквозь двери и калитки (в отличии от робота). Он движется не последовательно, из блока в блок, а из точки в точку. Причем маршрут может лежать по диагонали.   Конечно, движется он по кратчайшей линии, и если на пути окажется стена - дрон столкнется с нею.   Программирование дрона как две капли воды похоже на программирование микроконтроллера. Вы точно так же записываете программу на EEPROM, и при необходимости меняете ее на верстаке. Только в отличии от контроллера, вам становится доступен новый компонент: drone.   Подробнее об командах дрона можно узнать здесь: OpenComputers/Дрон. (Или здесь: ocdoc.wiki (англ.))   3. План Нужна какая-нибудь несложная задача, для целей эксперимента. Используем программку send из предыдущего поста, для удаленного управления. Зальем ее на планшет. А дрон пусть... носит свиней. Будем оригинальными и непоследовательными.     1. Команда 'add X Y Z Name From'. Добавляем точку Name к маршруту, цепляя ее к точке From. Зададим дрону последовательность точек, которые образуют граф - безопасные маршруты. 2. Команда 'catch' - дрон ловит свинью. 3. Команда 'drop' - дрон выпускает свинью. 4. Команда 'to X' - дрон летит в точку Х.   Для начала не будем особо заморачиваться с графом маршрутов. Это будет простое неориентированное дерево. Примерно такое:   4. Строим полигон Построим что-нибудь подходящее для тестов. Отметим ключевые точки будущего графа красными блоками. А синий блок - будет стартовой площадкой дрона.           Поскольку я играю без модов на энергию, мой планшет и дрон будут работать вечно. И я не заморачиваюсь станцией подзарядки.   Иначе, к схеме выше было бы необходимо добавить станцию, где дрон мог бы зарядить аккумулятор.     5. Пишем программу Скрипт для удаленного управления скопипастим из прошлого поста, подправим, чтобы умела отправлять несколько переменных и зальем на планшетик, для удобства. (Для этого, соберите планшет - не забудьте клавиатуру и видеокарту! - положите его в зарядник и запустите с подключенного компа команду install. Укажите адрес винчестера планшета - и все, что было у вас на компе автоматически загрузится в планшет, включая даже ваши собственные программы.) local com = require('component')local modem = com.modemlocal args = {...}modem.broadcast(27, table.unpack(args))io.write("Message: ")print(table.unpack(args)) Далее - более сложная часть. Программа дрона. Программа предназначена для EEPROM. Значит соблюдаем те же правила: используем computer, component и API имеющихся у дрона компонентов. Включая его родной компонент drone. В нашем случае, дрон вооружен апргейдом-лассо (leash) и беспроводной сетевой картой (modem) для связи.   Стоит отметить, что процесс отладки программы (по крайней мере в текущем билде мода) достаточно неудобен. В случае ошибки дрон отказывается включиться, издав тонкий писк, и не выводя никакой информации. Получить отчет об ошибке при помощи анализатора не выйдет - ведь Shift+ПКМ просто снимает дрона. Автор обещал в скором времени это исправить. Ну а пока - помучаемся.   Отредактировать чип в стороннем редакторе, не вынимая его из дрона тоже не выйдет. В отличии от файловых систем, которые имеют удобную папку вида /saves/World/opencomputers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/, чипы EEPROM хранят свой код в NBT тегах предмета. Этим же обусловлено и ограничение размера кода в 4 килобайта.   5.1. Основная часть Это цикл который ждет указаний, а затем запускает соответствующую функцию. drone = component.proxy(component.list("drone")())modem = component.proxy(component.list("modem")())leash = component.proxy(component.list("leash")())modem.open(27)route = {}path = {}current = ""while true do name, _, sender, _, _, message, x, y, z, point, from = computer.pullSignal(1) if name == "modem_message" then if message == 'add' then add(tonumber(x), tonumber(y), tonumber(z), point, from) if current == "" then current = point end elseif message == 'to' then to(x) elseif message == 'catch' then catch() elseif message == 'drop' then drop() end end if #path > 0 and drone.getOffset() < 1 then drone.move(route[path[#path]].x-route[current].x, route[path[#path]].y-route[current].y, route[path[#path]].z-route[current].z) current = path[#path] path[#path] = nil endendmodem.close() Чтобы облегчить себе жизнь (и тестирование bios), вы можете сделать так: напишите заглушку для компонента drone (и других, если надо), вроде этой: http://pastebin.com/EVYzN5Bj Просто скопируйте в папку на компьютере, где вы пишете программу для дрона. Затем измените первые строки программы следующим образом: component = require('component')computer = require('computer')drone = require('drone')modem = component.modem-- leash = component.proxy(component.list("leash")()) Затем добавьте в цикл условие выхода по нажатию кнопки: if name == 'key_down' then break end И вы можете просто запустить вашу программу для дрона на компьютере. Разумеется полноценной эмуляцией дрона тут и не пахнет, зато очень удобно отслеживать глупые синтаксические и логические ошибки.     Как устроен код основного цикла? Переменная route - хранит таблицу "вейпоинтов" (waypoints). Это вершины графа и информация о связях между ними. Переменная path - хранит путь от текущей вершины до цели. Переменная current - отмечает текущее местоположение дрона в графе.   В цикле мы читаем получаемые сообщения и вызываем соответствующие функции. Первая переданная вершина считается дроном текущей.   Во второй части цикла происходит проверка. Если путь до цели - не пуст (это значит, что дрону надо куда-то лететь) и дрон уже долетел до текущей вершины (getOffset()), то программа берет следующую вершину из path, отправляет дрона к ней и объявляет ее текущей.   5.2. Функции-команды Теперь последовательно добавим функции для каждой команды. function add(x, y, z, name, from) route[name] = {x=x, y=y, z=z, link = {}} if from ~= nil then if route[name] == nil or route[from] == nil then drone.setStatusText("Error!") else table.insert(route[name].link, from) table.insert(route[from].link, name) end endend Тут все просто. Пишем вершину в список. Если он связана с другой вершиной (from ~= nil), то в специальную табличку link заносим две связи: из name в from, и из from в name. function search(target, point, prev) for key, name in pairs(route[point].link) do if name == target then table.insert(path, point) return true end end for key, name in pairs(route[point].link) do if name ~= prev then if search(target, name, point) then table.insert(path, point) return true end end end return falseendfunction to(name) path = {} table.insert(path, name) search(name, current)end Функция to обнуляет старый путь (на всякий случай), затем вставляет в него цель пути (name) и запускает функцию search, которая рекурсивно ищет и записывает остальные промежуточные вершины на маршруте от name до current (текущей локации). Функция search сделана достаточно примитивно (возможно вы предложите более эффективный способ?). Поскольку мы договорились, в целях упрощения использовать граф-дерево (не содержаший петель), от любой точки к другой существует один и только один маршрут, который функция и находит перебором связанных вершин. function catch() for c = 2, 5 do if leash.leash(c) then return true end end return falseendfunction drop() leash.unleash()end Тут все элементарно.   6. Подготовка Пишем программу на дрона, заряжаем планшет и выдвигаемся в зону действий. Дрона ставим на синий куб (стартовая площадка) и включаем.     После уточнения на местности, составляем карту вейпоинтов и строим на бумажке будущий граф:   Для каждого загона добавлены две точки - name и name_up. Основные "трассы" дрона лежат на высоте в 6 блоков. А в каждом загоне спускаются к земле. (Чтобы заарканить животное, выстреливая лассо вбок, дрону желательно находиться на одном уровне с жертвой).   С планшета вносим координаты в память дрона. Примерно так:     Главное - не ошибиться. Т.к. в код не была добавлена защита "от дурака" =) Алгоритм позволяет добавлять вершину "на лету". В любой момент вы можете добавить еще одну ветку к схеме.   Теперь все готово к тесту.   7. Запуск Все готово. Проверим, как он двигается. Введем send to sheeps в консоль планшета. Дрон уверенно поднимается в воздух и опускается в загоне в овцами.   Теперь введем send to pigs. Функция search снова вычислит путь и робот переместится в указанную вершину:     Функции catch и drop тоже работают штатно =)     Хотя и не лишены некоторых глюков (ведь физика веревки не просчитывается):     8. Итоги а) Дрон - любопытная штуковина. б) Полный код прошивки. использованный в этом посте - здесь: http://pastebin.com/Cy1UR6vy в) Навигация по вейпоинтам - интересный и очень распространенный способ организации сложного движения. Схему можно усложнить - опционально добавлять только одну связь в таблицу link - тогда получатся ребра с односторонним движением. Добавить петли, оптимизировать поиск кратчайшего пути. Еще можно облегчить правление дроном - хранить все команды для конкретной задачи в виде файла-скрипта, который запускать одной командой и т.д.   Enjoy!
    • 19 комментариев
    • 13 668 просмотров
  • SDV

    Основы защиты построек от робогрифа

    Автор: SDV

    Данная статья написана в целях защиты от робогриферства, а также рассказаны основы строительства безопасного жилища.
    Под спойлером находится скриншот на котором изображено типичное примитивное строение, в простонародье называемое "коробка".

    На изображении указаны самые основные уязвимые места, которые используют гриферы для осуществления робогрифа.
    Обо всех этих местах и способах защиты я расскажу ниже.       Ветрогенератор
    Наверное самый ненадежный и уязвимый механизм (после солн.панели), которого можно лишиться в один счет.
    Уязвимость связана с тем, что данный блок невозможно никак скрыть от робота.
    При попытке обложить его любыми блоками, ветрогенератор автоматически отказывается работать с ошибкой "Нет места для ротора".
    То есть даже если вы полностью его закроете блоками он работать не будет, для него самое главное это лицевая часть где ротор, а она как известно самое открытое и уязвимое место.
    Робот без труда может подлететь к нему и ключом из IC2 спокойно снять. При желании гриферы также снимают с проводов и кинетические генераторы к ним.
    Способы защиты от грифа: к сожалению нет ничего. как вариант использовать альтернативу в виде солн.панели. Под это же правило входит и гидрогенератор и другие механизмы, которые можно снять ключом из IC2.       Солнечная панель
    Более защищенный генератор энергии, чем ветрогенератор. Но при условии того, что солн.панель должна быть прикрыта сверху (и с других сторон тоже каким-нибудь блоком) стеклом.
    Напомню механику ванильного майнкрафта: стекло является прозрачным блоком, а следовательно при установке его поверх солн.панели он пропускает через себя весь свет, как если бы солн.панель просто стояла неприкрытой к небу.
    А следовательно солн.панель будет получать полный уровень освещенности, не теряя ни 1 единицы с блоком стекла наверху.
    А для робота уже будет проблематично снять такую солн.панель, т.к. для него является препятствием блок стекла и политикой плагина привата робот, как и человек не может сломать в чужом привате никакие блоки.
    Способы защиты от грифа: установка поверх панели блока стекла (любого цвета можно даже), а также солн.панель не должна иметь с сбоков (или снизу) пустого пространства (пустых блоков), в который может переместиться робот и спокойно снять панель.       Дырки в оконных проемах
    Самая распространенная ошибка при строительстве у игроков. т.к. если даже оставить в стене даже одну дырку (1 блок), то робот может беспрепятственно в нее уместиться и посетить ваше жилище.
    А это чревато тем, что робот может "обчистить" ваши сундуки, а также открыть дверь и впустить внутрь грифера, чтобы ему было удобнее управлять роботом.
    Способы защиты от грифа: ВСЕГДА закрывать дырки и проходы, если нет на данный момент нужного материала (стекла,прутья и т.п.), то нужно хотя бы эти дырки залатать обычными плитами (деревянными, из булыжника, камня и т.п.).
    Тем самым дырка будет уже не равна 1 блоку, а 0,5, а это уже мало для прохода роботу.       Ванильные двери
    Как я уже сказал ранее, если в постройке есть дырки, то робот может спокойно заехать в жилище и открыть дверь.
    НО, если будет установлена дверь не из ванильного майнкрафта (не деревянная ID 324 и не железная ID 330), а например дверь из мода OpenSecurity.
    То обычным сигналом редстоуна ее не открыть (необходим контроллер двери), а как известно роботы не могут взаимодействовать с внешними компонентами, поэтому "подключиться" к контроллеру двери он не сможет никаким образом.
    Но если у вас нет пока ресурсов на такую дверь и контроллер, то не переживайте, просто робот не сможет проехать в проем двери, даже если стоит 2 двери. Т.к. двери (предмет) даже открытыми являются 1 блоком, то в этот блок робот не может пройти.
    Способы защиты от грифа: желательно не ставить ванильные двери (дверь из IC2 тоже открывается на редстоун сигнал), по возможности использовать дверь из мода OpenSecurity.
    Но даже если и стоит обычная дверь, то ничего страшного не будет. Игрок конечно сможет пройти в нее, но это лишь дает ему больший обзор пространства и ничего больше (сам снять что-то или "пошариться" по сундукам он не сможет).       Прочие открытые проемы и спуски
    Тоже одна из главных ошибок игроков, когда они делают возле своего дома различные спуски в шахту и т.п.
    А если этот спуск каким-то образом взаимосвязан с входом в дом (например из подвала в дом), то возможен вход через них робота.
    Способы защиты от грифа: не делать различные спуски и проходы возле своего дома, а если и делаете, то не соединяйте их с проходами, подъемами в дом.       Сундуки на территории привата
    Очередная больная тема по поводу сундуков. Многие игроки (в основном начинающие) оставляют сундуки прямо на территории привата, при этом они находятся в открытом доступе для робота.
    В результате чего сундуки могут быть опустошены, а отследить кто это сделал невозможно.
    Способы защиты от грифа: не оставляйте сундуки на открытом пространстве, по возможности располагайте их в недоступном для робота месте.
    Самые ценные ресурсы (алмазы, изумруды, иридий и т.п.) храните не в обычных сундуках, а в эндер-сундуках.
    В отличии от обычных сундуков, роботы не смогут вытащить предметы из эндер-сундука.
    Причина тому, что эндер-сундуки индивидуальны для всех, то есть если для вас эндер-сундук виден вам с вашим содержимым и вашим ником, то для робота эндер-сундук уже свой, со своим именем (робота) и своим инвентарем.
    В общем думаю Вы поняли про что я имею ввиду. Просто запомните, что эндер-сундуки недоступны для роботов.  
    UPD от 19 марта: @Fingercomp подсказал мне, что в якорный сундук из мода Ganys Mod робот также может проникнуть и извлечь все вещи.
    Стоит об этом тоже позаботиться и не ставить в самое видное и удобное место для робота.   Вот на этом я закончу статью.
    Думаю я расписал самые возможные уязвимости и места в постройках игроков.
    Не совершайте подобных ошибок, стройтесь правильно с умом и не будьте жертвами робогрифа.   Если я что-то пропустил или у Вас есть еще варианты того, что может быть объектом для грифа - оставляйте в комментариях эти предложения.
    • 1 комментарий
    • 269 просмотров
  • NEO

    Реализация идеи от товарища Zer0Galaxy, а именно телепортация между компьютерами.

    Автор: NEO

    Вчера уважаемый форумчанин Zer0Galaxy предложил идею как можно телепортировать между компьютерами, без необходимости находится конечному телепортеру в одной сети(Как компоненты), можете смотреть видео ниже.
    https://www.youtube.com/watch?v=e530frIKUGc
    • 13 комментариев
    • 1 861 просмотр
  • Krutoy

    Пишу браузер-арбузер

    Автор: Krutoy

    Новости! Теперь мой браузер будет называться "Арбузер", и будет выполнен в зеленоватых тонах.
    Zer0Galaxy мне помогает, и уже набросал парсинг и поиск по самым простым селекторам в CSS. Думаю, ему для полной работы с CSS нужно будет написать еще разов в 6 больше кода.
    Готовы первые наброски самого браузера без страниц. Закладки, навигация, строка пути.
    Кстати, вы можете посмотреть эмулятор экрана компьютера из OC, который можно открыть в браузере и даже посмотреть исходный код.     Ядро написано примерно на 15% пока что. В следующий раз буду отрисовывать элементы страниц, подгружая их стили.
    • 18 комментариев
    • 3 046 просмотров
  • Quant

    Аналоговый рэдстоун-передатчик файлов

    Автор: Quant

    Аналоговый передатчик
    Файлов по рэдстоуну
    Возвращение легенды)
    Некоторые помнят мою передавалку чисел по рэдстоуну...
    Но чисел мало...
    Но теперь скорость настолько большая,что можно передавать даже файлы!
    Конструкция осталась такой,какой была и раньше:

    Зато изменились протокол передачи и программа)
    Краткая характеристика:
    Поддержка юникода +
    Скорсть передачи байта от 0,1 до 0,3 секунд

    Посмотреть код:
     
    • 9 комментариев
    • 1 715 просмотров
×