Перейти к содержимому

Путешествия Xytabich'а

  • записей
    12
  • комментариев
    25
  • просмотра
    192

OpenPeripheral: Начало начал

Xytabich

280 просмотров

На повестке дня аддон для OpenComputers и ComputerCraft всех времён и народов, реализующий большое количество функционала для работы с миром Minecraft'а и его модификациями. Но поговорим только о версии для OpenComputers (она несколько обрезана, по сравнению с СС).

Жизнь без этого мода оказалась тем ещё кошмаром, особенно при попытке играть на серверах более поздних версий майнкрафта. Но что это был за кошмар, удалось узнать только недавно - OpenPeripheral не только добавлял удобные способы взаимодействия со всем миром, но и дополнял функционал OpenComputers'а при работе со многими модификациями.

 

Итак, аддон состоит из 3х модулей, которые будут описываться отдельно:
- Core - собственно, ядро аддона, реализует некоторые базовые функции

- Integration - расширенное взаимодействие с майнкрафтом и модами

- Addons - дополнительная периферия для пк

Информация актуальная для версии Minecraft 1.7.10.

 

В этой части разговор пойдет о ядре аддона, так как его функционал является основополагающим для остальных модулей.

 

Итак, в моде реализована система адаптеров - интерфейсов lua-minecraft (он-же драйвер), предоставляющих функционал для взаимодействия с объектами.
У каждого адаптера есть свой идентификатор, и этот идентификатор используется для определения "владельца" функционала.

В ядре, есть только адаптер для отображения документации объекта. В будущих же статьях будут описаны адаптеры в модуле, и предоставляемый ими функционал.

 

Документация функций

Ядро реализует неплохую систему документации всех своих функций, которую можно просмотреть через lua:

listMethods([filterSource]):string - возвращает строчку со всеми методами методов.
    filterSource - идентификатор адаптера
Пример: listMethods():"doc(method), getAdvancedMethodsData(method?), listMethods(filterSource?), listSources()"

listSources():table - возвращает таблицу {name=true} со всеми адаптерами.
Пример: listSources():{["<meta>"]=true, skull=true} - список адаптеров черепа, <meta> - адаптер ядра, skull - адаптер черепов/голов

doc(method):string - возвращает текстовое описание метода.
Пример: doc("doc"):"function(method:string):string -- Brief description of method"

getAdvancedMethodsData([method]):table - возвращает полную информацию о методе, или всех методах.
    возвращаемая структура:
    - description:string - текстовое описание
    - source:string - идентификатор адаптера
    - returnTypes:string - строчка с возвращаемым типом(типами) данных
    - args:table - аргументы функции:
        - name:string
        - type:string - тип аргумента, но есть баг - отображается java-тип
        - description:string
        - nullable:bool? - принимает ли значение nil
        - optional:bool? - является ли необязательным аргументом
        - vararg:bool?   - переменное кол-во аргументов (или ...)

 

Предметы и сущности
Одной из интересных особенностей OpenPeripheral является система доступа к метаданным предметов или сущностей, а именно - прокси (proxy, он же - паттерн "заместитель"). Прокси является неким контейнером, содержащем прямую ссылку на java-объект, что позволяет получать актуальную информацию о предмете или сущности, до тех пор пока прокси или объект не выгрузится из памяти.
Многие методы OpenPeripheral, возвращающие данные о предметах или сущностях, могут вернуть прокси. Это позволяет экономить память в условиях огромного объема обрабатываемой информации, например - получение всех предметов ME сети, или наоборот - при малом объеме памяти на пк.

Но есть и серьезный минус при работе с прокси - любая попытка доступа к данным будет занимать один игровой тик.

 

Прокси предметов или сущностей возвращают некоторую базовую информацию, например идентификатор, позиция и т.п. Но для более подробной информации используются провайдер - интерфейс, предоставляющий специфичные данные, записанные, например, в NBT. У объекта может быть несколько провайдеров, по этому у провайдера есть идентификатор, или ключ, под которым записаны данные конкретного провайдера в объекте. Прокси реализует доступ как к отдельным провайдерам, так и сразу ко всей информации.
Для предметов и сущностей структура прокси одинакова:

basic():table - базовая информация об объекте, содержит фиксированные поля. Данные зависят от реализации.

all():table - содержит информацию из basic(), а также предоставляемую провайдерами информацию.

keys():table - возвращает таблицу {name=true} со всеми провайдерами.

single(key):object - возвращает информацию, предоставляемую провайдером.

select(keys...):object - возвращает информацию, предоставляемую всеми переданными провайдерами.

Примечание: прокси выгруженных объектов, при обращении к функциям, будут возвращать nil.

 

Провайдеры добавляются отдельными модулями OpenPeripheral, а в ядре содержится только базовая информация, возвращаемая функцией base().

Базовая информация предмета:

id:string - полный идентификатор предмета mod:name
name:string - идентификатор предмета в модификации
mod_id:string - идентификатор модификации
display_name:string - отображаемое имя, зависит от языка сервера, и назначенного на наковальне имени
raw_name:string - имя предмета для локализации, в нижнем регистре
qty:number - кол-во предметов в стаке
dmg:number - мета, или прочность предмета
health_bar:number? - отображаемое в полоске прочности значение, 0.0-1.0
max_dmg:number - максимальная прочность предмета
max_size:number - максимальный размер стака

 

Базовая информация сущности:

position:table {x,y,z} - относительная или абсолютная позиция сущности
name:string - имя сущности
id:number - номер сущности (по порядку появления в мире)
uuid:string - уникальный идентификатор сущности (идентификатор в базе данных)
riddenBy:number? - номер сущности, оседлавшей это существо
ridingEntity:number? - номер сущности, которую оседлало это существо

 

Жидкости

Информация о жидкости:

amount:number - объем жидкости
id:number - идентификатор жидкости
name:string? - имя жидкости
rawName:string? - название жидкости - зависит от языка сервера

Информация о хранилище жидкости:

capacity:number - общий объем хранилища
contents:table - содержащаяся жидкость

 

Игровой профиль

Информация о игроке:

name:string - имя игрока
uuid:string - уникальный идентификатор игрока

 

Если у вас есть мысли, что может дополнить статью - был бы рад услышать.

  • Нравится 3
  • Одобряю 1


0 комментариев


Рекомендуемые комментарии

Нет комментариев для отображения

Гость
Добавить комментарий...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...