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

Таблица лидеров


Популярные публикации

Отображаются публикации с наибольшей репутацией начиная с 01.05.2014 во всех областях

  1. 22 балла
    Как собрать робота в 5 шагов (инструкция для самых маленьких) Абстрактное описание сборки робота я уже писал много раз, поэтому это будет короткое руководство на конкретном примере. Соберем и запустим Totoro Recursive Miner. Шаг 1. Подготовка Для создания робота нам потребуется сборщик (assembler). Чтобы он работал - подведите питание. Сборка робота потребует некоторого времени (примерно 5 минут) и энергозатрат. Шаг 2. Подбор железа Запчасти делятся на обязательные и необязательные. Детали обязательные: 1) Корпус Основа робота. Без него никуда. Для TRMiner нужен корпус 2+ уровня, потому что он должен содержать апгрейд-генератор. 2) Процессор Мощность процессора определяет количество выполняемых роботом операций в такт. Т.е. проще говоря - скорость его работы. Однако перемещаться быстрее робот не станет. Этот параметр можно улучшить "прокачав" робота (см. апгрейд-опыт). 3) Память Практика показала, что одной планки 1 уровня для нормальной работы на компьютере недостаточно. TRMiner хранит в памяти данные о жилах руды, поэтому требует как минимум две планки уровня 1.5. При меньшем количестве корректную работу не гарантирую. (Хотя возможно он будет работать.) 4) Монитор Достаточно 1 уровня. Робот не поддерживает цветные экраны. (Можно собрать робота и без экрана. Но это - для любителей хардкора.) 5) Видеокарта Также достаточно 1-го уровня. Требуется для вывода изображения на монитор. Без нее монитор будет просто черным. 6) Клавиатура Чтобы иметь возможность набрать что-то в консоли. 7) Дисковод Для установки OpenOS и копирования программы TRMiner. (Любители хардкора могут попробовать запустить робота без дисковода. Это возможно. Но я не скажу как :P ) 8) Жесткий диск Для хранения ОСи и программы. Первоэтапный диск в 1Мб хватит с головой. Это даже много. Будет занято ~20%. 9) Lua BIOS Этот чип нужен для корректной работы OpenOS. Крафтится из пустого EERPOM и книги. Детали обязательные для Totoro Recursive Miner: 10) Апгрейд-инвентарь. Робот хранит в нем добытую руду. Рекомендуется установить 2 или 3 апгрейда (т.е. 32 или 48 слотов). Больше можно не ставить, ибо обычный сундук, в который робот сбрасывает добычу имеет размер в 27 слотов. 11) Апгрейд-генератор. Нужен роботу для непрерывной работы. Робот будет сам заряжаться с его помощью, сжигая часть добытого угля. (Любители хардкора могу не ставить генератор. Программа будет работать. Вы можете заряжать робот таская за ним заряжающее устройство, или приделав пару солнечных панелей и выкопав вертикальный колодец до поверхности. ) Детали необязательные: 12) Апгрейд-опыт Позволит роботу прокачиваться во время добычи. Со временем он станет быстрее двигаться, меньше тратить энергию и медленнее ломать свой инструмент. Требует Корпуса 3-его уровня. 13) Апгрейд-батарея Ну тут все понятно. Увеличивает емкость аккумулятора. Полезная штука. Детали вредные (эксклюзив для IT 1.7.10): 14) Апгрейд-чанклоадер После включения робота, в момент опустошит его аккумулятор. На том все и закончится. Вот две рабочие конфигурации: Минимальная Рекомендуемая (UPD.: Тут уважаемый Krutoy любезно предоставил картинку, которая иллюстрирует, сколько всего ресурсов у вас уйдет на сборку рекомендуемой конфигурации робота: За что ему большое спасибо.) Уложите выбранные детали в сборщик и запускайте процесс. Шаг 3. Софт Раздобудьте дискету с OpenOS (крафтится из чистой дискеты и книги). Скачайте программу Totoro Recursive Miner на другую, чистую дискету. http://pastebin.com/L21VMm7S Для этого этапа нам потребуется компьютер. Свой или соседа, все равно. Он должен иметь выход в интернет (интернет-плата) и дисковод для дискет. Как скачать программу на новую дискету: 1) Вставить дискету 2) Посмотреть в инвентаре ее адрес. Запомнить первые его буквы-цифры. 3) Написать в консоли команду: label -a xxxx floppy Где xxxx - первые буквы-цифры ее адреса, а floppy - это будущее название (этикетка). В результате ваша дискета получит короткое и ясное название. 4) Написать команды: mount floppy fcd /f В результате вы окажетесь в корневом каталоге дискеты. 5) Скачать программу TRMiner: pastebin get L21VMm7S mine Для этого нужна интернет-плата. Программа будет сохранена на дискету под именем mine. 6) Извлеките дискету. (Также можно поискать игрока с ником Totoro и подоставать его, чтобы дал дискету с программой нахаляву. Тогда и компьютер не нужен.) Шаг 4. Установка Поставьте робота. Можно прямо на месте предполагаемой добычи руды. Чтоб два раза не ходить. Включите его и установите OpenOS (это надо сделать только один раз). Как установить OpenOS: 1) Вставить в робота зеленую дискету. 2) Включить его. 3) Написать в консоли: install 4) Он спросит на какой жесткий диск устанавливать. Напишите 1. 5) Согласитесь на рестарт (y). Теперь сбросьте программу TRMiner с дискеты на жесткий диск робота. (Можно каждый раз вставлять дискету и запускать программу прямо с нее, но это лишние действия. Зачем оно нам?) Как сбросить программу с дискеты: 1) Вставить дискету с программой в робота. 2) Убедиться, что он включен. 3) Написать в консоли робота: mount floppy fcp f/mine mine 4) Достать дискету. Все! Софт установлен. Дискеты больше в принципе не нужны. Но сохраните их на всякий случай. Шаг 4A. Настройка программы (необязательно) Для настройки программы Totoro Recursive Miner, введите в консоль команду: edit mine В двадцатой строке вы увидите константы набранные заглавными буквами: TECH_SLOTS = 6VANILLA_CHEST = truePATHWAYS = trueDROP_TRASH = false TECH_SLOTS - количество слотов с образцами "пустой породы" и сундуками. То есть тех слотов, которые не будут заняты добычей. VANILLA_CHEST - режим для работы с обычными сундуками. Есть возможность работать с сундуком Эндера. Для этого, установите константу в значение false и дайте роботу инструмент с зачарованием "Шелковое касание". В слот с сундуками положите один сундук Эндера. PATHWAYS - если true, робот проделает в шахте дорожки, для удобства хождения игрока DROP_TRASH - если true, робот будет выбрасывать булыжник и другую "пустую породу". После изменения констант, нажмите клавиши Ctrl+S (сохранение) и Ctrl+W (выход). Шаг 5. Добыча полезных ископаемых Принесите робота на место предполагаемой шахты. Поставьте робота в ее воображаемый правый передний угол, передней стороной вперед. Вот так: В инвентаре робота разложите образцы пустой породы (5 штук по дефолту). Причем (лайфхак для ускорения работы робота), кладите в порядке убывания распространенности. У меня это камень-земля-гравий-булыжник-камень Бездны (abyssal stone из RailCraft). В последний из технических слотов (6-ой по дефолту) положите сундуки (или сундук Эндера, если вы перенастроили программу). Роботу в "руку" положите кирку или бур. Чем прочнее и острее - тем лучше. Теперь включите. Введите в консоль команду такого формата: mine <длина> [ширина] [возвращаться_в_начало] Первые два параметра - числовые. Последний - true/false (Если не указать, равен false). Ура! Наконец все ездит, копает и складывает без нашего участия. Остается только иногда менять кирку. И уносить добычу. Enjoy!
  2. 20 баллов
    Дроны - как керосин. Они есть везде. Еще года два назад это было просто еще одно интересное видео на Ютубе. Год назад они вдруг оказались в интернет магазинах. Затем просочились в рекламу на ТВ, и вот теперь - они есть и в 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!
  3. 10 баллов
    Трехмерная печать в Minecraft (инструкции для самых маленьких) Начиная с версии 1.5.4, в OpenComputers появляется интересный девайс - трехмерный принтер. Он дает возможность печатать декоративные блоки любой формы и цвета. Причем не только статичные блоки, но и двери/люки, кнопки и рычаги! Давайте рассмотрим, для чего он может пригодиться, и как именно с ним работать. 1. Цель Как и в предыдущих гайдах, первым делом поставим себе цель. Мы будем создавать стенную плитку со сквозным орнаментом, в виде морды крипера. Я не буду приводить в этом гайде рецепты предметов, так как их легко найти в NEI, или в статьях на gamepedia. 2. Обзор принтера 3D-принтер - это периферическое устройство, которое должно быть подключено к работающему компьютеру. Оно представляет собой блок, с двумя внутренними слотами: Верхний слот предназначен для специальной печатной массы (изготовляется из редстоуна, гравия, древесного угля и воды). Принтер вмещает два стека печатной массы (256 000 ед). Нижний слот занимает картридж с красителями. Объем внутреннего хранилища - два картриджа краски (100 000 ед). По команде от компьютера, принтер берет немного печатной массы и краски и "распечатывает" в крайний правый слот запрограммированную модель. На модель из этого гайда, состоящую из 21 фигуры, принтер потратил 424 единицы массы и 314 единиц краски. 3. Отпечатанный блок Модель для печати задается в виде списка "фигур" - параллелепипедов. Каждая фигура отмечена координатами противоположных углов. Она имеет свою текстуру, цвет оттенка (если необходимо) а также состояние (true/false). Максимальное количество фигур в модели - 24, по умолчанию. Координаты блока тремя числами (X, Y, Z) в пределах от 0 до 16. Блок может переключать свое состояние, когда игрок кликает по нему правой кнопкой мыши, или на блок подается сигнал редстоуна. По умолчанию блок имеет форму, заданную блоками с состоянием false, и сменяет ее на форму из блоков с состоянием true, при активации. Кроме того блок имеет несколько дополнительных общих флагов, которые определяют его название, описание и некоторые другие параметры. 4. Программирование принтера Есть два способа распечатать свою модель. Через компонент принтера и прямое управление, либо при помощи стардартной программки print3d от Сангара. 4.1 Компонент принтера Подключение принтера ничем не отличается от подключения любого другого устройства: local com = require('component')local printer = com.printer3d Компонент предоставляет набор функций для управления: reset() - сброс настроек и остановка печати setLabel(value:string) - задаем название будущего блока getLabel():string - получаем текущее название setTooltip(value:string) - задаем описание блока getTooltip():string - получаем описание setRedstoneEmitter(value:boolean) - определяет, излучает ли блок сигнал редстоуна в активированном состоянии isRedstoneEmitter():boolean - возвращает true, если блок излучает сигнал в активном состоянии setButtonMode(value:boolean) - определяем поведение блока при активации. Если true, то блок автоматически возвращается в неактивное состояние через несколько секунд после активации (как кнопка) isButtonMode():boolean - возвращает true, если блок находится в режиме "кнопки" addShape(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number, texture:string[, state:boolean=false][,tint:number]) - добавляет новую "фигуру" к форме блока. Фигура задана координатами. texture - название текстуры, state - для какого состояния фигура предназначена, tint - цвет оттенка фигуры getShapeCount():number - возвращает количество фигур в модели getMaxShapeCount():number - возвращает максимально возможное количество фигур commit([count:number]) - посылает принтеру текущую конфигурацию и начинает печать (count - количество копий, если не задано - равно 1) status(): string, number or boolean - возвращает состояние принтера - "buzy" и процент готовности, или "idle" и готовность предмета (true/false). 4.2 Программа print3d Код программы не включен в мод по умолчанию, поэтому его надо скачать из интернета. Последнюю версию можно найти на ГитХабе автора: https://github.com/OpenPrograms/Sangar-Programs/blob/master/print3d.lua Либо скачать с Pastebin: http://pastebin.com/b5rD8KcY (поставьте интернет-плату, и наберите в консоли компьютера команду pastebin get b5rD8KcY print3d) Эта программа по сути, читает параметры модели из текстового файла и передает принтеру. Формат вызова программы: print3d FILE [count] Где FILE - название файла с моделью, а необязательный параметр count - количество копий модели. Модели имеют простой формат - все параметры записываются в таблицу, по аналогии с Луа. Вот образец файла с моделью. { -- Это - название модели. Т.е. название будущего блока, которое будет видно -- в инвентаре и подсказке Waila. Название по умолчанию - "3D Print" label = "Example Model", -- Это описание предмета, такое, как будет видно в инвентаре. Если не задано, -- предмет не будет иметь описания tooltip = "Это демонстрационная модель, показывающая все возможности", emitRedstone = false, --[[ Если этот параметр равен false, блок работает как дверь, сменяя свое состояние при сигнале редстоуна. Если параметр равен true, блок работает как кнопка или рычаг - излучая сигнал при смене состояния. При этом блок не реагирует на сторонний сигнал. По умолчанию параметр равен false. ]] buttonMode = false, --[[ Если этот параметр равен false, модель работает как дверь или рычаг - то есть остается в том состоянии, в которое установлен игроком. Если параметр равен true, модель автоматически возвращается в неактивное состояние через несколько секунд после активации. По умолчанию параметр равен false. ]] -- Это список фигур модели, которые определяют, как она выглядит. -- Модель должна содержать как минимум одну фигуру (параллелепипед) -- в неактивном состоянии. -- Фигуры не могут быть "плоскими" т.е. не иметь объема. -- Каждая фигура задана шестью числами: minX, minY, minZ, maxX, maxY, maxZ. -- (Координаты двух противоположных углов.) -- Если смотреть спереди, ось X направлена вправо, ось Y - вверх и ось Z - вглубь. -- Дополнительно, каждая фигура длолжна обладать текстурой. Для того чтобы -- определить название текстуры, вы можете воспользоваться Определителем Текстуры -- (Texture Picker), кликнув им по нужному блоку. -- -- Модель имеет два состояния - неактивное (false, состояние по-умолчанию) -- и активное (true, состояние после активации блока). shapes = { -- Фигура идет от точки <0, 0, 0> (левый нижний угол) до <8, 8, 8> (середина), -- и имеет текстуру блока лазурита. { 0, 0, 0, 8, 8, 8, texture = "lapis_block" }, -- Фигура идет из точки <8, 8, 8> (середина) в <16, 16, 16> (правый верхний угол), -- и закрашена текстурой дубовой листвы. Фигура принадлежит активному состоянию -- модели и имеет светло-зеленый оттенок. { 8, 8, 8, 16, 16, 16, texture = "leaves_oak", state = true, tint = 0x48B518 } }} Т.е. описание модели просто содержит перечень всех тех параметров, которые задаются при помощи компонента, и список фигур из которых модель состоит. Набор тестовых моделей для изучения, можно найти здесь: https://github.com/OpenPrograms/Sangar-Programs/tree/master/models 5. Проектирование модели Разобьем мысленно рисунок запланированной модели на параллелепипеды. Она будет представлять собой тонкую плитку посередине блока, наподобие стекла или решетки. Руководствуясь сеткой координат и образцом выше, составим описание модели для текстового файла: { label = "Плитка 'Морда крипера'", emitRedstone = true, buttonMode = false, tooltip = "Секретный рычаг в виде головы крипера" shapes={ {0,14,7, 16,16,9, texture="quartz_block_side", tint=0x8eb200}, {0,2,7, 2,14,9, texture="quartz_block_side", tint=0x8eb200}, {6,10,7, 10,14,9, texture="quartz_block_side", tint=0x8eb200}, {14,2,7, 16,14,9, texture="quartz_block_side", tint=0x8eb200}, {2,2,7, 4,10,9, texture="quartz_block_side", tint=0x8eb200}, {4,8,7, 6,10,9, texture="quartz_block_side", tint=0x8eb200}, {10,8,7, 12,10,9, texture="quartz_block_side", tint=0x8eb200}, {12,2,7, 14,10,9, texture="quartz_block_side", tint=0x8eb200}, {6,2,7, 10,4,9, texture="quartz_block_side", tint=0x8eb200}, {0,0,7, 16,2,9, texture="quartz_block_side", tint=0x8eb200}, {0,14,7, 16,16,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {0,2,7, 2,14,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {6,10,7, 10,14,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {14,2,7, 16,14,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {2,2,7, 4,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {4,8,7, 6,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {10,8,7, 12,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {12,2,7, 14,10,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {6,2,7, 10,4,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {0,0,7, 16,2,9, texture="quartz_block_side", tint=0x8eb200, state=true}, {2,2,8, 14,14,9, texture="quartz_block_side", tint=0xe0301e, state=true}}} Итак, наша плитка имеет двойной набор фигур - для двух состояний, окрашенных в текстуру кварца с зеленым оттенком. Кнопка будет работать как рычаг, испуская сигнал в активном состоянии. Откройте файл командой open creeper. Скопируйте код плитки выше и вставьте в файл кнопкой [insert]. Затем сохраните ([Ctrl]+) и покиньте редактор ([Ctrl]+[W]). 6. Печать Все готово, принтер заправлен, модель спроектирована. Отправляем ее на печать! print3d creeper 7. Итоги Enjoy!
  4. 10 баллов
    ПОЛНЫЙ ОБЗОР Computronics версии 1.5.5 Часть вторая: стандартные блоки. И снова я приветствую Вас, уважаемый читатель этого блога! Вашему вниманию представляю вторую часть полного обзора CX версии 1.5.5, в которой я поведаю Вам о: Cipher Block (шифратор) Advanced Cipher Block (продвинутый шифратор) Colorful Lamp (разноцветная лампочка) Tape Drive + Cassette tapes (кассетный привод и, собственно, кассеты)) I. Cipher Block a.k.a. "Шифратор" Алгоритмов шифрования уже и так огороды, но суровые разрабы CX не сдаются) На самом деле, может быть очень полезным блоком для каких-нибудь там ивентов. Почему? Этот блок позволяет шифровать и дешифровать определённую строку, используя в качестве ключа... не что иное, как... предметы! Да, знаю, поворот весьма и весьма неожиданный, но так оно и есть на самом деле. Функции. cipher.decrypt(encrypted_string:String):String — пытается расшифровать строку, используя как "ключ" предметы в инвентаре шифратора. В случае неудачи (неправильный код) выдаёт ошибку. cipher.encrypt(string_to_encrypt:String):String — шифрует данную строку, используя как "ключ" предметы в инвентаре шифратора. Возвращает зашифрованную строку. cipher.setLocked(lock:Boolean) — блокирует/открывает доступ к инвентарю шифратора. При попытке открыть заблокированный шифратор, игроку выдаётся предупреждение в чат. cipher.isLocked():Boolean — возвращает состояние блокировки шифратора на данный момент. Скриншоты: II. Advanced Cipher Block. a.k.a. "Продвинутый шифратор" Этот вариант шифратора отличается от предыдущего тем, что здесь нет необходимости задать предметы как ключ — для шифровки/расшифровки используется алгоритм RSA. Функции. adv_cipher.createKeySet(prime1:Number, prime2:Number):Keygen — создаёт и запускает процесс генерации пары ключей на основе двух простых чисел. Возвращается структура, содержашая данные методы: key_set.finished():Boolean — так как процесс генерации ключей не мгновенный, использовать ключи сразу же после создания генератора нельзя. Данная функция возвращает готовность ключей: true при завершённом процессе генерации и false, если процесс генерации не завершён. key_set.getKeys():Table, Table — данная функция возвращает пару сгенерированных ключей или nil при незавершённом процессе генерации. [*]adv_cipher.createRandomKeySet():Keygen — идентичен полностью прошлой функции за исключением того, что числа простые указывать не нужно — они выберутся случайно. [*]adv_cipher.decrypt(encrypted_string:String, private_key:Table):String — дешифрует данную строку, используя приватный ключ RSA. [*]adv_cipher.encrypt(string_to_encrypt:String, public_key:Table):String — шифрует данную строку, используя публичный ключ RSA. III. Colorful Lamp. a.k.a "Разноцветная лампочка" Блок, испускающий свет, цвет которого можно менять программно (всего цветов 32768, включая чёрный). Функции. lamp.getLampColor():Number — возвращает текущий цвет лампочки. lamp.setLampColor(color:Number):Boolean — устанавливает текущий цвет лампочки. Если цвет равен нулю, то лампочка выключается. Скриншоты: IV. Кассеты и всё, что с ними связано. IV.1. Cassette Tapes. a.k.a. "Кассеты" Кассеты — мощное переносное хранилище информации, как текстовой, так и музыкальной. Всего видов кассет в CX — ни много, ни мало — 8 штук! И каждый тип различается требованиями по ресурсам и вместительностью музыки в минутах. Деревянная — 2 минуты Железная — 4 минуты Стальная — 6 минут Золотая дешёвая — 8 минут Золотая дорогая — 16 минут Алмазная — 32 минуты "Дешёвая" незерстарровская — 64 минуты И, наконец, самая ненажная и дорогущая одновременно вещь, которая когда-либо существовала в Майначе... Дорогущая незерстарровская — 128 минут. Это больше, чем на CD-диске!)) Но и качество хромает. Тем не менее, на такую кассету можно записать больше данных, чем на РЭЙД с 3 алмазными дисками) IV.2. Tape Drive. a.k.a. "Стример" Но одной кассетой Вы удолевтвориться не сможете... Для считывания и записывания информации необходим аналог CD-ROM'а, но для кассет — кассетный проигрыватель, называемый стримером. Функции. tape.stop():Boolean — останавливает проигрывание кассеты. tape.setSpeed(speed:Number):Boolean — устанавливает скорость воспроизведения (от 0.25 до 2). tape.getLabel():String — возвращает метку касссеты. Если не задано, равно "". tape.setLabel(label:String):String — устанавливает метку кассеты. Она видна в тултипе кассеты и в кассетном приводе, если там вставлена дискета. Возвращается новая установленная метка кассеты. tape.getState():String — возвращает текущий статус кассетного привода: "RUNNING", если проигрывается кассета, или "STOPPED", если нет дискеты, или воспроизведение было остановлено. tape.seek(amount:Number) — перематывает кассету на данное количество байтов вперёд/назад (при отрицательном значении). tape.setVolume(volume:Number) — устанавливает громкость кассеты от 0 до 1 (принимаются дробные значения). tape.getSize():Number — возвращает размер музыкального содержимого кассеты в байтах. Полезно вместе с функцией tape.seek() для перемотки в начало. tape.play() — начинает проигрывание музыкального содержимого кассеты. tape.isEnd():Boolean — возвращает true, если проигрывание содержимого завершилось. Полезно для зацикливания музыки на дискете в совокупности с tape.getSize() и tape.seek(). tape.isReady():Boolean — возвращает true, если в приводе присутствует дискета. tape.read([length:Number]):Number|String — читает всё (или определённое кол-во байтов), что записано на кассету. tape.write(data:Number|String) — записывает на кассету данные. Программа. При вставке кассеты в привод, появляется программа tape, которая позволяет совершать базовые операции над кассетой без необходимости использовать интерпретатор Lua. Доступно следующее: tape play — начать проигрывание. tape pause — приостановить проигрывание. tape stop — остановить проигрывание и перемотать в начало. tape rewind — перемотать кассету в начало. tape label — получить метку кассеты. tape label label — установить метку label кассете в приводе. tape volume volume — установить громкость volume музыке на кассете. tape speed speed — установить скорость speed проигрывания. tape write path/to/audio/file — записать на кассету файл с жёсткого диска компьютера. tape write URL — записать на кассету музыку с удалённого сервера, доступную по адресу URL. Скриншоты: IV.3. Формат звуковых файлов DFPWM. Прочитав рассказ о воспроизведении звука, наверняка, Вы уже начали искать тот самый файл с вашей любимой музыкой. Но не всё так просто! Дело в том, что используется странный и непонятный формат файлов — DFPWM... Но где его искать? Шаг первый. Конвертер. Первым делом, придётся открыть http://www.google.com/ в отдельной вкладке, ведь мороки с музыкой будет много. Сначала найдите в интернете конвертеры из формата Вашего файла в формат WAV (можно пропустить, если изначально в WAV). Для Линукса это ffmpeg, например. Шаг второй. Получение файла DFPWM. У вас должен быть на руках WAV-файл с музыкой. На всякий случай попробуйте открыть его в аудиопроигрывателе, дабы убедиться в "правильности" файла. Если всё ОК — закрываем Гугл и идём дальше. Загрузите данный файл на свой компьютер: https://dl.dropboxusercontent.com/u/93572794/LionRay.jar Это конвертер из WAV в DFMPW. Выставьте права на исполнение, если они не соблюдены, и запустите файл через Java. Укажите расположение исходного WAV-файла и запустите процесс конвертации. Шаг третий. Сохранение файла. Если у Вас есть доступ к папке сохранения, то всё просто — откройте папку ~/saves/<имя_мира>/opencomputers/<адрес_диска>/ и переместите туда Ваш получившийся аудиофайл. Затем вставьте кассету в стример, подключите последний к компьютеру и пропишите tape write <имя_аудиофайла>. Иначе Вам придётся искать хостинг, выдающий прямые ссылки на файл. Загрузите файл и скопируйте ссылку. Затем вставьте интернет-карту в компьютер и пропишите следующее: tape write <ссылка_на_аудиофайл>. Дождитесь окончания загрузки. Фух, вот я, наконец, и закончил. В сумме на написание этого гайда ушло около шести часов ночного времени, так что думаю, что он Вам понравится) Оставляйте оценки, лайки, жду комментариев! А в следующей части я расскажу о четырёх новых картах, которые добавляет CX. Ссылка на страницу мода: http://wiki.vex.tty.sh/wiki:computronics
  5. 10 баллов
    0. Вступление Итак, представим себе, что вы, после бурного вечера с друзьями, идете к себе домой. Уже добрались почти до входных дверей - у тут на тебе! Компьютер который работает дверным замком, бессовестно взял отгул и отключился. Что делать? Как попасть домой? Как добраться до железного гада, чтобы объяснить всю глубину его заблуждений? К счастью, красная плата и сетевая карта имеют некоторые недокументированные на gamepedia (я забыл обновить статьи =)) возможности. Вы можете включить компьютер при помощи сигнала редстоуна, или кодового слова отправленного по сети. 1. Wake-On-Redstone component.redstone.setWakeThreshold(threshold:number):number Эта команда позволяет установить в компьютер "будильник", который сработает, если входящий сигнал редстоуна (поданный на корпус компьютера (если вы используете красную плату) или на блок красного контроллера) превысит порог значения threshold. И если компьютер был выключен - он включится. Т.е. для включения компьютера вы можете воспользоваться рычагом или нажимной пластиной. 2. Wake-On-LAN component.modem.setWakeMessage(message: string):string Если компьютер получит по сети (проводной или без), сообщение message, то он включится. При этом не имеет значения, по какому порту получено сообщение. Обе функции возвращают в качестве результата старое значение "будильника". Чтобы снять "будильник", установите значение 0 (для редстоуна) или nil (для модема). Ну, а для того, чтобы включенный компьютер тут же принялся за работу, пропишите нужные команды в файле autorun.lua в корне загрузочного диска.
  6. 10 баллов
    ПОЛНЫЙ ОБЗОР Computronics версии 1.5.5. Часть первая: стандартные блоки. Приветствую Вас, уважаемый читатель! В данном обзоре я попытаюсь рассказать о всём, что только есть в Computronics. И начать предлагаю со "стандартных" блоков. Итак, гостями сегодняшней части будут: Iron Note Block (железный нотный блок) Camera (камера) Radar (радар) Chatbox (чат-бокс) I: Iron Note Block. Железный нотный блок — аналог обычного нотного блока, управляемый исключительно компьютером и позволяющий указывать номер ноты (от нуля до 24) и инструмент. Последний указывается числом от нуля до шести: 0 — пианино; 1 — большой барабан; 2 — клики/палочки; 3 — малый барабан; 4 — бас-гитара; 5 — пианино; 6 — бас-гитара. Функции: iron_noteblock.playSound(instrument, note) — проигрывает ноту с номером note на инструменте instrument (кроме номера инструмента, можно написать название) Блок: II: Camera. Камера — блок, позволяющий Вам получать дистанцию до ближайшего блока. При этом, можно установить угол "поворота" камеры по обеим плоскостям (X и Y). Максимальное значение "поворота" равно единице, минимальное — -1. Функции : camera.distance([x, y]) — получить дистанцию до ближайшего блока с определённым углом "поворота". Если опущено, то равно 0, 0. Блок: III: Radar. Радар позволяет получать информацию об игроках, мобах, предметах на земле и энтитей в определённом радиусе, но не дальше указанного в файле конфигурации мода предела. Все координаты относительные! Функции: radar.getEntities([range]) — возвращает информацию обо всех сущностях. Структура возвращаемой таблицы у этой и последующих двух функций такова: radar.getPlayers([range]) — возвращает информацию об окружающих игроках radar.getMobs([range]) — возвращает информацию о мобах поблизости radar.getItems([range]) — возвращает таблицу с предметами на земле около радара. Структура данной таблицы: Блок: IV: Chatbox. Последний в данной части блок — чат-бокс. Этот компонент позволяет отправлять и принимать сообщения в/из игрового чат (-а) в определённом радиусе. Функции: chatbox.getDistance() — возвращает текущий установленный радиус действия чат-бокса. chatbox.getName() — возвращает текущее установленное "имя" чат-бокса. chatbox.say(msg[, range]) — отправляет сообщение msg в чат в радиусе range. Если не указано, равно установленному. Возвращает true при успехе. chatbox.setDistance(range) — устанавливает радиус действия чат-бокса. Возвращает новый радиус. chatbox.setName(name) — устанавливает "имя" чат-бокса. Возвращает новое "имя". События: chat_message(UUID, sender, msg) — генерируется при отправке сообщения msg в чат игроком sender с UUID UUID. Скриншоты: Вот мы и подошли к концу данной части. В следующей части я расскажу о Chiper Block, Advanced Chiper Block, Colorful Lamp и Tape Drive. А пока — жду комментариев, оценок Ссылка на страницу мода: http://wiki.vex.tty.sh/wiki:computronics << НАЗАД в башню Fingercomp
  7. 10 баллов
    Здравствуй, брат автоматизатор. Надеюсь, ты помнишь, что всеми нами любимый брат qwertyMAN порадовал нас своей охранной системой турелей. И казалось бы, всё замечательно: турельки бьют прицельно, гриферы боятся, а мобы рассыпаются в лут. Но как всегда я нашел, к чему придраться. Не смотря на прицельный огонь, направление турели на цель вычисляется по очень неэффективному алгоритму. Весь код охранной системы я разбирать не буду, сосредоточусь только на математике. Остаток от деления Начнем с такого фрагмента: local function kostil(x) while true do if x>=360 then x = x - 360 elseif x<0 then x = x + 360 else break end end return xend По названию функции видно, что автор осознавал ущербность этого кода, но лучшего решения не знал или забыл. Разберемся, что делает этот код. В цикле вычитает 360 из аргумента, если он больше или равен 360, или добавляет 360, если меньше нуля. А по сути, приводит значение угла к диапазону [0,360). Зачем это делается? Ведь, например, углы и -90˚ и 270˚ указывают одинаковое направление. Сколько бы полных оборотов (360˚) в какую бы сторону мы не совершили, направление от этого не изменится. Тем не менее турель из OpenSecurity не принимает угол, выходящий за границы диапазона [0..360]. Приведение угла к нужному диапазону называют нормализацией. Угол можно нормализовать и в других диапазонах с полным углом, например [-180,+180]. Но наша турель требует диапазон [0,360]. Как же эффективно произвести нормализацию? Лучшим решением является операция взятия остатка от деления. Заглянем в справочник: a % b == a — math.floor(a/b)*b Не сложно увидеть, что a % b дает нам ровно тот же результат, что и костыль qwertyMAN'а, но код сильно сократился и стал выполняться быстрее. qwertyMAN с этого костыля быстро спрыгнул, и в следующей версии упростил свой код, но поверь мне, брат, на форуме есть много таких костылей, и калеки не спешат с них слезать. Вот, например, фрагмент кода, до которого я уже давно хотел докопаться. Код слишком длинный не только для своего функционала, но и для этой статьи, поэтому я спрячу его в спойлер: Можно ли этот код упростить? Легко. Для начала заменим строки числами, например, по такой схеме: N=0; W=1; S=2; E=3 После чего становится очевидным такое решение: function smartTurnLeft() robot.turnLeft(); N=(N+1)%4; endfunction smartTurnRight() robot.turnRight(); N=(N-1)%4; endfunction smartTurnAround() robot.turnAround(); N=(N+2)%4; end С какой стороны света начинать отсчет, и в каком направлении, это уже другой вопрос, но принцип остается неизменным. Главное, что код упростился, он не занимает огромное место в памяти и быстро выполняется. Конечно, при использовании некоторых приближенных к машинным языков и при определенных условиях работы алгоритма использование деления может оказаться менее эффективным, чем проверки условий с последующим сложением/вычитанием. Но интерпретируемые языки, к которым относится Lua, это преимущество нивелируют. Поэтому по возможности используй операцию взятия остатка от деления при обсчете всяких циклических значений. Это удобно и эффективно. Тригонометрия Теперь взгляни на эту функцию local function pointer(x,y,z) local distXY = math.sqrt(x^2+z^2) local distDY = math.sqrt(y^2+distXY^2) local outX = math.deg(math.acos(x/distXY))+90 local outY = 90-math.deg(math.acos(y/distDY)) if z<0 then outX = kostil(180-outX) end return outX,outYend Что она делает? Понять не сложно: вычисляет угловые координаты цели: азимут и угол места в градусах. Что тут не так? 1) присутствует acos с последующим добавлением/вычитанием 90˚, хотя известно, что и синус и косинус при добавлении/вычитании 90˚ преобразуются друг в друга. На этом я задерживаться не буду, формулы и их вывод есть в любом учебнике. 2) использование только asin или только acos тоже является не лучшей идеей: asin имеет низкое разрешение по углу в окрестности +/-90˚, а acos – в области 0 ˚и 180˚, снижая точность наведения, и для ее повышения потребуется использовать asin в окрестностях 0 ˚и 180˚ и acos в окрестности +/-90˚. 3) вычисление синусов и косинусов требует вычисления расстояния до цели r=sqrt(x*x+z*z), а, например, вычисление тангенса не требует. 4) область значений asin, acos и atan не покрывает полный оборот в 360˚, поэтому приходится прибегать к дополнительным вычислениям, как, например, это сделал автор: if z<0 then outX = (180-outX)%360 end. 5) не сошелся свет клином на всем известных со школы синусах, косинусах и тангенсах. Уделив несколько минут чтению списка математических функций, можно обнаружить такую красоту: В геометрии об этом не рассказывают, но такая функция имеется в стандартной библиотеке, пожалуй, любого высокоуровневого языка программирования. С ее помощью мы находим азимут цели единственной строкой azimuth=math.atan2(x, -z). Осталось только выполнить преобразование в градусы, да скорректировать возвращаемый диапазон углов c [-180,+180] на принимаемый турелью [0..360], с чем мы уже разобрались. Теперь надо правильно заполнить аргументы функции atan2. Для этого приведем всё, что у нас имеется, к картинке из школьного учебника. Во-первых, на картинках в школьном учебнике угол растет при повороте от оси X, к оси Y, и тангенс угла вычисляется как tg(α) = y/x. В справочнике же к atan2 указаны аргументы atan2(x, y) для вычисления арктангенса x/y. То есть, нам следует поменять аргументы местами. Имеем: math.atan2(y, x) Теперь разберемся с координатами мира Майнкрафта, положением турели, и тоже приведем их к картинке из школьного учебника. Сначала нарисуем координаты Майнкрафта при обращении лицом на север, вид сверху. Ось X направлена на восток, ось Z – на юг. Азимут поворота турели отсчитывается от северного направления по часовой стрелке. Прошу простить мне изображение угла прямой линией, а не дугой. Надеюсь, это не сильно помешает пониманию выполненных преобразований. X, Z – координаты мира Майнкрафта; R – вектор на цель; α – небольшой положительный угол между нулевым положением турели и вектором на цель. На первом рисунке изображены исходные координаты майна и поворота турели. На втором – поворот рисунка на 90˚ по часовой стрелке. На третьем – отражение рисунка по вертикали (как бы взгляд на плоскость карты не сверху, а снизу, из-под земли). В принципе, можно было бы обойтись без второго рисунка, отразив первый по диагонали, идущей из правого верхнего угла, но для улучшения восприятия я привел оба рисунка. На четвертом рисунке выполняется инверсия оси Z. Важно понять, что от всех этих преобразований координаты совершенно не меняются, меняется лишь их представление. И вообще следует помнить, что координаты не существуют в реальности и являются лишь математической абстракцией, которую легко можно вывернуть наизнанку в отличие от реальных объектов. Как ни вращай мир Майнкрафта на рисунках, он от этого не сдвинется и не изменится. Меняется лишь твоя точка зрения, но она-то и позволяет тебе упростить программу, избавившись от бесполезных вычислений. Все совершённые преобразования были нужны лишь для наглядности, и из них можно вывести более простое правило. Тригонометрия из школьного учебника основана на росте угла от оси X к оси Y. Но аналогичные формулы применимы при росте угла от оси -Z к оси X при соответствующих заменах в формулах. То есть, надо всего лишь знать от какой оси начинается рост угла и к какой оси происходит движение. В результате выполненных преобразований ты можешь легко заметить, что координаты из учебника (x,y) соответствуют координатам Майнкрафта (-z,x). В нашем случае: sin(α) = y/r → sin(α) = x/rcos(α) = x/r → cos(α) = -z/rtg(α) = y/x → tg(α) = x/-z Таким образом наш код приобретает вид: math.atan2(x, -z) Осталось лишь преобразовать радианы в градусы и нормализовать их в диапазоне [0..360]: azimuth=math.deg(math.atan2(x,-z))%360 Аналогичным образом вычисляется и угол места с той разницей, что ему не требуется нормализация. Вращать координаты тоже не надо. Но есть небольшой нюанс: угол места вычисляется относительно горизонтальной плоскости, для чего требуется найти расстояние до цели по горизонтали, и оно легко вычисляется по теореме Пифагора: Теперь тело функции, вычисляющей углы направления турели, умещается в три строки. local azimuth=math.deg(math.atan2(x,-z))%360local elevation=math.deg(math.atan2(y,math.sqrt(x*x+z*z)))return azimuth, elevation Или даже в одну, если не создавать промежуточные переменные и сразу возвращать результат. Вот так благодаря математике мы смогли сократить код программы на полтора десятка строк, а заодно и ускорили программу, избавившись от лишних вычислений. Кроме того сам код стал более понятным и наглядным. Не спеши кодить, подумай о математике, брат
  8. 9 баллов
    Новости! Теперь мой браузер будет называться "Арбузер", и будет выполнен в зеленоватых тонах. Zer0Galaxy мне помогает, и уже набросал парсинг и поиск по самым простым селекторам в CSS. Думаю, ему для полной работы с CSS нужно будет написать еще разов в 6 больше кода. Готовы первые наброски самого браузера без страниц. Закладки, навигация, строка пути. Кстати, вы можете посмотреть эмулятор экрана компьютера из OC, который можно открыть в браузере и даже посмотреть исходный код. Ядро написано примерно на 15% пока что. В следующий раз буду отрисовывать элементы страниц, подгружая их стили.
  9. 9 баллов
    Программа Титан-2 – это еще один подход к построению добывающих программ с интерактивными возможностями и высокой степенью эффективности и автономности. Программа находится в режиме альфа тестирования и скоро будет доступна для скачивания. Код программы: Робот: скачать (в бета) Сервер: скачать (в бета) При разработке и написании программки я постарался руководствоваться следующими концепциями: длительное, практически неограниченное, время автономной работы быстрая процедура развертывания, свертывания, доукомплектования робота и определения задачи на местности, робот сам сориентируется на карте по навигатору, выйдет на нужную глубину бурения и буквально меньше чем через минуту уже начнет добывать ресурсы высокая степень мобильности и скрытности робота на местности работа на защищенных каналах связи простая процедура передислокации робота, смены рода деятельности выполнение поставленной задачи в условиях любой сложности максимальное использование систем и апгрейдов, дающих колоссальное преимущество роботу при выполнении необходимых задач (цель оправдывает средства) высокий уровень живучести, модульности и спектра применения робота минимальное вмешательство человека в работу программы дистанционный контроль постоянный мониторинг процесса работы, состояния робота и его систем максимально быстрый алгоритм поиска руд, вскапывания и добычи и минимальное количество операций записи, чтения и циклов, максимально быстрое и четкое перемещение поиск решений при возникающих проблемах самим роботом. Если робот нашел решение, он его принимает сам и не нуждается в человеке лог событий, полный анализ роботом своего состояния, и влияние их значений на дальнейшие действия робота максимальная «защита от дурака» и ввода неправильных данных и команд для обеспечения бесперебойной и правильной работы программы. По сути девиз такой: Поставил робота, дай ему инструменты и забудь про него. Только забирай ресурсы. Сразу скажу, что программка Титан-2 предъявляет достаточно высокие аппаратные требования к роботу. Нубасам, которые ноют, что в игре нет китов и дорого крафтить клавиатуру (ведь для нее нужен камень), а алмазы для микрочипов и дорогих плат найти вообще нереально сложно, эта программка не подойдет. :P Для игроков начального уровня на первых порах лучше использовать какую-нибудь примитивную каменную черепашку в режиме "эксквавектвайлетруду 3х3" или кирку и упорно голосовать 5 дней для покупки ЧЛ для робота =) Рекомендуемые аппаратные требования: Установка и настройка: (Описание, в релизе) Текущие возможности программы: несколько алгоритмов добычи и других задач, вызываемых из меню интерактивных очков одной командой (робот приступит к выполнению и больше не будет Вас тревожить) робот знает все предметы майна, нужные руды, мусор и прочее, Вам не нужно заботиться о том, что добывать, какие предметы положить, что выкидывать и т.д. Робот уже сам работает со списками и своей базой предметов и их свойствами робот умеет работать с инвентарями, знает все моды и предметы, которые можно использовать в качестве контейнеров (сундуки) автоматически и своевременно поддерживает себя на достаточном энергетическом уровне робот анализирует в инвентаре доступные наборы и предметы, инструменты и контейнеры, и не важно, как они там валяются, в каком порядке и из каких они модов своевременно меняет инструменты с низким уровнем заряда периодически чистит инвентарь, сортирует и укладывает предметы, ведет общий подсчет добытых ресов, шлет полный отчет о работе, координатах, проценте выполнения поставленной задачи и пр. при заполнении инвентаря (а это 64 слота, что составит 4096 шт. полезных руд при работе силком. С учетом того, что Вы положите стак любых сундуков и пару заряженных буров перед началом работы, немного меньше), робот начнет делать схроны (прятать ресы в сундуки) и записывать их координаты, при условии, что он найдет сундуки у себя в инвентаре. Если задача по буровым работам была не слишком объемной, сундуки можно не давать роботу. В любом случае, если сундуки закончатся или инвентарь заполниться, или все доступные буры (кирки, ломы и лопаты ) будут иметь запас прочности/заряда меньше 5%, робот приостановит свою работу и будет терпеливо Вас дожидаться, периодически Вас звать, пока Вы не дадите ему требуемое. Далее робот возобновит работу Вы можете посмотреть все тайники ресурсов с консоли, их собрать, а список тайников выборочно или полностью очищать дистанционно с консоли Terminal Glasses. в любой момент можно дистанционно прервать работу робота, вызвать его на любые координаты, переоснастить и переозадачить и перебазировать, при чем не обязательно находится возле робота. Все это можно сделать, не отрывая попки от телевизора и не выходя из своего домика процесс и управление осуществляется с Terminal GlassesóServer+связанная картаó связанная карта+робот. Бесперебойную работу робота, связь с ним и управление обеспечивает чанклоадер. Управление, контроль и мониторинг доступен из любого мира и не зависит от расстояния робот, благодаря наличию апгрейда, накапливает со временем опыт и работает все более эффективно сканирование ресурсов в толще породы осуществляется геосканером методом “фалангового сканирования” (“бегущий кластер”, “удар катаны” ) поддержка английской и русской локали предметов пр. Планируемые возможности программы: добавление разных видов строительных и добывающих работ более гибкая и разветвленная система команд, диалоговые окна для Terminal Glasses управление роботом и добычей ресурсов со своего смартфона на базе Android, контроль и мониторинг. При все при этом Вы можете добывать ресурсы, находясь на парах или в школе на уроках добавление возможности (при использовании серверной стойки) смены (выбора) контроля и управления над несколькими роботами методом биндинга связанных плат на основной канал моста через команду консоли TerminalGlasses др. возможности
  10. 9 баллов
    Как обрести счастье на IT-сервере “Не собирайте себе сокровищ на земле, где моль и ржа истребляют и где воры подкапывают и крадут, но собирайте себе сокровища на небе, где ни моль, ни ржа не истребляют и где воры не подкапываются и не крадут” (Матф.6:19-20). Часть первая. То измена, то засада. В последние два месяца я редко захожу в игру, в основном для проверки и поддержания привата. Даже форум редко просматриваю. Зайдя же в очередной раз на сервер после двухнедельного отсутствия в игре, я обнаружил себя на новом спавне, почти голым, в майке и трениках, без бура, джетпака и наношапочки. И самое печальное, без дома: /home не работал, и мой дом на карте тоже не просматривался. Да что об этом говорить – сама карта была совершенно новой. И я приуныл. И вот, стою я один, как Робинзон на острове, с комплектом железной брони и инструментов в инвентаре, но прямо сейчас я боюсь потерять даже их. Вокруг непроглядная ночь, наполненная голосами местной нечисти. А если очень сильно не повезет, можно даже погибнуть от лазера злодея на спавне. Стоящий на спавне сундочок Края кажется единственной надеждой спасти подаренное богами имущество. Но нет же, сундук не открывается, лишь выдается сообщение "У вас нет разрешение игрока прав администратора на использование предметов". Благо, форум подсказал мне про /enderchest. Я быстренько сложил свой примитивный скарб в виртуальный сундук, и стал неспешно оглядываться на спавне и ждать окончания ночи. И вот тут меня ждала вторая неожиданность – ночь не кончалась, время тянулось медленно, и это не фигура речи, это новая фишка сервера, как выяснилось. И я опять приуныл. Часть вторая. Спасение. Реально помогают лишь две вещи: голоса в ТОПах и программирование, как и заповедовал нам AlexCC, в этом он преуспел. Теоретически могли бы помочь друзья, но я не очень общительный человек, и в тот момент на сервере никого из игроков не было, да и друзья до сих пор сами буквально умирают от голода. На сервере находился только AlexCC, но я не стал тревожить его своим плачем. Даже Яхве не помогал евреям, пока те не вставали на путь исправления. За голоса я приобрел себе ПНВ, чтоб лучше видеть, наноботы, чтобы мягче падать, и несколько джетпаков, чтобы летать и не сильно заботиться об их зарядке, после чего, отбиваясь от зомбей и скелетов, стремительно закопался в гору недалеко от спавна и заприватил участок. Это сберегло мне время и душевное равновесие на старте игры. Потом я все же отклонился от праведной жизни, несколько раз сходив с киркой, а потом и буром в майн за рудами, построил батбокс для зарядки джетпака, а также всяческие дробилки-плавилки-сжималки-выжималки, скрафтил бур, пилу, и даже смог собрать свой первый компьютер, закупив для него лишь глину и кактусы. Сейчас же думаю, что на этом этапе я ошибался. Я не пробовал посчитать, но думаю, что стартовых денег достаточно для покупки ресурсов, необходимых для постройки первого хотя бы простого (или даже сложного) робота, способного к добыче ресурсов. Запрограммировать и отладить его можно в креативе, а можно просто взять одну из замечательных программ с форума computercraft.ru. А дальше лишь остается стоять рядом и, свернув окно майнкрафта, читать умные книжки, статьи и думать над следующими программами. И дом теперь тоже не хочется строить руками. Строительство должно быть автоматизировано. Всё. Всё в мире майнкрафта должно быть полностью и хорошенько томатизировано. Только в этом можно обрести счастье на IT-сервере. Смерти нет. Вайп не конец всему, если только всем для тебя не являлись сундуки, набитые рудой и выстроенный руками дворец. Твои программы и твои знания останутся с тобой и после вайпа, а робота даст администрация, насколько бы кровавой она ни была. Всё остальное должно прийти автоматически. В той горе, где я поселился, мне довелось узнать много всего интересного. Однажды, когда я жарил булыжник в электрической печке, не смотря на тщательно замурованные проходы, зашел ко мне человек в сияющем плаще. Ник его я не запомнил, хотя говорили мы с ним всю долгую ночь. Нет смысла пересказывать весь разговор, но запомнились некоторые его изречения: Блаженны нищие печками, ибо их есть царство IT. Блаженны ошибающиеся, ибо научатся. Блаженны спрашивающие, ибо они наследуют опыт IT. Блаженны алчущие и жаждущие знаний, ибо получат их. Блаженны помогающие, ибо они помощь получат. Блаженны думающие, ибо они программирование осилят. Блаженны программирующие, ибо они будут наречены сынами IT. Блаженны бегущие с серверов без OpenComputers, ибо их есть сервер IT. Блаженны вы, когда будут поносить вас и гнать и всячески неправедно злословить фанаты других серверов. Радуйтесь и веселитесь, ибо велика ваша награда на IT-сервере: так гнали и программистов, бывших прежде вас.
  11. 9 баллов
    Дамы и господа! Мы представляем Вам новый Девайс: Вэйпоинт!.. Собственно, вот. МАНУАЛ по вэйпоинту. Станьте Мастером по юзанью этой штуки за 5 шагов! I. Что это? Вэйпоинт — путевая точка — служит для указания роботу или дрону на конкретную локацию. Используется в совокупности с навигационным апгрейдом. Робот может получать относительные координаты места, силу подведённого к вэйпоинту редстоун-сигнала и название вэйпоинта. Внимание! Вэйпоинт указывает на блок, где спаунятся фиолетовые частицы!! II. Использование. Для сканирования местности и получения данных о вэйпоинтах, необходим навигационный апгрейд в роботе или в дроне. Тогда появляется новая функция: findWaypoints(range) :: table Возвращаемая таблица будет содержать следующие значения: { { label="Имя вэйпоинта", position={ 0, --| Относительные |- X 0, --| координаты |- Y 0, --| вэйпоинта. |- Z n=3 -- Значение данного параметра неизвестно. }, redstone=0 -- Сила редстоуна, подведённая к вэйпоинт-блоку. }, { label="Имя второго вэйпоинта", position={ 0, 0, 0, n=3 }, redstone=15 } ...} III. Подробности. Имя вэйпоинта устанавливается через GUI этого блока. Но есть и второй вариант: вэйпоинт регистрирует себя как компонент: Так что мы можем обратиться к его фукнкциям: getLabel() :: string -- возвращает текущее название вэйпоинтаsetLabel(label:string) -- устанавливает новое название вэйпоинта IV. Практика! Специально для теста я по-быстрому написал 2 простенькие программы: поиск вэйпоинтов и перемещение к данному вэйпоинту. Полигон для тестов выглядел так: С ред-сигналом был только вэйпоинт "Сундук с грязью", как подсказывает первая программа find: Теперь давайте использовать путевые точки по назначению! Куда более сырая вторая программа goto позволяет перемещаться на данный вэйпоинт. Так как дрон — слишком просто, будем использовать робота "Curiosity". После выполнения робот перемещается с грязевого сундука на высокий вэйпоинт: Из-за сырости программы возникают небольшие ошибочки Здесь робот хотел пройти сквозь компьютер и попасть к правому вэйпоинту на скрине, но у него это не получилось :| И последнее. Если робот не находит какой-то вэйпоинт (в данном случае — "набор слов"), он выдаёт ошибочку. V. Заключение. Вэйпоинты могут помочь роботу или дрону легче ориентироваться на местности. Ссылки на скачивание программ: find: wget http://www.pastebin.com/raw.php?i=s0KdZApY find.lua goto: wget http://www.pastebin.com/raw.php?i=nAqrJ9jT goto.lua [*]Жду комментариев, лайков и, может, даже оценок! Ведь теперь Вы можете с уверенностью использовать этот замечательный блок [*]И, внимание! Официальное видео от автора ОС, демонстрирующее интересное использование данного блока в повседневных целях.
  12. 8 баллов
    В последних версиях OpenComputers обрастает всякими загадочными вещами. Игроки, которые только только освоились с предыдущей версией вдруг понимают, что надо изучать все заново. "А пошло оно все!" - думают игроки, и уходят на версию 1.3.6, или переучиваются на ComputerCraft, который проще, и не требует непонятного. А одна из самых загадочных - неведомый EEPROM. Это такая мелкая хрень, без которой не работает ни один компьютер, или даже робот. Хорошо еще, что есть стандартный EEPROM который называется Lua BIOS. Он легко крафтится и заставляет работать компьютеры как и раньше. Но найдем задачку посложнее, где Lua BIOS не поможет. Попробуем собрать микроконтроллер, который будет управлять входными дверями. 1. План Представим, как оно должно работать. Слева от двери (если входить) - микроконтроллер. Ради понтов, возьмем Микроконтроллер 2-ого уровня и поставим в него беспроводную сетевую плату. Кроме того добавим красную плату, чтобы управлять дверью. 1. Если контроллер принимает сигнал "open" - он открывает дверь. 2. Если примет сигнал "close" - он закрывает дверь. 3. Если примет посторонний сигнал - взрывает динамит. Дабы сокровища не достались хакерам. Для управления задействуем любой комп, у которого тоже будет беспроводная плата (или точка доступа). 2. Крафтим контроллер С этим проблем не возникнет. Потому, что я играю в креативе :P . Открываем NEI и берем нужные детали. В последний слот положим пока пустой EEPROM. Потом поставим на него прошивку, а пока - не важно. Нажимаем кнопку "Старт" и достаем готовый блок. 3. Готовим прошивку Теперь, когда все готово, мы построили сокровищницу и скрафтили контроллер - осталось самое главное. Программирование EEPROM'а отличается от программирования обычной программы. Потому, что обычно, наши программы выполняются в OpenOS, которая заботливо загружает нужные библиотеки, предоставляет всякие удобные фичи и прочее. Тем не менее писать мы будем именно в OpenOS. Запустим компьютер, напишем edit bios и введем следующие строки: red = component.proxy(component.list("redstone")())while true do red.setOutput(5, 0) computer.pullSignal(1) red.setOutput(5, 15) computer.pullSignal(1)end Дело в том, что большая часть библиотек, которые мы использовали - это библиотеки OpenOS. А значит мы не можем ими пользоваться в BIOS. Однако кое-что нам доступно. Это библиотеки computer и component, и соответственно все установленные в целевом агрегате (микроконтроллер) компоненты. Более чем достаточно для наших задач. Вышеприведенный код делает следующее: * ищет компонент с названием "redstone" и возвращает его прокси * в вечном цикле посылает нулевой редстоун-импульс направо (side = 5), т.е. гасит сигнал * ждет секунду (на самом деле - ожидает эвентов, то есть сигналов) * посылает редстоун сигнал с силой 15 направо * опять ждет секунду Преследуем двоякую цель: во-первых проверить, что EEPROM вообще работает так про него написано на Вики. Кто его знает? А во-вторых: убедиться, что сторона 5 это именно та сторона, где дверь. А не какая-нибудь другая. Нажмем Ctrl+S, чтобы сохраниться и Ctrl+W, чтобы закрыть редактор. Вставим пустой EEPROM (еще один) в слот нашего компьютера, вместо лежащего там Lua BIOS. И напишем в консоль такую команду: flash -q bios MCBios Программа flash предназначена для прошивки чипов. Флаг -q говорит ей, чтобы не задавала лишних вопросов, затем идет имя файла с нашим кодом (bios) и метка, которую программа шлепнет на чип (MCBios). Все. Доставайте. Lua BIOS на место класть не обязательно, ибо этот слот нам еще потребуется. (Но не забудьте его вернуть, если будете перезагружать компьютер) Чтобы заменить пустой EEPROM в контроллере на наш MCBios, надо положить контроллер и MCBios на верстак. При этом пустой чип вылетит, а новый встанет на его место. Поставим контроллер на пол и протестируем. После клика ПКМ на контроллере - замигала правая лампа. Значит все работает как нужно. 4. Теперь - серьезно Извлеките чип с MCBios обратно (так же как и вставляли, только наоборот). Или приготовьте новый пустой чип. Главное - не запутайтесь в них. Пишем клиент для контроллера. У меня он выглядит примерно так: red = component.proxy(component.list("redstone")())modem = component.proxy(component.list('modem')())modem.open(27)red.setOutput(5, 0)red.setOutput(2, 0) -- no explosions yet =)while true do name, _, sender, _, _, message = computer.pullSignal(2) if name == 'modem_message' then if message == 'open' then red.setOutput(5, 15) elseif message == 'close' then red.setOutput(5, 0) else -- hacker tries to get? red.setOutput(2, 15) -- fire in the hole!!! end endendmodem.close() Все согласно плану. Прошиваем чип, вставляем в контроллер, а контроллер ставим слева от дверей. Сзади к контроллеру осторожно прилаживаем запал. ПКМ! Теперь открываем новый файл на компьютере: edit send И пишем в него такой код: local com = require('component')local modem = com.modemlocal args = {...}modem.broadcast(27, args[1])print("Message '"..args[1].."' sent!") Сохраняем, и закрываем. Это будет программка для тестирования контроллера. 5. Тест! Пишем в консоль send open. Дверь открылась! Пишем send close. Дверь закрылась! Пишем send opeh Упс! Опечатка. О_О
  13. 8 баллов
    В прошлый раз мы научились подключаться к сети OpenNet, создавать простенький сайт и открывать его на локальном компьютере. Сегодня мы попытаемся получить доступ к сайту удаленно. Чтобы файл index стал доступен по сети, необходимо на сервере запустить специальную программу - WEB-сервер. В стандартный набор программ для работы с Сетью она не входит, но ее всегда можно скачать, выполнив команду: wget -f https://preview.c9.io/krutoy242/opennet/_source/WEB/WEBserver.lua webserv.lua Да, да, не удивляйтесь, именно wget, хоть в составе нашего компьютера и нет интернет-карты. После того, как мы подключились к Сети нам стали доступны все прелести интернет-карты даже при отсутствии оной, а всё благодаря крутому интернет-серверу, функционирующему в Сети. Pastebin, кстати, тоже работает. Загрузили webserver? Запускаем его. Мы должны увидеть вот такую картинку: Запомним IP-адрес нашего сервера (выделено на картинке). Он понадобится в первое время для подключения к серверу. Теперь идем к другому компьютеру, подключенному к Сети, и проверяем наличие связи с сервером: ping c0b.9cf.a4f Если у Вас нет второго компьютера, Вы можете воспользоваться любым свободным в нашем датацентре. Связь есть? Запускаем браузер с указанием адреса нашего сервера. onBrowser c0b.9cf.a4f Как видим, для открытия сайта по сети нет необходимости указывать не только папку /web, но и имя файла index. Дело в том, что папка /web считается корневой для нашего сайта. А если не указать имя файла, то по умолчанию сервер вернет файл index. Все остальные файлы придется указывать. Но я не хочу что бы к моему серверу обращались по ужасному IP-адресу. Хотелось бы имя покороче и лучше запоминаемое. Для этого нужно пройти регистрацию на DNS-сервере. Допустим, я хочу, что бы наш сервер назывался Zer0. Не слишком оригинально, но на первый раз пойдет. Имя это не должно содержать пробелы и конечно же должно быть уникальным, т.е. никто ранее не должен был зарегистрировать такое же имя. Так же не желательно, чтобы имя содержало точки и наклонные черты. В этом случае имя будет зарегистрировано, но в дальнейшем могут возникнуть проблемы с маршрутизацией. Как же происходит процедура регистрации? Можно, конечно, воспользоваться напрямую функциями DNS-сервера, описанными в теме http://computercraft.ru/topic/675-opennetoc-prodolzhenie/?do=findComment&comment=9097, но с некоторого момента я предпочитаю пользоваться утилитой setdns, которая входит в стандартный набор программ OpenNet. Эта утилита позволяет проверить не зарегистрировано ли еще DNS-имя, какие имена зарегистрированы на тот или иной IP, проводить собственно регистрацию или корректировать настройки уже зарегистрированного имени. В будущем планируется реализовать функцию удаления DNS-имени, но пока она не реализована. Первым делом убеждаемся, что выбранное имя еще не никем не занято (пункт 1). Затем запускаем процедуру регистрации (пункт 3). При регистрации необходимо указать желаемое dns-имя, IP-адрес, с которым это имя будет ассоциировано, и пароль. Пароль понадобится, если мы заходим перерегистрировать имя на другой IP. Если регистрация проводится с того компьютера, чей IP ассоциируется с dns-именем, на запрос IP можно ввести пустую строку. После регистрации выбираем пункт 0 для выхода из утилиты setdns. Теперь мы можем обращаться к серверу не по IP, а по удобному имени. Снова запустим webserver на нашем компьютере, а на соседнем onBrowser Zer0 В следующий раз я постараюсь рассказать как сделать наш сайт разноцветным и интерактивным. (продолжение следует)
  14. 7 баллов
    Нашел эту табличку на англоязычном форуме по OpenComputers. Картинка за авторством Eunomiac показывает весь 8-битный диапазон цветов, доступный для отображения на алмазном дисплее. Пользуясь схемой, легко подобрать цвета для вашего интерфейса, и тут же составить к ним шестнадцатеричный код.
  15. 7 баллов
    Приветствую Вас, уважаемый читатель! В самый ТРУДный день '15 года я, наконец, написал красивые часы, которые идеально подходят для декорирования, например, метро или аэропорта, а также как просто инфо-панель дома Не будем отрывать коту хвост, закончим здесь предисловие. Finger Clock v. ∞ Простая прога для OpenComputers, которая будет показывать Вам текущее майновремя... и реальное время с поддержкой часовых поясов! Pastebin: http://pastebin.com/aKjh5SZL Command: pastebin get aKjh5SZL clock Минимальная комплектация: Монитор T1 x1 Компьютер T1 x1 Жёсткий диск T1 x1 + OpenOS Видеокарта T1 x1 Редстоун-карта T1 x1 (требуется, если монитор не поддерживает клик мышкой, то есть если монитор первого уровня. В мониторах выше не обязателен). Процессор T1 x1 ОЗУ T1.5 x2 EEPROM — Lua BIOS Интернет-карта/OpenNet-интернет — только для установки Рекомендуемая комплектация: Монитор T2/T3 x6 Компьютер T2/T3 x1 Жёсткий диск T1 x1 + OpenOS Видеокарта T2/T3 x1 Редстоун-карта T1 x1 (требуется, если монитор не поддерживает клик мышкой, то есть если монитор первого уровня. В мониторах выше не обязателен). Процессор T2/T3 x1 ОЗУ T2/T2.5/T3/T3.5 x1/2 EEPROM — Lua BIOS Интернет-карта/OpenNet-интернет — только для установки Функции: Позволяет показывать реальное время и внутриигровое время. Настройка цветов, разрешения и часового пояса в константах в начале программы. Не использует отдельные библиотеки — меньше возни с установкой. Настройка: В самом начале программы есть список констант для настройки программы. MT_BG = 0x000000 -- Цвет фона при режиме показа внутриигрового времени.MT_FG = 0xFFFFFF -- Цвет текста при режиме показа внутриигрового времени.DAY = 0xFFFF00 -- Цвет надписи "Day".EVENING = 0x202080 -- Цвет надписи "Evening".NIGHT = 0x000040 -- Цвет надписи "Night".MORNING = 0x404000 -- Цвет надписи "Morning".RT_BG = 0x000000 -- Цвет фона при режиме показа реального времени.RT_FG = 0xFFFFFF -- Цвет текста при режиме показа реального времени.TIMEZONE = 0 -- Часовой пояс (от -12 до 12).W, H = 80, 25 -- Разрешение экрана. Рекомендуется 40x8.REDSTONE = false --[[ Если параметр будет установлен в true, программа будет сменять режимы при изменении редстоун-сигнала. ]]--TOUCH = true --[[ Если параметр будет установлен в true, программа будет сменять режимы по клику мышкой по экрану. ]]--KEY1 = 13 -- Коды клавиши. По умолчанию — [Enter].KEY2 = 28 -- Подробнее в комментариях.AUTOMODE = true --[[ Режим, который активируется при запуске программы. true — режим внутриигрового времени, false — режим реального времени. ]]--SHOWSECS = true --[[ Позволяет скрывать секунды в режиме реального времени при значении, равном false. ]]--SWDATEMT = true -- Показывать внутриигровую дату.SWDATERT = true -- Показывать реальную дату.SWDTMMT = true -- Показывать внутриигровое время суток.SWDTMRT = true -- Показывать реальное время суток. Скриншоты: Режим показа внутриигрового времени Режим показа реального времени
  16. 7 баллов
    Начинаю новую рубрику "Пока все в майне" Эта рубрика посвящена идеям, маленьким полезностям, хитростям в игре и программировании. Что я найду интересное и занимательное или на мой взгляд нужное для игры майнкрафт, буду размещать здесь. Ну и стартом рубрики будет моя новая мощная библиотека для автоматического поиска и исправления багов и ошибок в программках. Я ее очень долго разрабатывал и потратил много очень сил, и наконец завершил титаническую работу. Теперь с этой библиотекой ваши программы будут работать намного устойчивее. Библиотека все сделает за вас и пофиксит все баги! Итак. Вы уже наверно ждете этого чуда?! Приступим! Например! У нас есть программка: -- Подключаем мощную автодебажинговую библиотекуlocal bugfix = require('bugfix')---=== Пример использования в программе! ======-- Например, у нас есть функция, которую нужно полечить от крашей и ошибок:myFunc = function (a1, a2) local var1 = a1 + a2 print('Здесь код myFunc выполнится! var1 = ', var1) --> выведет результат 25 --[[ здесь в секции IF возникнет ошибка, так как мы пытаемся сравнить var2 --> nil c number. Функция myFunc вылетела бы и крашнулась, НО.... мощная библиотека начнет свою работу и пофиксит эту ошибку автоматически! Сама! --]] -- var2 = 40 --> Эта строчка закомментирована специально, чтобы вызвать ошибку. -- И сейчас здесь начинается магия автоматического фиксинга! if var2 > var1 then print(var2) endend-- Внимание! Запускаем любую нашу функцию в безопасном режиме и в случае краха-- либа выполняет автоматическую сверхмощную отладку!!!bugfix.controlBug(myFunc, 5, 20) -- передаем имя и требуемые аргументы Теперь создайте файл bugfix.lua и разместите в ней следующий код библиотеки: local shell = require('shell')libBug={}-- == Безопасный запуск Ваших программ и автоматический фиксинг ошибок и багов ==function libBug.controlBug(func, ...) if type(func)~='function' then return end local state, err = pcall(func, ...) if not state then local result = rabotayBlya(err) print('Обнаружена ошибка: '..err..'\n'..result) os.sleep(10) shell.execute('reboot') endend---=== Сверх мощный модуль отладки кода и устранения любых багов!!! ===function rabotayBlya(str_error) local buben = 'Buben Boom!\n' for i = 1, #str_error do io.write(i..' '..buben) os.sleep(.4) if i > 64 then break end end return 'http://i.imgur.com/fnUgPQS.gif'endreturn libBug Вот и все! Либа сделает свое дело. Можно код писать теперь как попало . Не делать проверок в программках и не о чем не волноваться, комментариев в коде не нужно писать и прочее прочее. Если возникнет баг, либа придет к Вам на помощь и все пофиксит! Просьба к гуру! Не выдавайте секрет либы.
  17. 6 баллов
    Лаборатория построена и обустраивается! В возведении участвовали Krutoy, Zer0Galaxy, AlexCC и Fingercomp, за что им спасибо. Лаборатория - открытое здание, и его может навестить любой желающий. Она находится справа по дороге мимо Банка.
  18. 6 баллов
    Вчера уважаемый форумчанин Zer0Galaxy предложил идею как можно телепортировать между компьютерами, без необходимости находится конечному телепортеру в одной сети(Как компоненты), можете смотреть видео ниже. https://www.youtube.com/watch?v=e530frIKUGc
  19. 6 баллов
    Автоматический крафт предметов роботом без лишних модов. Программа для мода OpenComputers. Попытка реализовать какой-то уровень автоматизации крафтов без дополнительных модов. Этап разработки. Предварительный обзор. https://www.youtube.com/watch?v=SiQfV10fHPc
  20. 6 баллов
    Приветствую Вас в очередной записи. Решившись, что отвечать на вопросы типа "как скопировать программу на дискету" каждому проходящему — непозволительная роскошь, я и пишу это здесь. Цель: описать процесс постигания магии бессменных белых букв на чёрном фоне, да так, чтобы это было непонятно всем. Эта часть будет необычной в цикле, так как именно сюда я буду выливать прогресс и делать обновления. Что же, запаситесь терпением и приготовьтесь скучать, да так, как Вы ещё не скучали, ибо именно в этой Башне лежат все скучные вещи. Сложность: просто 25% Скучность: средне 65% Баланс дубовости: для начинающих 20% Опустим такую невероятно сложную вещь, как установка системы, о которой уже было рассказано на нашем форуме. Вы вытащили дискету, нажали [y] и затем [Enter], готовите уже свою мышку к кликательным пыткам, надеясь, что эти буковки на чёрном фоне до установки — всего лишь результат лени разработчиков, дожидаетесь загрузки и... "О, святые криперы, что это?! Они меня замучать хотят этими буковками непонятными?!" Что же, приветствуем Вас на борту этой замечательнейшей операционки, работающая на чистом Луа. Основные принципы: Вы можете выкинуть свою мышку (чего, к слову, мы делать не советуем). Всё управление идёт через клавиатуру, как минимум, в стандартных программах. Эта штука чрезвычайно похожа на ОС типа *nix. Если эти 4 знака Вам знакомы, понятны и не вызывают страха — поздравляю! Вы уже на 90% владеете инструментом. Вся система — это такой большой Проводник. Можно путешествовать по разным папками и смотреть их содержимое. Первым делом сразу советую выучить английский, хотя бы немного. Всё потому, что русского языка вы просто так не увидите. Документация на английском, подсказки на английском, команды на английском, в общем — всё на иностранном языке. Выучили? Тогда приступим. И вот, прочитав истинно скучную штуку (или пропустив, но это не по-крутому, знай), мы трём носик об этот квадрат Малевича, исписанный в лучших традициях русского народа надписями типа "здесь был Вася" "RAM", "OpenOS" и какого-то магического заклинания. И всё — в белой рамочке. А ниже нарисовано решето. Мигает штука, похожая на детальку из "Лего". В общем, непонятно даже, как можно пользоваться такой штукой. ФАЙЛОВАЯ СИСТЕМА CWD и ls Итак, представьте, что Вы открыли проводник. И сейчас Вы находитесь в папке "/", о чём говорит (-ят) символ (-ы) слева от решётки. То, что там написано, называется текущей директорией. По-английски — CWD (Current Working Directory). Проверить, что находится в текущей директории, поможет команда ls. Введите команду и нажмите [Enter]. Отобразится список файлов, причём, если у Вас монитор второго и третьего уровней, то синим будут обозначены директории, жёлтым — ссылки, а зелёным — программы. Иначе ­же всё будет белым цветом. cd Сложно? Это ещё только начало. Допустим, что список файлов в текущей директории Вас не удолевтворил, и Вы хотите большего. Что насчёт перехода в другую папку? В Проводнике вы кликали 2 раза по ней — здесь же придётся вводить имя папки вручную. Команда: cd <имя папки>. Обращаю внимание, что угловые скобки писать не нужно. Они показывают, что аргумент программе обязателен. Впрочем, об этом в другой раз. Допустим, нам вдруг страстно захотелось в папку /bin/. Пишем: cd /bin/. Вуаля! Слева от решётки появляется надпись /bin, и Вы оказываетесь в другой папке. Пути Итак, мы в /bin/. Думаю, нужно ознакомиться с файловой системой ОС. Для каждой папки есть: содержимое родитель корень путь Содержимое папки мы узнавать умеем — командой ls. А что такое родитель, корень и путь? Допустим, есть папка "Файлы". В ней — ещё 2 папки, "Документы" и "Программы". В папке "Документы" будут файлы "отчёт001", "отчёт002" и "отчёт003". В папке "Программы" — "Программы2" и "Игры". Итого, структура нашей системы такова (структура — это описание всего содержимого папки. Называется часто деревом): + Файлы | + Программы | | | + Программы2 | | | + Игры | + Документы | + отчёт001 + отчёт002 + отчёт003 Как видно, файл "отчёт003" находится в папке "Документы". Поэтому, для файла "отчёт003" родителем будет папка "Документы". В общем, это папка, в котором лежит файл или папка. Для "Документы" родитель — "Файлы", для "Игры" — "Программы", для программы — снова "Файлы". Вот так всё запутанно. Далее. Взгляните на дерево ещё раз. Как видно, у папки "Файлы" нет родителя. Эта папка называется корнем файловой системы. Все остальные папки так или иначе находятся в корне. Путь — это последовательная запись вложенных структур до нужного файла. Сначала папка "Файлы", в ней — папка "Документы", в "Документах" — "отчёт001". Следовательно, у файла "отчёт001" путь следующий: Файлы/Документы/отчёт001. В OpenComputers корнем является папка /, с которой всё и начинается. Следовательно, если папку "Файлы" поместить в "/", то для перехода в папку с файлом "отчёт002" можно прописать команду cd /Файлы/Документы/ Абсолютные и относительные пути. ./ и ../ Если путь начинается с корневой директории, то он абсолютен. Но есть пути относительные данной директории. Например, путь к папке "Игры" относительно "Программы2" таков: ../Игры/. Заметили ../? Этот путь есть в каждой папке и обозначает родительскую директорию (для корня ведёт на саму себя). То есть cd ../ переходит на директорию выше. Если прописать эту команду, находясь в папке "Игры", то Вы окажетесь в папке "Программы". Далее — в "Файлах", а так как это корень, то продолжение ввода не будет менять рабочую директорию. Кроме того, папка ./ ведёт на саму себя. То есть Файлы/ равен, например, Файлы/./././././././. И, напоследок, чтобы просмотреть список файлов без перемещения в нужную директорию, пропишите ls [путь до папки] Изначально, я продолжил запись описанием реальной файловой системы на ОС, но решил сократить объём повествования. Потому в следующей части — редактор, справочная система, объяснение структуры папок на ОС. В конце я привожу список новых слов и терминов: текущая директория — папка, в которой Вы находитесь. Известна как CWD (Current Working Directory) ls — просмотр содержимого текущей директории cd <путь> — перемещение по файловой системе структура — описание содержимого директории. Также известна как дерево родитель — предыдущая по вложенности папка. Директория, в которой расположен текущий каталог корень файловой системы — папка, не имющая родителя. Первая по вложенности. В OpenComputers — / путь — последовательная запись вложенных структур до нужного файла абсолютный путь — путь от корня до нужного файла/каталога относительный путь — путь от текущей директории до нужного файла/каталога ../ — ссылка на родительскую директорию ./ — указывающая на саму себя папка ls [путь до папки] — просмотр содержимого заданного каталога Повествование запутанное, сумбурное и непонятное, в лучших традициях Башни. Специально писал ночью для такого эффекта. Но, к сожалению, следующая часть будет веселее и активнее, с картинками и красотой. Жду оценок 1/5, игнорирования и злостных комментариев из-за этого. →
  21. 6 баллов
    ПОЛНЫЙ ОБЗОР Computronics версии 1.5.5 Часть третья: Карточки Приветствую Вас, уважаемый читатель! Думаю, самое подходящее время, для того, чтобы написать новую часть обзора CX. В данной части я расскажу всё о карточках, которых тут как раз четыре вида: Beep Card (бипающая карта) Spoofing Card (карта-маскировщик) Particle Card (карта частиц) И, конечно же, Self-Destruct Card (карточка самоуничтожения). I. Beep Card. a.k.a. "Бипающая карта" Данная карта предоставляет продвинутый аналог системного динамика, который позволяет проигрывать сразу несколько звуков. Принимает таблицу следующего типа: Функции: beep.beep(freqLength:table):Boolean — запускает "аккорд" из таблицы freqLength, в которой записаны для каждой пары частота и длительность. beep.getBeepCount():Number — возвращает текущее количество проигрываемых нот. Предмет: II. Spoofing Card. a.k.a. "Карта-маскировщик" Данная карта позволяет отправлять сообщения с возможностью указывания адреса отправителя! Уже начали думать над взломом Банка? Тут-то и придёт конец вашей идее. Данная карта работает только для проводных сетей, но не для беспроводных, к сожалению. Функции. Те же, что и у обычной сетевой карты, но к функциям отправки сообщений в качестве необязательного первого аргумента можно передать желаемый адрес отправителя. Предмет: III. Particle Card. a.k.a "Карточка частиц" Данная карточка позволяет спаунить частицы в зоне 16х16х16 блоков с центром в блоке, где она находится. Полная таблица частиц доступна здесь: http://minecraft.gamepedia.com/Particles Функции: particle.spawn(particle_name:String, x:Number, y:Number, z:Number[, speed:Number]):Boolean || particle.spawn(particle_name:String, x:Number, y:Number, z:Number[, x_speed:Number, y_speed:Number, z_speed:Number]):Boolean — заспаунить частицу particle_name по определённым относительным координатам с определённой скоростью. Блок: IV. Self-Destruct Card. a.k.a "Карточка самоуничтожения" "Каждый нормальный цивилизованный житель нуждается в данной штуке", — гласит тултип к этой карточке. И он, знаете, прав! Я думаю, объяснять, что эта карточка делает, мне не нужно. Просто приведу список функций. Функции: self_destruct.start([timer:Number]):Number — устанавливает таймер на самоуничтожение. Если не указано, равно пяти секундам. Таймер самоуничтожения остановить или отредактировать невозможно! Трижды подумайте, прежде чем запускать отсчёт! self_destruct.time():Number — возвращает оставшееся время до самоуничтожения. Предмет: Вот я и закончил рассказывать о карточках в данном моде. Остались только апгрейды и предметы интеграции с другими модами, но о них я уже вряд ли буду рассказывать. А пока Вы можете оставить комментарий, подписаться на запись и поставить оценку)
  22. 6 баллов
    Наконец то нашлось у меня время сделать программульку, которую умолял уже давно всех сделать. Робота-Грифера. С самого начала времен, еще с эпохи появления мода ОС я орал, что роботы приват не рушат, не ломаю ничего, но прекрасно сохранят за собой статус "тихого взломщика и воришки". Роботы поднимают предметы с земли, шуршат по инвентарям, печкам, сундукам, управляют редстончиком в привате и прочее. В видео вы сможете убедиться, что они не плохо справляются с ключиком и являются профессиональными воришками. Лазают по системным блокам, снимают машинки ИК, ветрячки, СП, печки мазераторы и прочее. Включают рычаги и кнопки. Больше чем уверен, что робот может сожрать мед весь из улья и спереть весь пчелиный рой вместе с выводком и редкими трутнями. Лазает ли он с помощью капсул в жидкостные системы, не проверял, скорее всего он высосет материю и биогаз легко. На ИТ нет многих модов просто. Мне как админу, самому делать для игроков программу Грифера было не приоритетно. Игроки просто видели, что мол и своего робота не понятно как заставить в своем привате работать, а тут еще как-то к кому-то залезть, да ну его, и продолжали крафтить дальше свои печки на МТ, трубы на ИТ и реакторы. Магнифику(игрок такой унас был, завод построил на 60 чанков) писал еще на CS(старый наш сервак на 1.6.4.), что мол, ты чего, сдурел, коммунизм что ли наступил, сундуки на улице поставил и прочее. А он говорит, да все равно, мне не жалко)))) Старожилы помнят, кто долго на проекте. Вот чисто нубасовский дом, который первый подлежит налету роботов и высасыванию всего, что там есть, до нитки, ну не хватило человеку послтака песка на потолок, ну сделай из дерева, топор же ломает дерево высотой в 100 блоков под корень, не-е-е-е-е-е-е, зачем. Пусть дырень будет. И домику уже почти 40 дней как хозяина нет, цел целехонек стоит=) : Вот такие "антенки" разбираются под 0 почти, сами в видео посмотрите: во первых, это не эстетично, во вторых забираются солярка, хранилище и потроха компа. Неужели нет кирпичиков, обложить аккуратно и сделать башенки Wi-fi???? Я своим Байтом проехал в Банк, снял зарядку на 40 лямов в полу в 6 кабинке и через дырень, куда кидают товар, прошмыгнул в хранилище. А там МЕ диски лежат, на которых каждого вида руд по 250К и 27К алмазов. Банк уже закупил пластиковые пуленепробиваемые двери-жалюзи. Робот - это блок а а не сущность, и даже в открытые двери он не пройдет. А вот дрон легко Спас Дата-центр OpenNet от отключения и перебоев c питанием: Вот рекомендуемое размещение СП в ваших домах на газонах и лужайках. Во первых, на ВЕБ карте нет зияющих дыр в вашей крыше (хотя сомневаюсь, что это кого-то волнует, кроме меня, как выглядит сервер и карта в целом), так как не все блоки из модов отрисовываются, во вторых ваши СП в безопасности, красиво и эстетично, провод уже идет в подвальчик, там где генматы и машинки: Сразу оговорюсь, это не то, что фикситься будет как-то, это еще и поощряться будет, что на ИТ идет война за выживание, борьба роботов и людей. Где игроки понемногу учатся программировать и наращивают функционал своих программ. Выживет тот, кто проворнее, быстрее, хитрее. У кого проги более мощнее и функциональнее. Использование хитрых приспособлений, ловушек, сканеров, сенсоров с применением комп. модов будет только приветствоваться. Вон даже уже МТ-шники поняли, что да, много модов это интересно, но это лаги-баги и тупиковый путь развития. Толку от этих модов нет, и не важно, сколько там ты скрафтишь тех печек и труб с турбинами. Они идут только как дополнение к комп. модам, которые в сотни раз интереснее любой крутой печки или центрифуги с соковыжималкой. Для донатного сервера да, покатит, но нам с нашими скромными мощностями сервера и концепцией сообщества игроков-программистов эта вязанка модов ни к чему. П.С. код по этическим соображениям и во избежания резкого скачка грабежей,сражений и войны за территорию, покрытие сетей и зоны влияния, а также из соображений, что не все новички там в в курсе, что и куда пихать и играют не каждый день на сервере, выложу через несколько дней в том виде, который он сейчас (это кусок от моей глобальной программы для универсального робота, который выживает сам в мире, ведет добычу, сендит инфу сквозь миры хозяину, сам решает, как заряжаться(всплывать на поверхность на солнце или жрать топливо), сохраняет тайники с ресами добытыми и записывает коры и прочее и т.п., так называемый ИИ фрилайф-майнинг). А пока рекомендую пересмотреть систему безопасности домика, поставить сканеры (радиус у них 64 блока, ним можно даже ветряки охранять и успеть снять их раньше, чем на вас налетит группа игроков-атакеров с роботами) В скором времени установлю компьютроникс (далее КТ), там система внутреннего чата, радары и сенсоры мобов и игроков для роботов, и даже плата самоуничтожения для робота. С ним сервер ИТ станет еще более компьютеризирован. Ну и собственно, ночное видео-приключение Алекса и Байта: https://www.youtube.com/watch?v=seoHI4fZzKA П.С. ссылка на код на программы
  23. 6 баллов
    И так, Вы попали в белый список, построили дом, добыли ресурсов, собрали свой первый компьютер, написали первую программу. Настало время поведать о своих успехах миру. Лучший способ сделать это - создать OpenNet-сайт с изложением всех своих достижений. Для этого Вам понадобится WEB-сервер. Это может быть обычный ОС компьютер. Желательно обеспечить его бесперебойным питанием и разместить в постоянно прогруженном чанке. В противном случае Ваш сервер может оказаться временно недоступным. Вопрос питания и прогрузки чанка я оставляю на усмотрение владельца и расскажу о требованиях к аппаратному и программному обеспечению сервера. Сервер должен содержать беспроводную сетевую плату, а это значит, что системный блок сервера должен быть не ниже 2-го уровня. Требования к остальным компонентам самые минимальные. Если же Вы собираетесь использовать этот компьютер не только как сервер, но и создавать и просматривать на нем же свои страницы, комплектация должна быть получше. Вот, что бы я рекомендовал: - Системный блок - 3-го уровня; - Процессор 2-го уровня; - Видеокарта 2-го уровня; - беспроводная сетевая карта; - две линейки ОЗУ 2-го уровня; - жесткий диск 2-го уровня; - Lua BIOS; - монитор 2-го уровня; - клавиатура. Установку программного обеспечения начинаем с операционной системы. Надеюсь, Вы знаете как это делается. После установки OpenOS пытаемся подключиться к сети OpenNet. Для этого заходим в интерпретатор Lua, копируем в буфер обмена следующую строку: on=component.modem;e=event;on.open(1)on.broadcast(1,"","","getip")function m()r={e.pull(10,"modem_message")}end;m()ud="update"ip=r[6]function sv()on.send(r[3],1,ud,ip,ud,"getFile","client/"..p)m()filesystem.makeDirectory(filesystem.path(p))f=io.open(p,"w")f:write(r[8])f:close()end p="lib/opennet.lua"sv()p="on/update.lua"sv()loadfile(p)("install") вставляем ее в редактор Lua кнопочкой Ins и запускаем на выполнение. В результате выполнения из Сети будут скачаны все необходимые для подключения файлы и разложены по нужным папкам. Если же чудо не произошло, скорее всего Вы находитесь вне зоны покрытия OpenNet. Обратитесь ко мне и я постараюсь помочь. Если установка прошла успешно, перегружаем компьютер и создаем папку /web mkdir webcd web В этой папке будут храниться страницы нашего будущего сайта. Почему отдельная папка а не корень? Да потому, что к ней будет осуществляться удаленный доступ, причем и на чтение и возможно на запись. И если бы это был корень диска, то каждый хакер при желании смог бы почистить на нашем сервере весь диск. Имена файлов, содержащих страницы сайта могут быть любыми, но непременно должны присутствовать два файла: "index" и "404". Файл index должен содержать главную страницу сайта, а 404 - текст, который будет возвращаться при попытке открыть несуществующую страницу. Создадим файл index, содержащий текст: Главная страница моего сайта И файл 404 с текстом: Извините, запрашиваемая страница не найдена. Для начала попытаемся открыть файл index браузером прямо с сервера: onBrowser /web/index Вот что мы должны увидеть: Поскольку мы указали путь к файлу, начинающийся с косой черты, файл будет открываться браузером не по сети, а с локального компьютера. (продолжение следует)
  24. 6 баллов
    Сизифов код Расскажу тебе поучительную историю, брат. Присаживайся поудобнее, да тушеными мухоморами угощайся. История, значит, такая: Был у нас на проекте игрок. Назовем его Сизифом. И лежало на нем проклятие: что ни напишет — говнокод получается. Бывало, всего две строчки напишет — и даже там говнокод выходит. И вот, старается Сизиф, шлифует свою программу. И казалось бы, совсем чуть-чуть остается. Но добавляет строчку — и опять говнокод получается. Что он только ни делал: брал примеры из статей, воровал дискеты из компьютеров других игроков, и даже как-то скачал себе рекурсивную копалку Totoro. Но стоило ему внести в этот код небольшую правку, всё в скатывалось в говнокод. И прекрасный робот-шахтер превращался в тыкву не дожидаясь полуночи. И вот однажды робот Сизифа не выдержал издевательств и сделал жалобный «бип» почти человеческим голосом. Глянул Сизиф на экран, а робот пишет ему: — Обожди писать код. Включи голову, будь программистом. Призадумался тогда Сизиф над правками кода, стал размышлять над тем, что делают разные команды и как они сочетаются между собой, и вот, не прошло и недели, как написал он свой вариант копалки. И как знать, мог бы он написать копалку даже круче Totoro и выкопать все алмазы на сервере, но неожиданно вайп случился. Удалил тогда Сизиф свой старый аккаунт, зарегистрировался под новым ником и, поговаривают, даже в вайт-лист попал, и скоро мы сможем увидеть его прекрасные программы. Хотя казалось бы, говнокодером раньше был. Историю эту я узнал из перехваченного секретного сообщения в закрытой части OpenNet, расшифровал худо-бедно, да тебе поведал. Настоящий ник игрока сообщать не буду, и так уже много лишнего рассказал. Ты же знаешь — администрация наша кровава. Но этой историей я не мог не поделиться с тобой. Радуйся, брат! Ибо в твоей голове сокрыта великая сила.
  25. 6 баллов
    Minecraft Mods #1 Обзор обновлений MoarPeripherals 1.5 #1. Computer Controlled Crafter. Приветствую Вас в первой части обзора обновлений аддона к CC MoarPeripherals версии 1.5. Мы рассмотрим один из новых блоков, именуемый Computer Controlled Crafter, или, в моём русском переводе, крафтер. :P I. Что это и с чем его едят? Крафтер — это блок, позволяющий крафтить с компьютера! В принципе, всё =) II. API. Крафтер имеет несколько функций: getInventorySize() :: numberВозвращает кол-во слотов для крафта (их девять ) [*]craft() :: boolean Собственно, тот самый рычаг, и если за него дёрнуть, то начнётся крафт! Если всё пройдёт успешно, положит рядом с ингредиентами и завизжит отрадости: true! Если же нет... то где-то Вы ошиблись =) [*]getStackInSlot(slot) :: table Некоторый аналог Item Dictionary. Позволяет узнавать доскональную инфу о блоке/предмете. Возвращает таблицу, к которой, я обещаю, мы скоро вернёмся. [*]isRecipeValid() :: boolean Суть ясна из названия функции. Возвращает true, если можно скрафтить загадочную хрень, и false, если рецепт не существует. [*]getCraftingSlot(slot) :: table То же, что и getStackInSlot(), но для предметов в сетке крафта. [*]setCraftingSlot(slot, item) :: boolean Аккуратно укладывает на верстак... скорее, дисплей, так как взаимодействовать напрямую нельзя, предмет в нужный слот (к этому мы скоро вернёмся). [*]clearCraftingSlot(slot) Недвусмысленная функция. Очищает слот в сетке крафта. [*]clearCraftingGrid() Менее аккуратный собратец предыдущей функции. Очищает всё скопом. Итак, порцию страшилок Вы получили... Теперь перейдём к самому весёлому: к кодингу! III. Крафтим! Начнём с ГУИ. В мой инвентарь Вам заглядывать смысла нет, так что показываю только верхнюю часть. Верхняя часть делится ещё на 3 части! Нет, не пугайтесь преждевременно. Первая часть — сетка крафта, вторая — клетка результата, а третья часть — это инвентарь. Инвентарь можно пополнять или забирать из него с помощью труб, роботов, компьютеров. Но не об этом речь. Предположим, мне позарез нужны Raw Circuit Board. Крафтятся они из блока глины, кактуса пережаренного и золотого зубчика. Кладём в инвентарь ингредиенты. Я написал маленькую программу test, в которой показывается код и он же выполняется. Разбираем! Во-первых, подключаем перефиральное устройство. Затем получаем инфу об айтемах. Для того, чтобы не париться, возьмём готовую ф-ию "getStackInSlot". Что это за цифры? Слоты в инвентаре и в верстаке нуммеруются слева направо, сверзу вниз, то есть так: 1 2 3 4 5 6 7 8 9, или, в случае инвентаря: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18. В слоте 1 лежит кактус пережаренный. Потому в переменную cactus_green заносится та самая таблица с инфой об айтеме... Её состав рассмотрим попозже =) Теперь сеттинг рецепта. Пользуемся ф-ей setCraftingSlot(). В первом аргументе передаём слот, куда хотим положить предмет (не забыли ещё нумерацию?). А во втором — предмет. На самом деле, не обязательно иметь предмет в инвентаре. Можно написать из головы, но об этом — чуть позже. Теперь, если мы откроем ГУИ, он будет выглядеть так: Но просто так Вы плату сырую не возьмёте, опять нужен комп. Помните, я говорил о волшебном рычажке? А вот и он! Последняя строка. Мы крафтим сам предмет! И если мы опять заглянем в столик, то обнаружим такую картину: Скрафченный предмет лежит вместе с остальными, так что вытащить его можно только с помощью фильтра. IV. Убираем за собой. Намусорили, а убирать кто будет? Мы, конечно же =) Пользуемся свякой clearCraftingSlot() и clearCraftingGrid(). Суть понятна из названия. Скриншоты: V. Автономный режим activated! И напоследок о том, что из себя представляет таблица. mod_idID мода. [*]raw_name Сырое имя. То есть класс предмета/блока. [*]max_size Максимальный размер стека. [*]max_dmg Максимальная metadata. Имеет место быть только у ломающихся инструментов. [*]dmg Значение metadata (то есть числа s: ID:s). В метадате содержатся данные, например, о цвете шерсти или красителя. [*]qty Количество в данный момент. [*]id ID айтема по новым стандартам (modID:itemName) [*]display_name Имя, какое мы видим, наводя на предмет. [*]name Тип айтема (блок/предмет) gold_nugget = {}gold_nugget["id"] = "minecraft:gold_nugget"gold_nugget["dmg"] = 0ccc.setCrafttingSlot(1, gold_nugget) Для составления "личного дела" айтема достаточно 2 значений: это id и dmg.После этого система сможет понять, какой именно айтем Вы просите. VI. Заключение. Теперь Вы знаете, что такое CCC и как им управляться =) Надеюсь на "пятаки", "лайки", комментарии. Ждите новых записей в моём блоге!
Таблица лидеров находится в часовом поясе Москва/GMT+03:00
  • Рассылка

    Хотите узнавать о наших последних новостях и информации?

    Подписаться
×