Содержание
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.
Программирование[]
Возьмем дискету и вставим в компьютер. Назовем ее и создадим на дискете программу . (Подробно о работе с дисками и дискетами, переименовании и создании программ — см. Туториал: Работаем с дисками.)
Вы можете перепечатать следующий код вручную и сохранить, либо скопировать его и вставить (⇧ 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
API[]
Интерфейс беспроводных сетевых плат аналогичен, кроме того, что они могут посылать беспроводные пакеты с заданной мощностью.==
Название компонента: .
isWireless(): boolean
Возвращает если карта способна посылать беспроводные сообщения и — иначе.
maxPacketSize(): number
Возвращает максимальный размер пакета, который возможно послать сетевой платой. По умолчанию это 8192. Вы можете изменить это значение в файле конфигурации мода.
isOpen(port: number): boolean
Определяет, слушается ли заданный порт.
open(port: number): boolean
Открывает заданный порт для прослушивания. Возвращает в случае успеха, или если порт уже был открыт.
close(): boolean
Закрывает определённый порт (либо все порты, если параметр был не задан). Возвращает в случае успеха.
send(address: string, port: number): boolean
Посылает пакет по заданному адресу. Возвращает в случае успеха. Это НЕ означает что пакет был принят. Только то, что он был отослан.
Все дополнительные аргументы функции будут посланы как данные пакета. Это могут быть переменные базового типа: , , и поддерживаются, таблицы и функции — нет. (О сериализации таблиц см. Serialization API.)
broadcast(port: number, …): boolean
Посылает сообщение в режиме «вещания». Пакет будет получен всеми сетевыми платами в радиусе досягаемости. Возвращает , если сообщение было послано.
Дополнительные аргументы будут посланы как данные пакета. См. .
Примечание: пакет в режиме «вещания» не будет получен модемом, который производит его посылку.
setWakeMessage(message:string): string
Устанавливает ключ для пробуждения оборудования, в котором данная карта стоит. То есть заставляет включиться. Например, если в робота установить беспроводную плату и передать ей параметры , а затем выключить его, то как только будет передано по сети сообщение , робот моментально запустится. Второй параметр в функции позволяет принимать нечеткие сигналы, например сигнал пробуждения установлен , но команда на активацию пройдет даже если будет передано . Сообщение может быть передано на любой порт!
getWakeMessage():string, boolean
Возвращает ключ пробуждения оборудования и информацию включен ли точный режим опознания ключа.
getStrength(): number
Возвращает силу сигнала, с которой будут посланы сообщения.
Только для беспроводных плат!
setStrength(value: number): number
Устанавливает силу сигнала. Если значение установлено больше 0, при посылке пакета, будет генерироваться беспроводное сообщение. Чем больше значение, тем дальше будет послан сигнал, и тем больше энергии потребует его отправление.
Только для беспроводных плат!
Интерфейс[]
Регистрирует нового «слушателя» (listener) событий, который вызывается для событий с заданным названием (если это «слушатель» сигналов, то должно быть задано имя сигнала). Возвращает , если «слушатель» был успешно зарегистрирован и , если «слушатель» для событий этого типа уже назначен.
Обратите внимание, что «слушатели» могут возвращать значение для удаления своей регистрации (эквивалентно вызову с названием этого «слушателя» и именем события, для которого он был зарегистрирован).
event.ignore(name: string, callback: function): boolean
Удаляет регистрацию «слушателя» (listener). Возвращает , если регистрация была успешно удалена и , если такого «слушателя» зарегистрировано не было.
event.timer(interval: number, callback: function): number
Запускает новый таймер, который будет вызван через время, определенное в . По умолчанию таймер срабатывает один раз. Число срабатываний определяет параметр . Значение заставит таймер повторяться бесконечно.
Функция возвращает номер-идентификатор, который может быть использован в функции для того, чтобы отменить таймер (даже если он еще ни разу не сработал).
Примечание: время срабатывания таймера может изменяться. Если компьютер простаивает и переходит в спящий режим, таймер измеряет время в игровых «тактах». Таким образом время срабатывания может колебаться в пределах 0.05 секунд.
Важно: таймеры используют функцию. Если вы перехватываете сигналы функцией , и не используете — таймеры работать не будут!. event.cancel(timerId: function): boolean
event.cancel(timerId: function): boolean
Отменяет таймер созданный командой . Возвращает , если таймер успешно отменен и , если таймера с таким ID не существует.
event.pull(, , …): string, …
Эта команда, кроме , должна быть основным способом «ожидания» программы. Функция используется для обработки событий (в том числе и сигналов, которые не были перехвачены другой функцией раньше). Также функция принимает вызовы таймеров созданных функцией . Таким образом, функция должна вызываться периодически.
Первый параметр — это число, определяющее сколько функция ждет события, прежде чем отправить . В это случае второй параметр — это имя события.
Если время ожидания не определено, то имя события становится первым параметром. Имя события может быть , тогда фильтрация событий выполняться не будет. Остальные параметры используются как прямой фильтр. Функция будет возвращать только те события, которые подойдут под условие (точное совпадение параметров, для названия события можно использовать регулярные выражения, см. ).
Для примера, сигнал (когда игрок щелкает мышью по монитору второго поколения) имеет сигнатуру . Чтобы отсортировать щелчки только от игрока «Стив», вы должны использовать следующую конструкцию:
event.shouldInterrupt(): boolean
Эта функция вызывается , после каждого принятого сигнала, чтобы определить должен ли тот быть прерван преждевременно. Если она возвращает , создаст ошибку. По умолчанию, она возвращает , если была нажата комбинация Ctrl + Alt + C.
event.onError(message: any)
Глобальный обработчик ошибок событий. Если какой-либо «слушатель» событий создаст ошибку, эта функция ее перехватывает, чтобы избежать «попадания» в другую часть кода. По умолчанию, функция ведет лог ошибок во временной файловой системе компьютера.
Апгрейды робота
Изображение | Название | Описание |
---|---|---|
Апгрейд-инвентарь | Один апгрейд-инвентарь имеет объём в 16 ячеек (слотов). Робот может иметь больше одного апгрейда. | |
Апгрейд-контроллер инвентаря | Позволяет роботу точнее взаимодействовать с сундуками, а также заменять предметы в своих дополнительных слотах (менять инструмент, например). | |
Апгрейд-ангел | Позволяет роботу ставить блоки в воздухе, без опоры. (Наподобии того, как могут ставить блоки черепашки ComputerCraft.) | |
Апгрейд-крафт | Позволяет роботу использовать верхний левый угол своего инвентаря как верстак. | |
Апгрейд-генератор | Позволяет роботу накапливать энергию, сжигая топливо из своего инвентаря. Лишняя выработанная энергия запасается. | |
Апгрейд-солнечная панель | Робот накапливает энергию, если находится днем под открытым небом. | |
Апгрейд-табличка | Позволяет роботу читать и писать на табличках. | |
Апгрейд-навигация | Робот может сообщать свое положение и направление. Отсчет ведется от центра карты, которая использовалась при крафте апгрейда. | |
Апгрейд-загрузчик чанков | Этот апгрейд позволяет роботу функционировать даже тогда, когда поблизости нет игроков. Робот всегда держит загруженным один чанк, в котором он работает. | |
Апгрейд-батарея | Увеличивает емкость встроенного аккумулятора робота. | |
Апгрейд-луч захвата | Позволяет роботу собирать предметы в некотором радиусе вокруг себя. | |
Апгрейд-опыт | Робот с этим апгрейдом получает способность «самообучаться». При работе (добыче руды, убийстве мобов) он накапливает опыт. Чем больше уровень робота, тем быстрее он двигается и выполняет операции, и тем меньше изнашивает инструменты. | |
Апгрейд-цистерна | Добавляет роботу внутреннюю цистерну для жидкостей. | |
Апгрейд-контроллер цистерн | Осуществляет расширенное управление внутренними цистернами. | |
Апгрейд-поршень | Позволяет роботу толкать блоки. (За исключением механизмов и устройств, включая блоки OpenComputers.) | |
Апгрейд-база данных | Хранит в себе информацию о стеках предметов. Используется в основном для взаимодействия с сетями Applied Energistics. | |
Апгрейд-лассо | Апгрейд может использоваться роботом или дроном для того, чтобы перемещать (вести за собой) животных. | |
Апгрейд-полет | Апгрейд позволяет роботу подниматься на большую высоту над землей. |
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 .
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).
Booting
The only thing built-in now is the “machine” booting the BIOS. This “machine” wrapper is a non-editable Lua script responsible for setting up the sandbox and super-low-level interaction with the “host” side of things (that being Java/Scala). When a computer is powered on, that script is loaded and run. After estabilishing the sandboxed environment it looks for an EEPROM and tries to run the data on it as a Lua script. If that fails the computer crashes. Otherwise that BIOS is run. For the provided one (Lua BIOS, crafted using EEPROM + book) it will perform the actions previously done by the machine itself:
- It looks for a file system with address set via (read via ).
- On that file system it tries to load and execute a Lua script from a file named .
- If it succeeds, that’s it. The user script is now in control. If it fails, it iterates over all present file systems, performing step 2 again until it succeeds.
- If no working script is found, the computer crashes with a error.
But since you can program the EEPROM however you like you could also boot from a network device, for example.
Интерфейс[]
Посылает HTTP-запрос по заданному URL, с заданными POST данными. Если данные не определены, будет произведен GET запрос. Данные POST могут быть в одном из двух форматов: если это строка, она будет передана «как есть». Если это таблица — она будет конвертирована в строку, предполагая, что каждый ключ — название переменной POST, а значение ключа — её значение. К примеру:
Будет послана строка
Возвращаемое значение — итератор чанков (фрагментов) результата. Пример использования:
Важно: не вызывайте , или другую функцию, которая работает с событиями, в процессе обработки строк результата. Это связано с тем, что каждая такая строка — это сигнал (таким образом программа избегает ошибок переполнения памяти при больших ответах).. internet.socket(address:string):table
internet.socket(address:string):table
Открывает TCP сокет, используя метод интернет-компонента (см. далее) и создавая таблицу с теми же методами, что и при открытии файла через : , и (а также , который будет всегда выдавать ошибку). Рекомендуется использовать вместо нее , которая создает буферизованную обертку (аналогично при работе с файлами).
internet.open(address:string):table
Открывает сокет по заданному адресу в виде буферизованного потока. Поток можно читать и писать в него методами и . В общем случае это происходит так же как при работе с файлами через . Во многих случаях также удобно установить таймаут на чтение буфера функцией чтобы избежать блокирования на неопределенное время. Пример использования:
local internet = require("internet") local handle = internet.open("example.com", 1337) local data = handle:read(10) handle:write("1234") handle:close()
Работа с инвентарем[]
Если робот имеет инструмент, функция возвращает состояние этого инструмента.
Возможные значение: 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
Аналогично , но работает с блоком под роботом.
Connectivity
OpenComputers can connect to and interact with the outside Minecraft world through several methods:
Most of OpenComputers’ blocks can “see” and interact with other OpenComputers Blocks automatically if placed right next to each other, or you can use Cables to connect them over a distance. It is also possible to connect — or separate — components logically by using one of the various network cards or switches in both wired and/or wireless form.
Blocks from Vanilla or other Mods can be connected via the Redstone Card, the Redstone I/O Block or an Adapter. Many special Blocks from other mods are already integrated into the Adapter, like Blocks from BuildCraft, IndustrialCraft2 or Thermal Expansion, other mods authors can use the Java API to add specific handling for their blocks as well.
Robots can interact with the world almost like a real player can do. They can equip most tools, blocks or other items and can be programmed to use them in every way you want them to. You can program them to sort your inventory, go mining for your resources, have them build a fortress for you or make them sing and dance for your entertainment. Only your imagination is the limit.
See the page on component interaction to learn how to communicate with components from Lua.
Программный интерфейс (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
Возвращает установленные параметры для печати иллюзорного блока.
«Главный» компонент[]
Component API назначает один из компонентов каждого типа «главным». Если блоков одного типа несколько, «главный» выбирается случайно. Вы можете обращаться к главному компоненту оператором , где — это тип.
Например:
lua> component.gpu.address xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
В качестве альтернативы, вы можете воспользоваться оператором . В этом случае можно получить ошибку если не существует главного компонента этого типа. Это можно предварительно проверить оператором . Получить сообщение об ошибке может быть понятнее, чем в первом варианте.
Главный компонент используется, когда компьютер определяет на какой монитор выводить изображение при первом запуске.
Сборка железа[]
Разместим блоки как изображено на скриншоте ниже:
Блок конвертера энергии ставить не обязательно, если вы подаете энергию непосредственно на корпус компьютера (компьютер имеет встроенный конвертер).
Блоки могут быть расположены произвольно, при условии, что они остаются соединенными вместе (для соединения можно использовать кабель). Клавиатура должна быть поставлена вплотную к экрану (непосредственно на его стенке, либо на блоке перед ним).
Откройте правой кнопкой мыши интерфейс корпуса компьютера. Вставьте комплектующие в соответствии со схемой.
Убедитесь в том, что компьютер действительно получает энергию. Затем нажмите на кнопку включения (зеленая кнопка в середине интерфейса корпуса).
Если вы все сделали правильно, вы увидите синий экран с надписью:
Unrecoverable error: kernel:625: no bootable medium found: file not found
Это значит, что на жёстком диске отсутствует операционная система. Правой кнопкой мыши откройте интерфейс дисковода и поместите туда дискету с операционной системой. Запустите компьютер вторично.
Теперь будет виден процесс загрузки системы. Компьютер загрузит необходимые библиотеки и запустит шелл (командную строку). Когда вы увидите мигающий курсор — система загрузилась и готова к работе.
Resource Limits
OpenComputers have a limited amount of disk space and RAM, which can be configured in the OpenComputers config to your likings. This not only makes OpenComputers very server friendly, it as well gives you a warm feeling of nostalgia, back at a time where disk and RAM size was measured in Kilo and Megabytes. However as programming in Lua is very resource-friendly, you should be able to solve most tasks even on mid-end OpenComputers. And if not you could always spend some diamonds on even bigger RAM.
In addition to those intuitive limitations, OpenComputers has been specifically designed to work flawlessly on servers: OpenComputers uses a fixed number of low-priority threads for coroutines to cause as little delay on the server tick as possible, in addition running programs are forced to yield on a regular, configurable basis or — if for any reason fail to do so — will crash (the in-game computer) forcefully to prevent server lag by malicious or malfunctioning programs.