From a92b893bc9e387ff0d21ce9f652f17a3274f05e5 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sat, 16 Nov 2024 11:13:09 +0700 Subject: [PATCH] Fix fluid tank item crashing server during save --- .../fluid/BlockMatteryFluidHandler.kt | 9 +++++- .../mc/otm/item/block/FluidTankItem.kt | 29 +++++++++---------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/fluid/BlockMatteryFluidHandler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/fluid/BlockMatteryFluidHandler.kt index 9e77de59c..802c1198d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/fluid/BlockMatteryFluidHandler.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/fluid/BlockMatteryFluidHandler.kt @@ -4,6 +4,7 @@ import net.minecraft.core.HolderLookup import net.minecraft.core.component.DataComponents import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.Tag +import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.BlockItem import net.minecraft.world.item.ItemStack import net.minecraft.world.item.component.CustomData @@ -39,7 +40,7 @@ open class BlockMatteryFluidHandler(private val _capacity: IntSupplier, field: D /** * Fluid handler for items representing block with [BlockMatteryFluidHandler] */ - open class Item(itemStack: ItemStack, capacity: IntSupplier, private val nbtName: String) : ItemMatteryFluidHandler(itemStack, capacity) { + open class Item(itemStack: ItemStack, capacity: IntSupplier, private val nbtName: String, private val blockEntityID: ResourceLocation) : ItemMatteryFluidHandler(itemStack, capacity) { override var fluid: FluidStack get() { val custom = itemStack.getOrDefault(DataComponents.BLOCK_ENTITY_DATA, CustomData.EMPTY) @@ -51,6 +52,12 @@ open class BlockMatteryFluidHandler(private val _capacity: IntSupplier, field: D itemStack[DataComponents.BLOCK_ENTITY_DATA] = CustomData.of(data.copyTag().also { it[nbtName] = value.saveOptional(Registries) + + // workaround for minecraft requiring block entity IDs inside blockitems + // but why? it is not used, like, anywhere. + if ("id" !in it) { + it["id"] = blockEntityID.toString() + } }) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/block/FluidTankItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/block/FluidTankItem.kt index 1052cde34..fbaa8126c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/block/FluidTankItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/block/FluidTankItem.kt @@ -7,9 +7,11 @@ import net.minecraft.world.item.BlockItem import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag import net.minecraft.world.item.context.UseOnContext +import net.minecraft.world.level.block.entity.BlockEntityType import net.neoforged.neoforge.capabilities.Capabilities import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions +import net.neoforged.neoforge.client.extensions.common.RegisterClientExtensionsEvent import ru.dbotthepony.mc.otm.block.decorative.FluidTankBlock import ru.dbotthepony.mc.otm.block.entity.decorative.FluidTankBlockEntity import ru.dbotthepony.mc.otm.capability.fluid.BlockMatteryFluidHandler @@ -18,19 +20,23 @@ import ru.dbotthepony.mc.otm.core.TooltipList import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.item.FluidCapsuleItem import ru.dbotthepony.mc.otm.registry.CapabilitiesRegisterListener -import java.util.function.Consumer +import ru.dbotthepony.mc.otm.registry.ClientExtensionsListener +import ru.dbotthepony.mc.otm.registry.MBlockEntities import java.util.function.IntSupplier -class FluidTankItem(block: FluidTankBlock, properties: Properties, val capacity: IntSupplier) : BlockItem(block, properties), - CapabilitiesRegisterListener { +class FluidTankItem(block: FluidTankBlock, properties: Properties, val capacity: IntSupplier) : BlockItem(block, properties), CapabilitiesRegisterListener, ClientExtensionsListener { val tooltips = TooltipList() init { tooltips.itemFluid() } + private val blockEntityRegistryId by lazy { + BlockEntityType.getKey(MBlockEntities.FLUID_TANK)!! + } + override fun registerCapabilities(event: RegisterCapabilitiesEvent) { - event.registerItem(Capabilities.FluidHandler.ITEM, { o, c -> BlockMatteryFluidHandler.Item(o, capacity, FluidTankBlockEntity.FLUID_KEY) }, this) + event.registerItem(Capabilities.FluidHandler.ITEM, { o, c -> BlockMatteryFluidHandler.Item(o, capacity, FluidTankBlockEntity.FLUID_KEY, blockEntityRegistryId) }, this) } override fun onItemUseFirst(stack: ItemStack, pContext: UseOnContext): InteractionResult { @@ -43,12 +49,7 @@ class FluidTankItem(block: FluidTankBlock, properties: Properties, val capacity: pContext.clickedFace ) - if (FluidCapsuleItem.canInteract( - pContext.itemInHand, - pContext.player ?: return InteractionResult.FAIL, - context - ) - ) + if (FluidCapsuleItem.canInteract(pContext.itemInHand, pContext.player ?: return InteractionResult.FAIL, context)) return FluidCapsuleItem.interact(pContext.itemInHand, pContext.player!!, context) return super.onItemUseFirst(stack, pContext) @@ -76,13 +77,11 @@ class FluidTankItem(block: FluidTankBlock, properties: Properties, val capacity: tooltips.assemble(pStack, p_339594_, pTooltip::add) } - override fun initializeClient(consumer: Consumer) { - super.initializeClient(consumer) - - consumer.accept(object : IClientItemExtensions { + override fun registerClientExtensions(event: RegisterClientExtensionsEvent) { + event.registerItem(object : IClientItemExtensions { override fun getCustomRenderer(): BlockEntityWithoutLevelRenderer { return FluidTankRenderer.FluidTankItemRenderer } - }) + }, this) } }