- Сообщения
- 575
- Решения
- 27
Мне нужно сохранить предметы в блок, который изначально для этого не предназначен. GUI у меня уже есть, осталось сохранение предметов.
Я рассматривал несколько вариантов:
1) Сохранение инвентаря в отдельный файл
Это самый простой вариант, но мне он не нравится.
Во-первых, на каждый блок будет создан новый файл, а это не очень хорошо, во-вторых, это не очень быстро будет работать.
2) Сохранение инвентарей в отдельный файл
Суть в том, что для каждого чанка с нужными мне блоками будет создаваться файл, в котором уже хранятся нужные предметы.
Что-то вроде:
Скорее всего это будет еще медленнее из-за возможных размеров файлов
3) Сохранение инвентарей в базу данных
Мне кажется это не сильно отличается от файлов, разве что тут все более или менее структурировано.
4) Использование MetadataValue и Metadatable
Это казалось мне наиболее подходящим решением.
Во-первых, интерфейс Block наследует Metadatable;
во-вторых, с этим всем не трудно работать;
в-третьих, мне вроде как не нужны никакие лишние файлы.
Это казалось бы идеальное решение проблемы обломалось на одном не идеальном моменте - ItemStack не реализует MetadataValue. Значит, он не может быть сохранен никак. Только примитивы и строки.
5) NBT
Если память мне не изменяет - Minecraft позволяет сохранять NBT в предметы, блоки и существ. В новых версиях CompoundTag даже содержит метод для сохранения и чтения самих ItemStack'ов. Осталось разве что как-то сохранять и читать NBT блока в Bukkit, желательно без сторонних библиотек, ну или с минимумом рефлексии и NMS, дабы не терять поддержку нескольких версий.
Я рассматривал несколько вариантов:
1) Сохранение инвентаря в отдельный файл
Это самый простой вариант, но мне он не нравится.
Во-первых, на каждый блок будет создан новый файл, а это не очень хорошо, во-вторых, это не очень быстро будет работать.
2) Сохранение инвентарей в отдельный файл
Суть в том, что для каждого чанка с нужными мне блоками будет создаваться файл, в котором уже хранятся нужные предметы.
Что-то вроде:
YAML:
block-1:
location:
x: 0
z: 19
y: 23
inventory:
1:
==: org.bukkit.inventory.ItemStack
v: <data version>
type: <item type name>
amount: <stack size>
...
2:
...
block-2:
location:
...
3) Сохранение инвентарей в базу данных
Мне кажется это не сильно отличается от файлов, разве что тут все более или менее структурировано.
4) Использование MetadataValue и Metadatable
Это казалось мне наиболее подходящим решением.
Во-первых, интерфейс Block наследует Metadatable;
во-вторых, с этим всем не трудно работать;
в-третьих, мне вроде как не нужны никакие лишние файлы.
Это казалось бы идеальное решение проблемы обломалось на одном не идеальном моменте - ItemStack не реализует MetadataValue. Значит, он не может быть сохранен никак. Только примитивы и строки.
5) NBT
Если память мне не изменяет - Minecraft позволяет сохранять NBT в предметы, блоки и существ. В новых версиях CompoundTag даже содержит метод для сохранения и чтения самих ItemStack'ов. Осталось разве что как-то сохранять и читать NBT блока в Bukkit, желательно без сторонних библиотек, ну или с минимумом рефлексии и NMS, дабы не терять поддержку нескольких версий.