Уже довольно давно я занимаюсь тем, что в свободное время ковыряюсь во внутренностях Minecraft-а. Вначале исключительно с познавательным интересом, затем — в качестве технического администратора небольшого сервера. Так что темой второго «эксперимента» будет Minecraft с точки зрения программиста, а также различные извращения на его основе.
Что касается MCP — это самый популярный инструмент для декомпиляции майнкрафта, так что было бы странно не упомянуть его в заголовке.
Ну а теперь о самом интересном — каким же боком Lua относится к этой теме? Да никаким, по крайней мере на данный момент. Как некоторые, возможно, знают — сейчас в mojang ведется активная довольно вялая работа над официальным Plugin API. Если коротко, то это что-то похожее на буккит или даже на spoutcraft, но намного лучше — код в плагинах будет предназначен для сервера, а клиент получает пакет «ресурсов», преимущественно состоящий из текстур, звуков и характеристик объектов. Таким образом, с чистым клиентом можно зайти на любой сервер, а за счет ресурспака все нестандартные объекты будут правильно отображаться и работать.
Гайд по языку Lua. Типы данных и переменные
К сожалению, пока еще очень далеко до реализации этой утопической идеи, да и после останется масса неразрешимых проблем, вызванных принципом «клиенту доверять нельзя — вся логика на сервере». К примеру, нестандартный UI потребует обработки действий игрока на стороне сервера, что приводит к задержке и прочим неприятным вещам (представьте выпадающий список, открывающийся и закрывающийся по пол секунды).
Одним из способов решения этой и некоторых других проблем может стать использование легковесного скриптованого языка с поддержкой сандбоксинга. Текст скрипта на таком языке заслуженно займет свое место среди ресурсов, а значит будет доставлен на клиент, а за счет полной изоляции скрипта от системных функций устраняется опасность заражения компьютера чем-нибудь венерическим по вине недобросовестных админов сервера.
Думаю, все уже поняли к чему я клоню — именно Lua полностью соответствует выдвинутым требованиям и даже превосходит их. Для начала это будет любительский проект для личного потребления, а дальше, чем черт не шутит, может даже удастся заинтересовать парней из mojang.
Прежде чем переходить к серьезным вещам вроде интеграции Lua с майнкрафтом и самопальной системы динамического назначения id блокам, я собираюсь осветить несколько тем по проще:
- Новый лаунчер от mojang.
- Изменения протокола авторизации.
- Процедурная генерация мира и предгенерация, как альтернатива генерации «на лету».
Итак, второй эксперимент объявляется открытым. Предметная область — программирование, объект исследования — Minecraft.
Источник: xgm.guru
OpenComputers/Стандартные библиотеки Lua
В OpenComputers доступны многие функции стандартных библиотек Lua. Однако некоторые из них могут быть ограничены, или переопределены.
Программируем на Lua в Minecraft
Подробнее о стандартных библиотеках Lua вы можете узнать в официальной документации здесь.
- 1 Различия
- 1.1 Базовые функции
- 1.2 Сопрограммы (Coroutine)
- 1.3 Модули
- 1.4 Операции со строками
- 1.5 Операции с таблицами
- 1.6 Математические функции
- 1.7 Битовые операции
- 1.8 Операции ввода/вывода
- 1.9 Функции операционной системы
- 1.10 Отладка
Различия
Базовые функции
- collectgarbage — Не доступна.
- dofile и loadfile — Переопределены для загрузки из файловой системы OpenComputers (см. Filesystem API).
- load — Может использоваться только для загрузки текста. Загрузка байткода может быть разрешена в настройках мода, однако не рекомендуется, так как представляет собой большую угрозу безопасности.
- print — Переопределена для вывода на консоль (см. Term API)
Сопрограммы (Coroutine)
Набор функций по управлению сопрограммами coroutine доступен в моде без особенных изменений.
Примечание: функции coroutine.resume и coroutine.yield переопределены в моде с учетом того, что программа прерывает свое выполнение, если она не отвечает долгое время (точное значение смотрите в настройках мода).
Модули
Функции работы с модулями package переопределены в моде OpenComputer. Однако должны работать аналогично, за исключением следующих функций:
- package.config — не используется
- package.cpath — не используется
- package.loadlib — не переопределена
Последние две не используются в связи с тем, что невозможна загрузка кода C из OpenComputers.
Операции со строками
Примечание: функции GPU API (а также term.write и print ) полностью совместимы со строками в формате UTF-8. Кроме того, для облегчения работы с форматом Unicode, OpenComputers предоставляет библиотеку Unicode API.
Операции с таблицами
Математические функции
Оригинальная библиотека математических функций math доступна с незначительными изменениями:
- math.random использует отдельный экземпляр класса java.util.Random для каждого потока Lua.
- math.randomseed применяется к своему экземпляру java.util.Random соответственно.
Битовые операции
Оригинальная библиотека битовых операций bit32 доступна без изменений.
Операции ввода/вывода
Функции библиотеки io переопределены для работы с консолью и файловой системой OpenComputers.
Для стандартного ввода/вывода используются функции term.read / term.write .
Функции по большей части функционально эквивалентны оригинальным. Они могут возвращать отличающиеся сообщения ошибки.
- io.popen — не доступна.
- io.open — не поддерживает режим + . Поддерживаемые режимы: r , w , a , rb , wb и ab . Побитовый режим чтения файлов поддерживает загрузку строк в формате UTF-8.
- io.stdin — читает данные с помощью term.read .
- io.stdout — пишет используя term.write .
- io.stderr — также пишет используя term.write , однако делает это красным цветом (если цвета поддерживаются монитором/видеокартой компьютера).
- io.read — поддерживает режим «n» для ввода данных типа number вместо string. Для этого «n» должен передаваться в функцию io.read как аргумент.
Функции операционной системы
Функции библиотеки os частично переопределены.
- os.clock — возвращает приблизительное время работы CPU. Это не то же самое, что время работы компьютера (см. функцию computer.uptime из Computer API).
- os.date — использует внутриигровую дату. Поддерживает различные форматы.
- os.execute — переопределена для запуска программ с помощью shell.execute . См. Shell API
- os.exit — создает событие ошибки, для того чтобы закрыть текущую сопрограмму.
- os.setenv — добавляет переменные окружения шелла.
- os.remove — алиас к filesystem.remove .
- os.rename — алиас к filesystem.rename .
- os.setlocale — не доступна.
- os.time — переопределена, выводит внутриигровое время, начиная с создания мира. Учтите, что время указывается во внутриигровых «секундах». Чтобы получить число тактов домножте это значение на 1000/60/60 (в одном дне 24000 тактов) и вычтите 6000. Это число (6000) взято не случайным образом. Новая игра в Minecraft начинается в «полдень», который и считается точкой отсчета времени (ноль).
- os.tmpname переопределена для генерации нового (неиспользуемого) имени в каталоге /tmp .
Кроме того добавлена одна новая функция:
- os.sleep(seconds: number) — приостанавливает скрипт на указанный промежуток времени. При этом сигналы (и события) по прежнему обрабатываются, когда компьютер приостановлен. События «копятся» в очереди событий и будут обработаны, когда компьютер возобновит работу.
Отладка
Доступна только функция debug.traceback .
Источник: minecraft.fandom.com
[Guide] Изучаем ComputerCraft [часть 2]
Всем привет, с вами снова poccu, и сегодня я решил
сделать вторую часть своего гайда по ComputerCraft.
В этой части мы продолжим изучать команды CraftOS,
и попробуем написать и разобрать по частям программу на Lua.
Если вдруг кто-то не читал первую часть, то вот она: Click!
В прошлом уроке мы немного научились работе с файлами в CraftOS.
Сегодня мы будем продолжать учится работе с файлами,
а также попробуем написать свою первую программу.
Давайте вспомним то, что мы узнали на прошлом уроке:
- help — открыть помощь.
- dir и ls — узнать, какие файлы и папки есть в этой директории.
- edit — создать или изменить файл.
- rename — переименовать файл.
- delete — удалить файл.
Для копирования файлов в CraftOS используется команда copy.
copy [Путь к файлу] [Путь к тому месту, куда сохранится файл]
Например: У нас есть файл под названием test. Если мы напишем
команду copy test test1, то рядом с этим файлом появится файл под названием test1,
с полностью идентичной информацией в нем.
А теперь представим, что нам нужно переместить файл в другое место.
Мы можем сначала скопировать его в нужное место командой copy, а потом
удалить оригинал, но это не очень удобно. Для нашего с вами
удобства, существует команда move.
move [Исходный файл] [Директория, куда нужно переместить файл]
Теперь представим то, что нам нужно создать папку (директорию).
Для этого нам потребуется команда mkdir.
mkdir [Путь]
Если мы напишем mkdir folder1, то мы создадим новую пустую
папку с именем folder1, в которой мы теперь можем хранить файлы.
Теперь представим такую ситуацию:
Мы пользуемся обычным компьютером (не золотым), икогда мы пишем
команду dir или ls, мы не можем понять, какие это файлы. В золотом
компьютере папки помечены зеленым цветом, а в
обычном компьютере они не помечены вообще.
Так что же нам делать? Для этого есть команда type.
Она говорит нам, какой это тип файла.
type [Путь к файлу]
А теперь немного про пути к файлам. Если мы напишем команду cd ..,
то мы вернемся на одну директорию назад. Если мы хотив вернутся в начальную директорию,
нам нужно написать cd .
Отлично, с работой с файлами в CraftOS мы разобрались!
Теперь я просто опишу некоторые команды,
и мы приступим изучать программирование!
- Команда shutdown выключает наш компьютер.
Для включения просто заного зайдите в него. - Команда reboot перезагружает наш компьютер.
- Команда time позволяет узнать текущее игровое время.
Отлично! Вот мы и можем приступать к программированию.
Программирование происходит не в ОС CraftOS, а в
файлах, которые создаются командой edit. Давайте напишем нашу первую программу,
а потом разберем ее.
print («Hello world!»)
Для запуска программы мы должны обратно вернуться в CraftOS.
Сейчас мы должны просто написать название программы, и ничего больше.
После нажатия кнопки Enter мы увидим, что на экране появилась надпись
Hello world.
Давайте все разберем по порядку:
- print — вызов функции print, которая печатает текст и переносит курсор на следующую строку.
- Скобочки нужны для того, чтобы присвоить этой функции дополнительные параметры. В данном случае дополнительным параметром служит выводимый текст.
- Про кавычки я расскажу чуть-позже.
- Ну а Hello world! это текст, который мы выводим.
И так, давайте я вам расскажу, зачем нужны эти кавычки, и почему
без них мы не смогли обойтись.
В Lua присутствует несколько типов данных.
Первый из них — текстовый (String). Мы как-раз им и пользовались.
В Lua, как и во многих других языках программирования, кавычки используются
для отображения текста. Именно поэтому надпись Hello World мы заключили в кавычки.
В String’е могут находиться абсолютно любые знаки (буквы, числа, спецсимволы).
Второй — Boolean. В нем могут храниться лишь значения true (истина) и false (ложь).
Третий — числовой. В нем хранятся различные числа.
Ну и четвертый — nil. Nil это пустое значение.
Это не все типы данных, которые есть в Lua,
но нам пока-что будет достаточно и этого.
Теперь немного про переменные.
Переменные используются для хранения значений. Представим себе:
Пользователь вводит какие-либо данные в программу, которые понадобятся
программе чуть-позже. Для того, чтобы сохранить эти данные, можно использовать
переменные. В переменных могут хранится абсолютно любые типы данных.
И еще кое-что: для ввода данных пользователем нужно использовать read().
write («Input: «) a=read() print («Hello, «,a)
При запуске программы нас попросит ввести данные с клавиатуры.
После ввода данных и нажатии кнопки Enter, введенные данные запомнятся
в переменной a, и будут выведены командой print.
Давайте мы разберем и этот код:
- В самом начале мы видим команду write. Она очень похожа на print, но у нее есть одно отличие. При выводе данных через print, в конце автоматически ставится Enter. В случае в write’ом это не так.
- Про доп. параметры и типы данных я уже рассказал.
- На второй строчке мы видим переменную a. В ней будут храниться введенные нами данные.
- После переменной стоит знак равно. Он означает присваивание переменной данных.
- После знака равно, мы видим функцию read(), которая обеспечивает ввод данных пользователем с клавиатуры.
- На третей строчке мы видим вывод через print. Причем хочу обратить ваше внимание на дополнительные параметры.
(«Hello «,a)
Думаю, что на сегодня все. Если вы что-то не поняли, перечитайте гайд
или спросите об этом в комментариях. С вами был poccu, всем пока!
Источник: ru-minecraft.ru