Fix fluid tank item crashing server during save
This commit is contained in:
parent
9daa3df589
commit
a92b893bc9
@ -4,6 +4,7 @@ import net.minecraft.core.HolderLookup
|
|||||||
import net.minecraft.core.component.DataComponents
|
import net.minecraft.core.component.DataComponents
|
||||||
import net.minecraft.nbt.CompoundTag
|
import net.minecraft.nbt.CompoundTag
|
||||||
import net.minecraft.nbt.Tag
|
import net.minecraft.nbt.Tag
|
||||||
|
import net.minecraft.resources.ResourceLocation
|
||||||
import net.minecraft.world.item.BlockItem
|
import net.minecraft.world.item.BlockItem
|
||||||
import net.minecraft.world.item.ItemStack
|
import net.minecraft.world.item.ItemStack
|
||||||
import net.minecraft.world.item.component.CustomData
|
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]
|
* 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
|
override var fluid: FluidStack
|
||||||
get() {
|
get() {
|
||||||
val custom = itemStack.getOrDefault(DataComponents.BLOCK_ENTITY_DATA, CustomData.EMPTY)
|
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 {
|
itemStack[DataComponents.BLOCK_ENTITY_DATA] = CustomData.of(data.copyTag().also {
|
||||||
it[nbtName] = value.saveOptional(Registries)
|
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()
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,11 @@ import net.minecraft.world.item.BlockItem
|
|||||||
import net.minecraft.world.item.ItemStack
|
import net.minecraft.world.item.ItemStack
|
||||||
import net.minecraft.world.item.TooltipFlag
|
import net.minecraft.world.item.TooltipFlag
|
||||||
import net.minecraft.world.item.context.UseOnContext
|
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.Capabilities
|
||||||
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent
|
import net.neoforged.neoforge.capabilities.RegisterCapabilitiesEvent
|
||||||
import net.neoforged.neoforge.client.extensions.common.IClientItemExtensions
|
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.decorative.FluidTankBlock
|
||||||
import ru.dbotthepony.mc.otm.block.entity.decorative.FluidTankBlockEntity
|
import ru.dbotthepony.mc.otm.block.entity.decorative.FluidTankBlockEntity
|
||||||
import ru.dbotthepony.mc.otm.capability.fluid.BlockMatteryFluidHandler
|
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.core.TranslatableComponent
|
||||||
import ru.dbotthepony.mc.otm.item.FluidCapsuleItem
|
import ru.dbotthepony.mc.otm.item.FluidCapsuleItem
|
||||||
import ru.dbotthepony.mc.otm.registry.CapabilitiesRegisterListener
|
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
|
import java.util.function.IntSupplier
|
||||||
|
|
||||||
class FluidTankItem(block: FluidTankBlock, properties: Properties, val capacity: IntSupplier) : BlockItem(block, properties),
|
class FluidTankItem(block: FluidTankBlock, properties: Properties, val capacity: IntSupplier) : BlockItem(block, properties), CapabilitiesRegisterListener, ClientExtensionsListener {
|
||||||
CapabilitiesRegisterListener {
|
|
||||||
val tooltips = TooltipList()
|
val tooltips = TooltipList()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
tooltips.itemFluid()
|
tooltips.itemFluid()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val blockEntityRegistryId by lazy {
|
||||||
|
BlockEntityType.getKey(MBlockEntities.FLUID_TANK)!!
|
||||||
|
}
|
||||||
|
|
||||||
override fun registerCapabilities(event: RegisterCapabilitiesEvent) {
|
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 {
|
override fun onItemUseFirst(stack: ItemStack, pContext: UseOnContext): InteractionResult {
|
||||||
@ -43,12 +49,7 @@ class FluidTankItem(block: FluidTankBlock, properties: Properties, val capacity:
|
|||||||
pContext.clickedFace
|
pContext.clickedFace
|
||||||
)
|
)
|
||||||
|
|
||||||
if (FluidCapsuleItem.canInteract(
|
if (FluidCapsuleItem.canInteract(pContext.itemInHand, pContext.player ?: return InteractionResult.FAIL, context))
|
||||||
pContext.itemInHand,
|
|
||||||
pContext.player ?: return InteractionResult.FAIL,
|
|
||||||
context
|
|
||||||
)
|
|
||||||
)
|
|
||||||
return FluidCapsuleItem.interact(pContext.itemInHand, pContext.player!!, context)
|
return FluidCapsuleItem.interact(pContext.itemInHand, pContext.player!!, context)
|
||||||
|
|
||||||
return super.onItemUseFirst(stack, pContext)
|
return super.onItemUseFirst(stack, pContext)
|
||||||
@ -76,13 +77,11 @@ class FluidTankItem(block: FluidTankBlock, properties: Properties, val capacity:
|
|||||||
tooltips.assemble(pStack, p_339594_, pTooltip::add)
|
tooltips.assemble(pStack, p_339594_, pTooltip::add)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun initializeClient(consumer: Consumer<IClientItemExtensions>) {
|
override fun registerClientExtensions(event: RegisterClientExtensionsEvent) {
|
||||||
super.initializeClient(consumer)
|
event.registerItem(object : IClientItemExtensions {
|
||||||
|
|
||||||
consumer.accept(object : IClientItemExtensions {
|
|
||||||
override fun getCustomRenderer(): BlockEntityWithoutLevelRenderer {
|
override fun getCustomRenderer(): BlockEntityWithoutLevelRenderer {
|
||||||
return FluidTankRenderer.FluidTankItemRenderer
|
return FluidTankRenderer.FluidTankItemRenderer
|
||||||
}
|
}
|
||||||
})
|
}, this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user