Class PlatformHooks

java.lang.Object
com.hbm_m.platform.PlatformHooks

public final class PlatformHooks extends Object
Платформенный слой Strategy B: тонкие адаптеры для API, которые НЕ покрывает Architectury.

Архитектура (см. правило 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 не существует. Поэтому:

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 Type
    Method
    Description
    static boolean
    contains(net.minecraft.world.item.ItemStack stack, String key)
    stack.hasTag() && stack.getTag().contains(key).
    static void
    editItemTag(net.minecraft.world.item.ItemStack stack, Consumer<net.minecraft.nbt.CompoundTag> editor)
    Read-modify-write: изменения сохраняются на ОБЕИХ версиях.
    static boolean
    getBoolean(net.minecraft.world.item.ItemStack stack, String key)
    stack.getTag().getBoolean(key) с защитой от null.
    static net.minecraft.nbt.CompoundTag
    getCompound(net.minecraft.world.item.ItemStack stack, String key)
    stack.getTag().getCompound(key) с защитой от null.
    static Path
    Глобальный каталог <game>/config.
    static int
    getInt(net.minecraft.world.item.ItemStack stack, String key)
    stack.getTag().getInt(key) с защитой от null (0 если тега/ключа нет).
    static net.minecraft.nbt.CompoundTag
    getItemTag(net.minecraft.network.protocol.game.ClientboundBlockEntityDataPacket pkt)
    Тег из ClientboundBlockEntityDataPacket (только для чтения).
    static net.minecraft.nbt.CompoundTag
    getItemTag(net.minecraft.world.item.ItemStack stack)
    Custom-NBT предмета (только для чтения).
    static long
    getLong(net.minecraft.world.item.ItemStack stack, String key)
    stack.getTag().getLong(key) с защитой от null.
    static String
    getString(net.minecraft.world.item.ItemStack stack, String key)
    stack.getTag().getString(key) с защитой от null.
    static boolean
    hasItemTag(net.minecraft.world.item.ItemStack stack)
    Есть ли у предмета custom-NBT.
    static void
    put(net.minecraft.world.item.ItemStack stack, String key, net.minecraft.nbt.CompoundTag val)
    stack.getOrCreateTag().put(key, val) для вложенного CompoundTag.
    static void
    putBoolean(net.minecraft.world.item.ItemStack stack, String key, boolean val)
    stack.getOrCreateTag().putBoolean(key, val).
    static void
    putInt(net.minecraft.world.item.ItemStack stack, String key, int val)
    stack.getOrCreateTag().putInt(key, val) — read-modify-write, сохраняется на обеих версиях.
    static void
    putLong(net.minecraft.world.item.ItemStack stack, String key, long val)
    stack.getOrCreateTag().putLong(key, val).
    static void
    putString(net.minecraft.world.item.ItemStack stack, String key, String val)
    stack.getOrCreateTag().putString(key, val).
    static void
    remove(net.minecraft.world.item.ItemStack stack, String key)
    stack.getTag().remove(key) — read-modify-write, сохраняется на обеих версиях.
    static void
    setItemTag(net.minecraft.world.item.ItemStack stack, net.minecraft.nbt.CompoundTag tag)
    Полная перезапись custom-NBT предмета.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • 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

      public static int getInt(net.minecraft.world.item.ItemStack stack, String key)
      stack.getTag().getInt(key) с защитой от null (0 если тега/ключа нет).
    • getLong

      public static long getLong(net.minecraft.world.item.ItemStack stack, String key)
      stack.getTag().getLong(key) с защитой от null.
    • getBoolean

      public static boolean getBoolean(net.minecraft.world.item.ItemStack stack, String key)
      stack.getTag().getBoolean(key) с защитой от null.
    • getString

      public static String getString(net.minecraft.world.item.ItemStack stack, String key)
      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

      public static void putInt(net.minecraft.world.item.ItemStack stack, String key, int val)
      stack.getOrCreateTag().putInt(key, val) — read-modify-write, сохраняется на обеих версиях.
    • putLong

      public static void putLong(net.minecraft.world.item.ItemStack stack, String key, long val)
      stack.getOrCreateTag().putLong(key, val).
    • putBoolean

      public static void putBoolean(net.minecraft.world.item.ItemStack stack, String key, boolean val)
      stack.getOrCreateTag().putBoolean(key, val).
    • putString

      public static void putString(net.minecraft.world.item.ItemStack stack, String key, String val)
      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

      public static boolean contains(net.minecraft.world.item.ItemStack stack, String key)
      stack.hasTag() && stack.getTag().contains(key).
    • remove

      public static void remove(net.minecraft.world.item.ItemStack stack, String key)
      stack.getTag().remove(key) — read-modify-write, сохраняется на обеих версиях.
    • getConfigDir

      public static Path getConfigDir()
      Глобальный каталог <game>/config. Подкаталог мода — config/hbm_m.