Opencomputers/туториал: работаем с pastebin и github
Содержание:
- Прокси[]
- Installation
- Интерфейс блока[]
- What’s in the mod?
- Программирование[]
- Standard Libraries
- «Главный» компонент[]
- Движение робота[]
- Инструкция по установке MineOS:
- Custom Libraries
- Contributing
- Апгрейды робота
- Инициализация
- Работа с инвентарем[]
- Proxies
- Разбор кода
- Extending
- Что потребуется?[]
- Программный интерфейс (API)[]
- New Features/Support/Fixes
Прокси[]
Есть два способа использования адресов компонентов. Первый — . Например:
local component = require("component") component.invoke(modemAddress, "broadcast", port, data)
Более удобный способ — прокси. Прокси — это таблица, которая предоставляет одноимённую функцию для каждого вызова метода через . Кроме того прокси имеет два поля: , которое определяет адрес компонента, и , которое содержит его тип. пример использования прокси:
local component = require("component") local proxy = component.proxy(address) -- The call above using the proxy: proxy.broadcast(port, data) -- The common proxy fields: print(proxy.address) -- address passed to component.proxy above print(proxy.type) -- "modem"
Примечание: когда вы обращаетесь к главному компоненту через или — вы используете его прокси.
Installation
Having booted your computer you should be greeted with a motd (which stands for “Message of the Day”) and the shell prompt, .
The computer at this point is usable and, assuming you have a hard drive in the case of the computer, you have writable storage space to create files. However you’ve only booted the system using the OpenOS floppy disk. In other words, your current directory is read-only; i.e. you cannot create or modify files in your current directory.
To list what filesystems are available, run
The output of has 4 important columns.
-
filesystem address
First the filesystem component address, a unique 128 bit value whose first 32 bits are shown in hexadecimal.
-
mount point
The second column, following the word “on”, informs the user where in the directory tree the filesystem is mounted. This is also known as the mount point. The filesystem mounted on “/” is also known as the “rootfs” (or root filesystem). The rootfs is the mount point of the filesystem that booted the computer. If you have installed an operating system you’ll find its system files in the directory tree below .
-
read/write access
The third column shows either “(ro)”, which stands for “read-only”, or “(rw)”, which stands for “read/write”. OpenOS only supports these two access permissions and they are filesystem wide (as opposed to more modern filesystems that have separate permissions per directory and per file even under the same filesystem mount point). In this image we see that the rootfs is mounted read-only. This is because I have booted the computer with an OpenOS floppy disk, and loot floppy disks are read-only filesystems.
In case the name of the access (ro vs rw) was not clear, you cannot modify or create files in a filesystem mounted read-only.
-
label
The last column displays the filesystem’s label or the filesystem’s component address in the case it has no label. Loot disks always have their loot disk name as the filesystem label. You may notice that the filesystem mounted on in my example has a very long “label”. This is because I am using a brand new tier 1 hard drive which doesn’t have a label yet and thus its address is displayed which causes the terminal to wrap the text.
You may also notice that a few of the filesystems are mounted multiple times. The behavior of OpenOS is to automatically mount filesystems in the /mnt directory, with the first 3 or more unique letters of its address as the directory name. Some components get a special mount location, such as the filesystem that booted the system. In this case, the floppy disk on /mnt/bc3/ is the boot filesystem, and thus is the rootfs (on /). To help make the listing more readable, sorts the listing by address.
We learn from this image that the rootfs is read-only. This reminds me that I have booted from a loot disk, and that I have not yet installed OpenOS to my hard drive. The computer would fail to boot were I to remove the floppy.
All I need to do is run
You can enter y or just press ENTER (the uppercase “Y” in the [Y/n] notation informs you that “Y” is the default answer if an empty line is entered). After you confirm the install, you’ll see a verbose listing of all the files being copied to your hard drive. When the installation is complete confirms you are ready to reboot the system. When the system reboots, your rootfs will be the hard drive you just installed OpenOS to.
Running again will show that rootfs is now (rw).
Интерфейс блока[]
Интерфейс трехмерного принтера
Верхний слот предназначен для специальной печатной массы. Принтер вмещает два стека (256 000 ед).
Нижний слот занимает картридж с красителями. Объём внутреннего хранилища — два картриджа краски (100 000 ед).
По команде от компьютера, принтер берет немного печатной массы и краски и «распечатывает» в крайний правый слот запрограммированную модель.
Если модель получилась не совсем удачной, или распечатали не то, что надо, её можно повторно переработать в печатную массу, просто переместив неудачную модель в верхний слот принтера. Краску таким образом не вернуть.
What’s in the mod?
Computers
The name may have given it away: the main feature this mod adds are programmable computers. OpenComputers itself allows writing programs using the Lua programming language, specifically Lua 5.2. Computers can be programmed at a very low level, but the built-in operating system emulates a Lua environment as close to “vanilla” Lua as possible within the restraints of the sandbox it is running in.
To make your life easier, computers persist their script state across saves; this means they’ll continue executing where they left off when the chunk they are in was unloaded. If a compatible power mod is installed alongside OpenComputers, computers will require energy to run, and numerous components will require energy for certain operations.
Robots and Drones
Aside from the stationary computers and components, OpenComputers also provides robots and drones, computers that can move around the world and interact with it similar to how players can. Robots are more powerful than drones, they can use tools and contain a much larger number of components. Drones are much more mobile than robots and can perform a few actions robots cannot, such as leashing animals.
There are also several other computer devices in the mod, such as servers, essentially allowing for four computers in one block, microcontrollers, cheaper but more limited computers, as well as tablets, which are basically portable computers.
Modularity
A key focus of OpenComputers is modularity, allowing you to choose very dynamically from which parts to build your computers, robot and other devices. There are multiple tiers of computer cases, screens, graphics cards, network cards and so on. In that way there is also a certain level of progression in the mod, as you work towards building better, faster and more powerful computers.
Integration
OpenComputers provides integration with many other mods: support for bundled redstone (Project Red, Redlogic and MineFactory Reloaded), covering cables (FMP and Immibis Microblocks), and obviously accepting power from several mods (RF, EU, Factorization Charge, Mekanism Joules, AE2 energy).
More interestingly however, OpenComputers provides a block that allows more in-depth interaction with other mods’ blocks, the Adapter. For supported blocks, the adapter will make those blocks available as components to connected computers, allowing them to read information such as energy levels and possible issue commands, such as playing notes on a note block. Many mods also provide built-in support for OpenComputers, meaning you can just hook up their blocks to a cable without needing an Adapter.
Config
Most things in OpenComputers are configurable. Don’t like the power requirements? Change them or disabled them entirely. Screens not rendering from far enough away? Increase the render distance. The config file is heavily documented, so it should be pretty clear from each config entry’s comment what it does.
Aside from general configuration, it is also possible to adjust each of the item recipes in OpenComputers via recipe files – no need for Minetweaker! There are also a few different recipes set available, have a look in the config/opencomputers directory.
Программирование[]
Возьмем дискету и вставим в компьютер. Назовем ее и создадим на дискете программу . (Подробно о работе с дисками и дискетами, переименовании и создании программ — см. Туториал: Работаем с дисками.)
Вы можете перепечатать следующий код вручную и сохранить, либо скопировать его и вставить (⇧ Shift+Insert в игровом редакторе).
И наконец, вы можете открыть (свернув игру на время, и поместив дискету в инвентарь) папку . Там находится только что созданный файл . Вы можете открыть его любым редактором и вставить текст программы.
Код:
local robot = require("robot") local comp = require("computer") local size = 9 function harvest() -- fly to start robot.forward() for y=1, size do -- harvest one line robot.swingDown() robot.placeDown() for x=1, (size-1) do robot.forward() robot.swingDown() robot.placeDown() end -- turn if y%2 == 1 then robot.turnLeft() robot.forward() robot.turnLeft() else robot.turnRight() robot.forward() robot.turnRight() end end -- return for y=1, (size-1) do robot.forward() end robot.turnLeft() for y=1, (size-1) do robot.forward() end robot.turnRight() robot.forward() robot.turnAround() end function unload() robot.turnAround() for c = 2, 16 do robot.select(c) if robot.count() > 0 then robot.drop() else robot.select(1) break end end robot.turnAround() end while true do -- one hour sleeping for i=1, 10 do os.sleep(360) print((10*i)..'%') end -- harvest() if robot.count(2) == 64 then unload() end end
Standard Libraries
OpenComputers makes an effort to largely emulate the standard library in areas that would usually interact with the host system — that being the I/O library. There are a few differences, which you can look up here: differences in the standard libraries. Most notably, the debug library is mostly unavailable, and only accepts text source files, no binary / pre-compiled Lua programs (for security reasons).
These standard libraries are available in the global environment and thus are immediately available; meaning they do not need to be loaded in your scripts to be accessible.
-
Not a library, but a commonly used standard method for printing text to stdout.
- snippet.lua
-
print("hello world")
«Главный» компонент[]
Component API назначает один из компонентов каждого типа «главным». Если блоков одного типа несколько, «главный» выбирается случайно. Вы можете обращаться к главному компоненту оператором , где — это тип.
Например:
lua> component.gpu.address xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
В качестве альтернативы, вы можете воспользоваться оператором . В этом случае можно получить ошибку если не существует главного компонента этого типа. Это можно предварительно проверить оператором . Получить сообщение об ошибке может быть понятнее, чем в первом варианте.
Главный компонент используется, когда компьютер определяет на какой монитор выводить изображение при первом запуске.
Движение робота[]
Правила передвижения робота
В версии OpenComputers 1.5.0, правила согласно которым робот движется в воздухе, были изменены. Теперь они выглядят так:
- Робот может двигаться, только если стартовая или конечная точки корректны.
- Позиция под роботом всегда корректна. (Если там нет твердого блока.)
- Позиции до вверх от твердого блока корректны.
- Любая позиция вплотную к стороне твердого блока — корректна (то есть роботы могут двигаться «по стенке»).
Параметр задается в конфигурации мода, и по умолчанию равен 8 блокам.
Для того, чтобы робот мог подниматься выше этого предела, установите в него апгрейд высоты полета.
Инструкция по установке MineOS:
Перед установкой убедитесь, что ваш компьютер соответствует минимальной конфигурации:
Устройство | Tier | Количество, шт |
---|---|---|
Системный блок | 3 | 1 |
Экран | 3 | 1 |
Клавиатура | 1 | 1 |
Центральный процессор | 3 | 1 |
Видеокарта | 3 | 1 |
Оперативная память | 3.5 | 2 |
Интернет-карта | 2 | 1 |
EEPROM (Lua BIOS) | 1 | 1 |
Дискета с OpenOS | 1 | 1 |
Также рекомендуется добавить беспроводной модем для объединения компьютеров в домашнюю сеть.
Если вы используете какие-либо модификации, предоставляющие энерго-систему (IC2, TE, IE, Mekanism и т.п.), то вам также потребуется преобразователь энергии и ее источник. В итоге собранная система и конфигурация компонентов системного блога должны выглядеть схожим образом:
Теперь вы можете включить компьютер. По умолчанию загрузится операционная система OpenOS со вставленной дискеты, вам остается лишь установить ее на жесткий диск по аналогии с установкой реальной ОС. Используйте команду install:
После окончания процедуры установки вам будет предложено сделать жесткий диск в загрузочным, а также перезагрузить компьютер. Соглашайтесь, после перезагрузки вы можете приступать к установке MineOS. Для этого введите в консоль команду:
Компьютер будет проанализирован на соответствие минимальным требованиям, после чего перед вами откроется симпатичный инсталлер. Вы можете изменить некоторые системные опции на свой вкус, и, согласившись с лицензионным соглашением, установить MineOS:
Custom Libraries
Following is a description of the non-standard libraries, provided for convenience.
- snippet.lua
-
local component = require("component") local rs = component.redstone --You can of course change the variable name: local mycomp = require("component") local rs = mycomp.redstone
The same applies for all other APIs listed below (even and ).
The standard libraries aside, OpenComputers comes with a couple of additional, built-in libraries. Here is a list of all these libraries. Note that some of these may not be usable depending on your configuration (HTTP) and context (Robot library on computers), but they’ll still be there.
-
buffer: a Lua API buffer implementation for wrapping streams.
-
colors: a global table that allows referencing standard Minecraft colors by name.
-
component: look-up and management of components attached to the computer.
-
computer: information on and interactions with the computer the Lua state is running on.
-
event: an event system, often used by libraries, for pulling and registering handlers to signals.
-
uuid: creates long unique identifier strings in the common 8-4-4-4-12 format.
-
filesystem: abstracted interaction with file system components.
-
internet: a wrapper for Internet Card functionality.
-
keyboard: a table of key codes by name and pressed key tracking.
-
note: converts music notes between their real name, their MIDI code and their frequency
-
process: keeps track of running programs and their environments.
-
rc: provides automatic program execution and service management.
-
robot: abstracted access to robot actions.
-
serialization: allows serialization of values, e.g. for sending them via the network.
-
shell: working path tracking and program execution.
-
sides: a global table that allows referencing sides by name.
-
term: provides the concept of the cursor, to read and write from keyboard input and screen output, respectively.
-
text: provides text utilities such as tab to space conversion.
-
thread: provides autonomous and non-blocking cooperative threads.
-
transforms: provides helpful and advanced table manipulators.
-
unicode: provides Unicode aware implementations of some functions in the string library.
Contributing
Assets and Localizations
-
Translations
Translations to other languages are very much appreciated. You can find the localization files in this folder. If a localization you wanted to create already exists, please take the time to see if the present one is complete — the strings change every so often, invalidating some of the translations. If you start a fresh localization, please base it off of the English or German one, those are the ‘master’ localization files. If you add a new language, please also add it to the pack.mcmeta file. Keep it sorted alphabetically, use the name and region Minecraft itself uses. If you don’t know how to do that, that’s OK, I’ll do it later. -
Textures
If you would like to contribute better textures for certain items or blocks, feel free to pull-request them. If you would like to contribute alternative textures, make it a resource pack, and post it on the forums, for example. -
Robot Names
Robots get a random name when placed (unless set with an Anvil). The list the names are chose from can be found here. Feel free to pull request additional names! However: since the list has grown to a considerable length already, here are the two basic criteria for new names: it must either be a real or fictional robot, or an AI that at least appears to be self-aware.
Bug fixes, features and scripts
-
Bugs
If you’ve found a bug, please report it in the issue tracker, after checking it has not been reported before — and possibly even fixed by now. If you think you can and have fixed it, feel free to do a pull request, I’ll happily pull it if it looks all right to me — otherwise I’ll gladly tell you what to change to get it merged. -
Scripts / Programs
OpenComputers generates floppy disks in dungeon chests that can contain data from a selection of ‘loot’ directories. For example, the IRC client and OPPM (a package manager) are two programs that can be found on such loot disks. If you’d like to contribute a program that can be found this way, please have a look at the loot readme, which explains how to add custom loot. Simply pull request your loot! -
Drivers
As of OC 1.4, mod interaction that was previously provided by OpenComponents it now fully integrated into OC itself. If you wish to contribute a driver for blocks from other mods, cool! Have a look at the integration package to get an idea of how to structure modules and read the readme in that package for more information (in particular on additional criteria to get your PR merged).
Pull requests
The following are a few quick guidelines on pull requests. That is to say they are not necessarily rules, so there may be exceptions and all that. Just try to stick to those points as a baseline.
- Make sure your code is formatted properly.
- Make sure it builds and works.
- Try to keep your changes as minimal as possible. In particular, no whitespace changes in existing files, please.
- Feel free to code in Java, but don’t be surprised if I convert it to Scala later on, if I feel it makes the code more concise 😉
- When adding mod dependencies, keep them weak, i.e. make sure OC still works without that mod. Also, prefer adding a Gradle dependency over adding API class files to the repo.
Also, and this should go without saying, your contributed code will also fall under OC’s license, unless otherwise specified (in the super rare case of adding third-party stuff, add the according license information as a file, please).
Апгрейды робота
Изображение | Название | Описание |
---|---|---|
Апгрейд-инвентарь | Один апгрейд-инвентарь имеет объём в 16 ячеек (слотов). Робот может иметь больше одного апгрейда. | |
Апгрейд-контроллер инвентаря | Позволяет роботу точнее взаимодействовать с сундуками, а также заменять предметы в своих дополнительных слотах (менять инструмент, например). | |
Апгрейд-ангел | Позволяет роботу ставить блоки в воздухе, без опоры. (Наподобии того, как могут ставить блоки черепашки ComputerCraft.) | |
Апгрейд-крафт | Позволяет роботу использовать верхний левый угол своего инвентаря как верстак. | |
Апгрейд-генератор | Позволяет роботу накапливать энергию, сжигая топливо из своего инвентаря. Лишняя выработанная энергия запасается. | |
Апгрейд-солнечная панель | Робот накапливает энергию, если находится днем под открытым небом. | |
Апгрейд-табличка | Позволяет роботу читать и писать на табличках. | |
Апгрейд-навигация | Робот может сообщать свое положение и направление. Отсчет ведется от центра карты, которая использовалась при крафте апгрейда. | |
Апгрейд-загрузчик чанков | Этот апгрейд позволяет роботу функционировать даже тогда, когда поблизости нет игроков. Робот всегда держит загруженным один чанк, в котором он работает. | |
Апгрейд-батарея | Увеличивает емкость встроенного аккумулятора робота. | |
Апгрейд-луч захвата | Позволяет роботу собирать предметы в некотором радиусе вокруг себя. | |
Апгрейд-опыт | Робот с этим апгрейдом получает способность «самообучаться». При работе (добыче руды, убийстве мобов) он накапливает опыт. Чем больше уровень робота, тем быстрее он двигается и выполняет операции, и тем меньше изнашивает инструменты. | |
Апгрейд-цистерна | Добавляет роботу внутреннюю цистерну для жидкостей. | |
Апгрейд-контроллер цистерн | Осуществляет расширенное управление внутренними цистернами. | |
Апгрейд-поршень | Позволяет роботу толкать блоки. (За исключением механизмов и устройств, включая блоки OpenComputers.) | |
Апгрейд-база данных | Хранит в себе информацию о стеках предметов. Используется в основном для взаимодействия с сетями Applied Energistics. | |
Апгрейд-лассо | Апгрейд может использоваться роботом или дроном для того, чтобы перемещать (вести за собой) животных. | |
Апгрейд-полет | Апгрейд позволяет роботу подниматься на большую высоту над землей. |
Инициализация
Введение
Когда компьютер запускается и начинает работу, он прогоняет записанный на EEPROM код, который загружает файл инициализации( для Lua BIOS EEPROM). Можно использовать стандартный Lua BIOS и загружать систему через , находящийся в корневой директории, а можно написать свой BIOS, что позволит указать собственный путь и имя файла инициализации. При выборе этого способа нужно будет самому написать такие вещи, как, например, функцию загрузки файла.
После загрузки файла инициализации вам будет доступно лишь 2 API для взаимодействия с компьютером и его компонентами: «component» и «computer», а так же базовые функции BIOS вроде загрузки файла. Затем нужно будет загрузить базовые функции для вывода и базовые сервисы(Например: для взаимодействия с файловой системой), и после этого можно будет задуматься о написании командной строки и более продвинутого GUI.
Код EEPROM
Стоит заметить, что на EEPROM умещается не более 4КБ кода.
Сначала объявляем переменную, содержащую путь к файлу запуска (имя файла включительно).Например: Далее необходимо привязать видеокарту к монитору, чтобы можно было выводить ошибки:
do local screen = component.list("screen")() local gpu = component.list("gpu")() if gpu and screen then component.invoke(gpu, "bind", screen) endend
Адрес файловой системы, в которой хранится файл инициализации, будем записывать на EEPROM. Для этого объявим две функции:
local eeprom = component.list("eeprom")()local function getData() return component.invoke(eeprom,"getData") endlocal function setData(data) return component.invoke(eeprom, "setData", data) end
Теперь необходимо создать функцию, загружающую файл:Далее коментарии в коде. В целях экономии места на EEPROM рекомендуется их не переписывать.
_G.loadFile = function(_addr,_path) local file,err = component.invoke(_addr,"open",_path) --Открываем файл if not file then return nil,err end --Если файл не найден, возвращаем ошибку local buffer = "" repeat --"Читаем" файл до конца local dat,err = component.invoke(_addr, "read", file, math.huge) if not dat and err then return nil,err end buffer = buffer..(dat or "") until not dat component.invoke(_addr, "close", file) --Закрываем файл local chunk,err = load(buffer, "=".._path) --Преобразуем полученный участок кода в исполняемую функцию if not chunk then return nil,err end --Если преобразовать не получилось - возвращаем ошибку return chunk,nil --Возвращаем функциюend
local data = getData()
Если он есть, то загружаем файл воспользовавшись написанной ранее функцией:
if data and type(data) == "string" and #data > 0 then boot,err = loadFile(data,bootpath,false)end
Если же адреса нет или он не корректный, то получаем список адресов всех файловых систем, ищем и пытаемся загрузить файл в каждой из них, и записываем уже корректный адрес файловой системы с файлом инициализации (если он есть):
if not boot then setData("") for addr in component.list("filesystem") do boot,err = loadFile(addr, bootpath,false) if boot then setData(addr) break end endend
Если после этого файл всё еще не найден, то выводим на экран ошибку:
if not boot or err then error("no bootable medium found"..(err and(": "..tostring(err)) or ""),0)end
Если он найден то:
_G.SysAddr = data --Записываем адрес файловой системы в _Gcomputer.beep(1000, 0.2) --Гудком оповещаем пользователя о том, что файл найденboot() --Запускаем полученный файл
Работа с инвентарем[]
Если робот имеет инструмент, функция возвращает состояние этого инструмента.
Возможные значение: 0 — сломан, 1 — цел.
Если робот не имеет инструмента, или инструмент не может быть сломан, функция возвратит и соответствующую строку: или .
robot.inventorySize(): number
Возвращает внутренний размер инвентаря.
robot.select(): number
Делает активным слот инвентаря с заданным индексом. Индекс — число в интервале от 1 до N, где N — число слотов (зависит от количества апгрейдов на инвентарь). Нумерация начинается в левом верхнем углу, и идет слева направо и сверху вниз. Таким образом левый верхний слот имеет номер 1, верхний правый — 4, левый нижний — 13, правый нижний — 16. Создает ошибку, если введен неверный индекс. Возвращаемое значение — номер выбранного слота. Функция может использоваться без аргументов, для получения номера активного слота.
robot.count(): number
Возвращает количество предметов в заданном слоте. Если номер слота не задан, возвращает количество предметов в активном слоте.
robot.space(): number
Возвращает количество предметов которое может еще поместиться в заданный слот. Это число зависит от типа предметов, которые уже находятся в слоте. (К примеру, ведра складываются в стеки только по 16. Если в слоте уже есть два ведра, функция вернет число 14.) Если слот не задан, функция работает с активным слотом.
robot.compareTo(slot: number): boolean
Сравнивает предметы в заданном и активном слотах. Если предметы одинаковы (количество предметов в слотах не имеет значение) — возвращает . Иначе — .
robot.transferTo(slot: number): boolean
Перемещает предметы из активного слота в заданный. Если определен параметр , функция перемещает заданное количество предметов. Возвращает , если был перемещен хотя бы один предмет, и — если ни одного.
Обратите внимание, что если целевой слот не пуст, а число предметов для перемещения не задано, больше или равно числу предметов в активном слоте, результатом будет обмен слотов содержимым.
robot.compare(): boolean
Сравнивает предмет в заданном слоте и блок перед роботом. Если блок эквивалентен предмету в слоте — возвращает . Иначе — .
robot.compareUp(): boolean
Аналогично , но сравнивает с блоком над роботом.
robot.compareDown(): boolean
Аналогично , но сравнивает с блоком под роботом.
robot.drop(): boolean
Выбрасывает предмет из активного слота. может определять число предметов. Если перед роботом находится блок с инвентарем, например сундук, робот попытается положить предметы в него. Если инвентаря перед роботом нет, предметы будут просто выброшены наружу. Возвращает , если один или больше предмет был выброшен. Иначе — . Если инвентарь (сундук) полон, функция вернет и предметы выброшены не будут.
Также функция работает для вагонеток с сундуками и вагонеток с воронками.
robot.dropUp(): boolean
Аналогично , но работает с блоком над роботом.
robot.dropDown(): boolean
Аналогично , но работает с блоком под роботом.
robot.place(]): boolean
Помещает блок из активного слота перед роботом. Возвращает в случае успеха, иначе — . Параметр определяет сторону на которую будет помещен блок. Если параметр опущен, робот попробует все поверхности. Это позволяет точнее ставить блоки, которые имеют ориентацию. (Например — факел. Значение или позволит разместить факел на стене слева.) Параметр определяет «присел» (для игрока — клавиша ⇧ Shift) ли робот когда ставил блок. Это необходимо для некоторых модов.
Важно: по умолчанию, робот не может ставить блок в воздухе без опоры (как и игрок). В пространстве перед роботом должна быть хотя бы одна «стенка»
Если вы хотите, чтобы роботы могли ставить блоки в воздухе (как черепашки из ComputerCraft) установите роботу апгрейд-«ангел».
robot.placeUp(]): boolean
Аналогично , но работает с блоком над роботом.
robot.placeDown(]): boolean
Аналогич
но , но работает с блоком под роботом.
robot.suck(): boolean
Захватывает максимум один стек предметов в активный слот, или первый свободный слот после активного. Возвращает если захватил один или больше предметов, иначе — . Если перед роботом находится блок с инвентарем (например — сундук), робот попытается забрать предметы из него. Параметр определяет, сколько именно предметов будет захвачено. Функция также работает с вагонетками с инвентарем.
Если перед роботом нет инвентаря, он попытается подобрать предмет «с земли». В этом случае параметр будет проигнорирован.
robot.suckUp(): boolean
Аналогично , но работает с блоком над роботом.
robot.suckDown(): boolean
Аналогично , но работает с блоком под роботом.
Proxies
So now that we know how to get the address of components, let’s see how we can interact with them. There are two ways to go about this. One is to call . For example:
- snippet.lua
-
local component = require("component") component.invoke(modemAddress, "broadcast", port, data)
The preferred way will usually be to get a proxy, however. A proxy is simply a table that provides one function for each API callback, named after that callback. In addition, each proxy has two fields: , which holds the address of the wrapped component, and , which holds the type of the component. You can get a proxy like this:
- snippet.lua
-
local component = require("component") local proxy = component.proxy(address) -- The call above using the proxy: proxy.broadcast(port, data) -- The common proxy fields: print(proxy.address) -- address passed to component.proxy above print(proxy.type) -- "modem"
Note that each primary component you access via or is in fact a proxy.
Разбор кода
Программа состоит из двух функций и главного цикла.
Функция обеспечивает сбор урожая и высадку семян. Она выводит робота на поле, а затем двигает его «челночными» движениями, ряд за рядом. Над каждым блоком робот делает взмах мотыгой, собирая урожай, и высаживает взамен одно семечко из активного первого слота.
Функция выгружает содержимое инвентаря робота в сундук, который должен находиться позади начальной позиции робота. Первый слот функция пропускает — там робот хранит запас семян для посадки. При сборе урожая этот слот автоматически заполняется семенами снова.
Первая часть главного цикла программы — ожидание. Для наглядности (чтобы робот не казался «зависшим»), робот каждый шесть минут выводит в свою консоль проценты созревания урожая.
При достижении 100%, вторая часть главного цикла вызывает функцию . Затем проверяет, не полон ли второй слот и выгружает инвентарь в сундук, если необходимо.
Программа работает в бесконечном цикле. Её можно прервать, если выключить робота, или нажать Ctrl+Alt+C в его консоли.
Extending
In your own mod
repositories { maven { url = "http://maven.cil.li/" } } dependencies { compile "li.cil.oc:OpenComputers:MC1.7.10-1.5.+:api" }
Adjust the version number accordingly to the version you’d like to build against.
Alternatively, leave out the classifier and you can build against the dev JAR directly. This way you don’t have to add it to your mods folder, but you will have to add to the VM options in your run configuration.
OpenComputers
Want to tinker with the mod itself? Here is how — for IntelliJ IDEA users.
Important
- Make sure you have the Gradle plugin enabled in IntelliJ IDEA (File->Settings->Plugins).
- Make sure you have the Scala plugin enabled.
Clone the repository, then in it run
to setup the workspace, including assets and such, then
to create an IntelliJ IDEA project.
Open the project and you will be asked to import the Gradle project (check your Event Log if you missed the pop-up). Do so. This will configure additionally referenced libraries.
In the case you wish to use Eclipse rather than IntelliJ IDEA, the process is mostly the same, except you must run rather than .
Что потребуется?[]
- Робот. Он будет пахать, сеять и собирать урожай в сундук.
- Апгрейд-солнечная панель для робота. Это позволит ему работать без перерывов на подзарядку (если ферма будет на поверхности).
- Дискета. На нее мы запишем программу робота.
- Мотыга покрепче. Её мы вручим роботу.
- Сундук. В него робот будет складывать урожай.
- Ведро воды. Вода будет увлажнять землю.
- Пара лопат, для подготовки фермы.
- Материалы для ограждения (доски, заборы, стекло и т.д.) по желанию.
- Стопка семян. Не обязательно ровно 80 штук. Робот постепенно накопит нужное количество семян сам (после сбора урожая) и засеет поле полностью.
Желательно также обладать компьютером, на котором мы будем писать программу.
Программный интерфейс (API)[]
Название компонента:
reset()
Cброс настроек модели и остановка печати
setLabel(value:string)
Задает название будущего блока
getLabel():string
Получает текущее название блока
setTooltip(value:string)
Задает описание блока
getTooltip():string
Получает текущее описание блока
setRedstoneEmitter(value:boolean)
Определяет, излучает ли блок сигнал красного камня в активированном состоянии
isRedstoneEmitter():boolean
Возвращает , если блок излучает сигнал в активном состоянии
setButtonMode(value:boolean)
Определяет поведение блока при активации. Если параметр равен , то блок автоматически возвращается в неактивное состояние через несколько секунд после активации (как кнопка)
isButtonMode():boolean
Возвращает , если блок находится в режиме «кнопки»
addShape(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number, texture:string)
Добавляет новую «фигуру» к форме блока. Фигура представляет собой параллелепипед, и задана координатами двух противоположных углов. Параметр — название текстуры, — для какого состояния фигура предназначена, — цвет оттенка фигуры
getShapeCount():number
Возвращает количество фигур в модели
getMaxShapeCount():number
Возвращает максимально возможное количество фигур (по умолчанию — 24)
commit()
Посылает принтеру текущую конфигурацию модели и начинает печать (параметр — количество копий, если не задан — равен 1)
status(): string, number or boolean
Возвращает состояние принтера — («занят») и процент готовности модели, или («простой») и готовность предмета ().
setLightLevel(value:number)
Устанавливает уровень свечения для 3D модели. Максимальный уровень 16, столько же дает свечение факела.
getLightLevel():number
Возвращает уровень свечения 3D модели.
setCollidable(collideOff:boolean, collideOn:boolean)
Устанавливает иллюзорный блок, который внешне никак не отличается от нормальной модели, но сквозь него можно пройти. Как работают параметры неясно, срабатывает иллюзия при передачи команд и .
isCollidable():boolean, boolean
Возвращает установленные параметры для печати иллюзорного блока.
New Features/Support/Fixes
-
Changed: Diamond Chip recipe
You now require cutting wire to cut the diamond.
- Added: ExtraCells and Mekanism integration (DrummerMC)
- Added: ComputerCraft support is back
- Fixed: Accessing disk drives and other containers in Tablets
- Fixed: Putting items into Database Upgrades
- Fixed: IC2-Classic mod incompatibility
- Added: Allow getting yaw of player through tablet component (ChristoCoder)
- Fixed: Microcontroller interactions with EnderIO item conduits
- Added: Maximum packet parts to device info of modems (Linked and Network Cards)
- Fixed: Drones now properly work with chunkloader upgrades (TheCodex6824)
- Fixed: Tablets not turning off their screen properly (AmandaCameron)
- Fixed: Motion Sensor line of sight
- Misc: Updated various translations
- Russian (S0ZDATEL, Fingercomp, makkarpov)
- Traditional Chinese (mymagadsl)
- German (Nex4rius)