Class PlatformHooks
Архитектура (см. правило platform-strategy-b.md):
- Если Architectury уже даёт абстракцию — используем её напрямую (например, меню:
dev.architectury.registry.menu.MenuRegistry.openExtendedMenu). - Если абстракции нет — hook добавляется сюда с ветвлением через stonecutter
//? if forge/fabric/neoforge.
Item custom-NBT / DataComponents bridge
Кросс-версионный доступ к «произвольным данным предмета». Это главная разница 1.20.1 ↔ 1.21.1:- 1.20.1 (forge/fabric):
ItemStack.getTag()/getOrCreateTag()/setTag()— живойCompoundTag, мутации сохраняются сразу. - 1.21.1+ (neoforge):
DataComponents.CUSTOM_DATA(CustomData) — иммутабельное значение; чтение даёт копию, для сохранения изменений нуженstack.set(DataComponents.CUSTOM_DATA, ...).
Следствие: идеальной drop-in замены getOrCreateTag() (живая ссылка) на 1.21.1
не существует. Поэтому:
- Для мутаций используйте
editItemTag(net.minecraft.world.item.ItemStack, java.util.function.Consumer<net.minecraft.nbt.CompoundTag>)(read-modify-write, сохраняется на обеих версиях). - Для чтения —
getItemTag(net.minecraft.world.item.ItemStack)(возвращает копию на 1.21.1; не мутируйте).
Gating-нюанс: NBT→DataComponents — это ВЕРСИОННОЕ различие, но пока gated по loader'у
(forge||fabric = 1.20.1 NBT, neoforge = 1.21.1 DataComponents) — корректно для
текущего набора (1.20.1-forge/fabric, 1.21.1-neoforge). При активации 1.21.1-fabric потребуется
рефакторинг на version-gating (константа data_components в stonecutter.gradle.kts).
-
Method Summary
Modifier and TypeMethodDescriptionstatic booleanstack.hasTag() && stack.getTag().contains(key).static voideditItemTag(net.minecraft.world.item.ItemStack stack, Consumer<net.minecraft.nbt.CompoundTag> editor) Read-modify-write: изменения сохраняются на ОБЕИХ версиях.static booleangetBoolean(net.minecraft.world.item.ItemStack stack, String key) stack.getTag().getBoolean(key)с защитой от null.static net.minecraft.nbt.CompoundTaggetCompound(net.minecraft.world.item.ItemStack stack, String key) stack.getTag().getCompound(key)с защитой от null.static PathГлобальный каталог<game>/config.static intstack.getTag().getInt(key)с защитой от null (0 если тега/ключа нет).static net.minecraft.nbt.CompoundTaggetItemTag(net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket pkt) Тег изClientboundBlockEntityDataPacket(только для чтения).static net.minecraft.nbt.CompoundTaggetItemTag(net.minecraft.world.item.ItemStack stack) Custom-NBT предмета (только для чтения).static longstack.getTag().getLong(key)с защитой от null.static Stringstack.getTag().getString(key)с защитой от null.static booleanhasItemTag(net.minecraft.world.item.ItemStack stack) Есть ли у предмета custom-NBT.static voidstack.getOrCreateTag().put(key, val)для вложенного CompoundTag.static voidputBoolean(net.minecraft.world.item.ItemStack stack, String key, boolean val) stack.getOrCreateTag().putBoolean(key, val).static voidstack.getOrCreateTag().putInt(key, val)— read-modify-write, сохраняется на обеих версиях.static voidstack.getOrCreateTag().putLong(key, val).static voidstack.getOrCreateTag().putString(key, val).static voidstack.getTag().remove(key)— read-modify-write, сохраняется на обеих версиях.static voidsetItemTag(net.minecraft.world.item.ItemStack stack, net.minecraft.nbt.CompoundTag tag) Полная перезапись custom-NBT предмета.
-
Method Details
-
getItemTag
public static net.minecraft.nbt.CompoundTag getItemTag(net.minecraft.world.item.ItemStack stack) Custom-NBT предмета (только для чтения).ВАЖНО: на 1.21.1 возвращается КОПИЯ — не мутируйте её с ожиданием сохранения. Для записи используйте
editItemTag(net.minecraft.world.item.ItemStack, java.util.function.Consumer<net.minecraft.nbt.CompoundTag>)илиsetItemTag(net.minecraft.world.item.ItemStack, net.minecraft.nbt.CompoundTag).- Returns:
- тег или
null, если у предмета нет custom-NBT
-
getItemTag
public static net.minecraft.nbt.CompoundTag getItemTag(net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket pkt) Тег изClientboundBlockEntityDataPacket(только для чтения).Версионная инвариантность:
pkt.getTag()существует и работает одинаково на 1.20.1 и 1.21.1 — это сетевой пакет, а не ItemStack, поэтому DataComponents здесь не применимы. Stonecutter-gating не нужен. -
hasItemTag
public static boolean hasItemTag(net.minecraft.world.item.ItemStack stack) Есть ли у предмета custom-NBT. -
editItemTag
public static void editItemTag(net.minecraft.world.item.ItemStack stack, Consumer<net.minecraft.nbt.CompoundTag> editor) Read-modify-write: изменения сохраняются на ОБЕИХ версиях.Рекомендованный примитив для мутаций. Заменяет паттерн
CompoundTag t = stack.getOrCreateTag(); t.putX(...);.// было (1.20.1): stack.getOrCreateTag().putLong("energy", v); // стало (обе версии): PlatformHooks.editItemTag(stack, t -> t.putLong("energy", v)); -
setItemTag
public static void setItemTag(net.minecraft.world.item.ItemStack stack, net.minecraft.nbt.CompoundTag tag) Полная перезапись custom-NBT предмета.tag == nullочищает данные (аналогstack.setTag(null)на 1.20.1). -
getInt
stack.getTag().getInt(key)с защитой от null (0 если тега/ключа нет). -
getLong
stack.getTag().getLong(key)с защитой от null. -
getBoolean
stack.getTag().getBoolean(key)с защитой от null. -
getString
stack.getTag().getString(key)с защитой от null. -
getCompound
public static net.minecraft.nbt.CompoundTag getCompound(net.minecraft.world.item.ItemStack stack, String key) stack.getTag().getCompound(key)с защитой от null. -
putInt
stack.getOrCreateTag().putInt(key, val)— read-modify-write, сохраняется на обеих версиях. -
putLong
stack.getOrCreateTag().putLong(key, val). -
putBoolean
stack.getOrCreateTag().putBoolean(key, val). -
putString
stack.getOrCreateTag().putString(key, val). -
put
public static void put(net.minecraft.world.item.ItemStack stack, String key, net.minecraft.nbt.CompoundTag val) stack.getOrCreateTag().put(key, val)для вложенного CompoundTag. -
contains
stack.hasTag() && stack.getTag().contains(key). -
remove
stack.getTag().remove(key)— read-modify-write, сохраняется на обеих версиях. -
getConfigDir
Глобальный каталог<game>/config. Подкаталог мода —config/hbm_m.
-