Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Плагин [ADMIN/DEV] NBTReflectionAPI 1.1.0 - Работа с NBT на разных версиях [1.8+]

Метки:
Теги Теги
api lib nbt reflection

_TheZit445_

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
_TheZit445_
NBTReflectionAPI
version 1.1.0 | Minecraft 1.8+
​
Данный плагин является очень простой библиотекой для удобной работы с NBT классами без зависимости от версии. API маленькое, но его хватает на реализацию большинства задач, для более гибкой работы используйте другие библиотеки. API работает с рефлексией, а она существенно увеличивает время выполнения вызовов. При работе с малым объёмом кода проблем нет, но при работе с большими кусками используйте NBT классы напрямую или пускайте обработку асинхронно.

Реализация простая - исходный код. Если есть идеи для оптимизации или заметили баг, пожалуйста сообщите.


Плагины, требующие библиотеку - CraftingAPI, ExploreMapCreator​

Лог изменений:
version 1.1.0
  1. Переписан код.
    • В некоторых местах код разбит на логические части.
    • NBTManager удалён, его функционал перешёл в другие классы.
    • Отдельные классы для объектов для более удобной разработки.
  2. Добавлена возможность получать NBT тэги сущностей и блок-сущностей.
  3. Добавлена возможность устанавливать сущностям и блок-сущностям NBT тэг.

version 1.0.0
  1. Релиз плагина
  2. Вырезан из CraftingAPI
    • Добавлены новые методы
    • Переписаны некоторые методы
    • Добавлены новые NMS классы
    • Добавлены исключения

Скачать плагин:
[Скачать] | author: thezit445 (Кирилл)
Если есть возможность помочь деньгами:
Яндекс.Деньги | Сбербанк - 5469380077044815 | WMP - P179891510270​
 
Последнее редактирование:
Работа с библиотекой.​
Существует несколько классов, с которыми можно работать:
  • NMSItem - представление ItemStack из NMS пакетов.
  • NMSEntity - представление Entity из NMS пакетов.
  • NMSTileEntity - представление TileEntity из NMS пакетов (BlockState).
  • NBTTagCompound - непосредственно NBT тэг.
  • NBTTagList - NBT тэг, хранящий динамический массив NBT тэгов.
NMSItem
Создание объекта:
По экземпляру bukkit ItemStack:
Код:
ItemStack itemStack = new ItemStack(Material.DIAMOND);
NMSItem nmsItem = new NMSItem(itemStack);
По экземпляру nms ItemStack:
Код:
Object nms = Some.thing.getNetMinecraftServerItem();
NMSItem nmsItem = new NMSItem(nms);
По тэгу NBT:
Код:
NBTTagCompound tag = new NBTTagCompound();
NMSItem nmsItem = new NMSItem(tag);
Методы:
Получение тэга:
Код:
NBTTagCompound tag = nmsItem.getNBT();
Установка тэга:
Код:
nmsItem.setNBT(tag);
Получение bukkit версии:
Код:
ItemStack item = nmsItem.asBukkit();
NMSEntity
Создание объекта:
По экземпляру bukkit Entity:
Код:
Entity entity = world.spawnEntity(location, EntityType.CREEPER);
NMSEntity nmsEntity = new NMSEntity(entity);
Методы:
Получение тэга:
Код:
NBTTagCompound tag = nmsEntity.getNBT();
Установка тэга:
Код:
nmsEntity.setNBT(tag);
Получение bukkit версии:
Код:
Entity entity = nmsEntity.asBukkit();
NMSTileEntity
Создание объекта:
По локации:
Код:
Location location = block.getLocation();
NMSTileEntity tile = new NMSTileEntity(location);
Примечание. Если на локации не находится блок-сущность, то все результаты методов будут выдавать null, а NMSTileEntity#getNBT() выдаст пустой тэг.​
Методы:
Получение тэга:
Код:
NBTTagCompound tag = tile.getNBT();
Установка тэга:
Код:
tile.setNBT(tag);
Обновить данные блока:
Код:
tile.update();
Получение bukkit версии:
Код:
BlockState state =tile.asBukkit();
NBTTagCompound:
Создание объекта:
Пустой тэг:
Код:
NBTTagCompound tag = new NBTTagCompound();
По экземпляру nms NBTTagCompound:
Код:
Object nmsNbtTagCompound = Some.thing.getNetMinecraftServerNbtTagCompound();
NBTTagCompound tag = new NBTTagCompound(nmsNbtTagCompound);
Методы:
Установка значений:
section - клюк для установки
value, array, nbt - значения для ключа
Пример: {CustomName:"John"} - CustomName - ключ, John - значение.
Код:
tag.setInt("Health", 20);
tag.setIntArray("Colors", new int[] {443, 3453, 234, -34});
tag.setByte("Count", (byte) 5);
tag.setByteArray("Colors", new byte[] {1,2,3,4,5});
tag.setLong("Variable", 122435346L);
tag.setShort("Power", (short) 24);
tag.setDouble("x", 234.45);
tag.setFloat("y", 1245.4F);
tag.setBoolean("NoAI", false);
tag.setString("Uuid","4sd5-df5wsed4-4345");
tag.set("passengers", new NBTTagCompound());
Получение тэга из ключа:
Код:
NBTTagCompound subTag = tag.get("passengers");
Получение nms копии:
Код:
Object nmsTag = tag.asNMS();
NBTTagList
Создание списка:
Пустой список:
Код:
NBTTagList nbtList = new NBTTagList();
По экземпляру nms NBTTagList:
Код:
Object nmsNbtList = Some.thing.getNetMinecraftServerNbtTagList();
NBTTagList nbtList = new NBTTagList(nmsNbtList);
Методы:
Добавить элемент в список:
Код:
nbtList.add(new NBTTagCompound());
nbtList.add(new NBTTagCompound(), 2);
Получения размера списка:
Код:
int size = nbtList.getSize();
Получение nms копии:
Код:
Object nmsNbtList = nbtList.asNMS();
 
Последнее редактирование:
Предложи как сделать лучше или дай хорошую альтернативу.
Дабы использовать по минимуму рефлексию, можно написать свою реализацию формата НБТ и передавать ее напрямую в пакеты со стороны сервера. Код я не смотрел, предупрежу сразу.
 
Дабы использовать по минимуму рефлексию, можно написать свою реализацию формата НБТ и передавать ее напрямую в пакеты со стороны сервера. Код я не смотрел, предупрежу сразу.
Звучит интересно. Посмотрим что можно сделать.
 
version 1.1.0
  1. Переписан код.
    • В некоторых местах код разбит на логические части.
    • NBTManager удалён, его функционал перешёл в другие классы.
    • Отдельные классы для объектов для более удобной разработки.
  2. Добавлена возможность получать NBT тэги сущностей и блок-сущностей.
  3. Добавлена возможность устанавливать сущностям и блок-сущностям NBT тэг.
 

Поделиться этой страницей

Назад
Верх