Update CopyTileNbtFunction

This commit is contained in:
DBotThePony 2024-08-25 13:25:32 +07:00
parent cb85689ea9
commit 2323854705
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 54 additions and 43 deletions

View File

@ -3,7 +3,6 @@ package ru.dbotthepony.mc.otm.block
import com.google.common.collect.ImmutableMap import com.google.common.collect.ImmutableMap
import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap import it.unimi.dsi.fastutil.objects.Object2ObjectArrayMap
import it.unimi.dsi.fastutil.objects.Object2ObjectFunction import it.unimi.dsi.fastutil.objects.Object2ObjectFunction
import it.unimi.dsi.fastutil.objects.ObjectIterators
import net.minecraft.ChatFormatting import net.minecraft.ChatFormatting
import net.minecraft.Util import net.minecraft.Util
import net.minecraft.core.BlockPos import net.minecraft.core.BlockPos
@ -13,7 +12,6 @@ import net.minecraft.core.particles.DustParticleOptions
import net.minecraft.network.chat.Component import net.minecraft.network.chat.Component
import net.minecraft.util.RandomSource import net.minecraft.util.RandomSource
import net.minecraft.world.Containers import net.minecraft.world.Containers
import net.minecraft.world.InteractionHand
import net.minecraft.world.InteractionResult import net.minecraft.world.InteractionResult
import net.minecraft.world.MenuProvider import net.minecraft.world.MenuProvider
import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.LivingEntity
@ -21,7 +19,6 @@ import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.Item import net.minecraft.world.item.Item
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.level.BlockGetter
import net.minecraft.world.level.Level import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
import net.minecraft.world.level.block.EntityBlock import net.minecraft.world.level.block.EntityBlock
@ -45,7 +42,6 @@ import ru.dbotthepony.mc.otm.core.math.component1
import ru.dbotthepony.mc.otm.core.math.component2 import ru.dbotthepony.mc.otm.core.math.component2
import ru.dbotthepony.mc.otm.core.math.component3 import ru.dbotthepony.mc.otm.core.math.component3
import ru.dbotthepony.mc.otm.once import ru.dbotthepony.mc.otm.once
import ru.dbotthepony.mc.otm.registry.MDataComponentTypes
import java.util.concurrent.Callable import java.util.concurrent.Callable
import java.util.function.Function import java.util.function.Function
import java.util.function.Supplier import java.util.function.Supplier
@ -186,7 +182,6 @@ open class MatteryBlock(properties: Properties = DEFAULT_PROPERTIES) : Block(pro
} }
} }
@Suppress("OVERRIDE_DEPRECATION")
override fun getMenuProvider(blockState: BlockState, level: Level, blockPos: BlockPos): MenuProvider? { override fun getMenuProvider(blockState: BlockState, level: Level, blockPos: BlockPos): MenuProvider? {
if (this is EntityBlock) { if (this is EntityBlock) {
val tile = level.getBlockEntity(blockPos) val tile = level.getBlockEntity(blockPos)
@ -207,7 +202,6 @@ open class MatteryBlock(properties: Properties = DEFAULT_PROPERTIES) : Block(pro
neighbourPos: BlockPos, neighbourPos: BlockPos,
movedByPiston: Boolean movedByPiston: Boolean
) { ) {
@Suppress("DEPRECATION")
super.neighborChanged(state, level, pos, neighbour, neighbourPos, movedByPiston) super.neighborChanged(state, level, pos, neighbour, neighbourPos, movedByPiston)
if (this is EntityBlock && !level.isClientSide) { if (this is EntityBlock && !level.isClientSide) {
@ -225,7 +219,6 @@ open class MatteryBlock(properties: Properties = DEFAULT_PROPERTIES) : Block(pro
} }
} }
@Suppress("OVERRIDE_DEPRECATION")
override fun onRemove( override fun onRemove(
oldBlockState: BlockState, oldBlockState: BlockState,
level: Level, level: Level,
@ -246,7 +239,6 @@ open class MatteryBlock(properties: Properties = DEFAULT_PROPERTIES) : Block(pro
} }
} }
@Suppress("DEPRECATION")
super.onRemove(oldBlockState, level, blockPos, newBlockState, movedByPiston) super.onRemove(oldBlockState, level, blockPos, newBlockState, movedByPiston)
} }
@ -264,12 +256,12 @@ open class MatteryBlock(properties: Properties = DEFAULT_PROPERTIES) : Block(pro
override fun appendHoverText( override fun appendHoverText(
itemStack: ItemStack, itemStack: ItemStack,
p_339606_: Item.TooltipContext, context: Item.TooltipContext,
components: MutableList<Component>, components: MutableList<Component>,
tooltipType: TooltipFlag tooltipType: TooltipFlag
) { ) {
super.appendHoverText(itemStack, p_339606_, components, tooltipType) super.appendHoverText(itemStack, context, components, tooltipType)
tooltips.assemble(itemStack, p_339606_, components) tooltips.assemble(itemStack, context, components)
} }
companion object { companion object {

View File

@ -1,33 +1,32 @@
package ru.dbotthepony.mc.otm.block.entity package ru.dbotthepony.mc.otm.block.entity
import com.google.common.collect.ImmutableSet import com.google.common.collect.ImmutableSet
import com.google.gson.JsonParser
import net.minecraft.world.level.block.entity.BlockEntityType
import net.minecraft.core.BlockPos import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.core.HolderLookup import net.minecraft.core.HolderLookup
import net.minecraft.world.level.block.state.BlockState import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.NbtOps
import net.minecraft.network.chat.Component
import net.minecraft.network.chat.ComponentSerialization
import net.minecraft.world.MenuProvider import net.minecraft.world.MenuProvider
import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Inventory
import net.minecraft.world.entity.player.Player import net.minecraft.world.entity.player.Player
import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.inventory.AbstractContainerMenu
import net.minecraft.nbt.CompoundTag
import net.minecraft.network.chat.Component
import net.minecraft.world.item.ItemStack import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level import net.minecraft.world.level.Level
import net.minecraft.world.level.block.entity.BlockEntity import net.minecraft.world.level.block.entity.BlockEntityType
import net.minecraft.world.level.block.state.BlockState
import net.neoforged.neoforge.capabilities.Capabilities import net.neoforged.neoforge.capabilities.Capabilities
import net.neoforged.neoforge.capabilities.ICapabilityProvider
import net.neoforged.neoforge.fluids.FluidStack import net.neoforged.neoforge.fluids.FluidStack
import net.neoforged.neoforge.fluids.capability.IFluidHandler import net.neoforged.neoforge.fluids.capability.IFluidHandler
import net.neoforged.neoforge.items.IItemHandler import net.neoforged.neoforge.items.IItemHandler
import org.apache.logging.log4j.LogManager
import ru.dbotthepony.kommons.util.getValue import ru.dbotthepony.kommons.util.getValue
import ru.dbotthepony.kommons.util.setValue import ru.dbotthepony.kommons.util.setValue
import ru.dbotthepony.mc.otm.capability.FlowDirection
import ru.dbotthepony.mc.otm.capability.energy.IMatteryEnergyStorage
import ru.dbotthepony.mc.otm.capability.item.CombinedItemHandler import ru.dbotthepony.mc.otm.capability.item.CombinedItemHandler
import ru.dbotthepony.mc.otm.capability.item.EmptyItemHandler import ru.dbotthepony.mc.otm.capability.item.EmptyItemHandler
import ru.dbotthepony.mc.otm.capability.FlowDirection
import ru.dbotthepony.mc.otm.capability.item.UnmodifiableItemHandler import ru.dbotthepony.mc.otm.capability.item.UnmodifiableItemHandler
import ru.dbotthepony.mc.otm.capability.energy.IMatteryEnergyStorage
import ru.dbotthepony.mc.otm.capability.moveBetweenSlots import ru.dbotthepony.mc.otm.capability.moveBetweenSlots
import ru.dbotthepony.mc.otm.capability.moveEnergy import ru.dbotthepony.mc.otm.capability.moveEnergy
import ru.dbotthepony.mc.otm.capability.moveFluid import ru.dbotthepony.mc.otm.capability.moveFluid
@ -36,10 +35,10 @@ import ru.dbotthepony.mc.otm.core.getValue
import ru.dbotthepony.mc.otm.core.immutableMap import ru.dbotthepony.mc.otm.core.immutableMap
import ru.dbotthepony.mc.otm.core.math.Decimal import ru.dbotthepony.mc.otm.core.math.Decimal
import ru.dbotthepony.mc.otm.core.math.RelativeSide import ru.dbotthepony.mc.otm.core.math.RelativeSide
import ru.dbotthepony.mc.otm.core.nbt.getJson import ru.dbotthepony.mc.otm.core.nbt.set
import ru.dbotthepony.mc.otm.core.nbt.putJson
import ru.dbotthepony.mc.otm.core.util.ITickable import ru.dbotthepony.mc.otm.core.util.ITickable
import ru.dbotthepony.mc.otm.once import ru.dbotthepony.mc.otm.once
import kotlin.jvm.optionals.getOrNull
/** /**
* Device block entity base, implementing [MenuProvider] and [IRedstoneControlled], and also tracks custom display name * Device block entity base, implementing [MenuProvider] and [IRedstoneControlled], and also tracks custom display name
@ -75,12 +74,23 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
super.saveShared(nbt, registry) super.saveShared(nbt, registry)
if (customDisplayName != null) if (customDisplayName != null)
nbt.putJson("Name", JsonParser.parseString(Component.Serializer.toJson(customDisplayName!!, registry))) ComponentSerialization
.CODEC
.encodeStart(registry.createSerializationContext(NbtOps.INSTANCE), customDisplayName)
.resultOrPartial { LOGGER.error("Unable to serialize custom name: {}", it) }
.ifPresent { nbt["Name"] = it }
} }
override fun loadAdditional(nbt: CompoundTag, registry: HolderLookup.Provider) { override fun loadAdditional(nbt: CompoundTag, registry: HolderLookup.Provider) {
super.loadAdditional(nbt, registry) super.loadAdditional(nbt, registry)
customDisplayName = nbt.getJson("Name")?.let { Component.Serializer.fromJson(it, registry) }
if ("Name" in nbt) {
customDisplayName = ComponentSerialization
.CODEC
.decode(registry.createSerializationContext(NbtOps.INSTANCE), nbt["Name"]!!)
.resultOrPartial { LOGGER.error("Unable to deserialize custom name: {}", it) }
.getOrNull()?.first
}
} }
override fun setLevel(level: Level) { override fun setLevel(level: Level) {
@ -699,6 +709,8 @@ abstract class MatteryDeviceBlockEntity(blockEntityType: BlockEntityType<*>, blo
} }
companion object { companion object {
private val LOGGER = LogManager.getLogger()
private fun determineDefaultMode(input: IItemHandler?, output: IItemHandler?, inputOutput: IItemHandler?, battery: IItemHandler?, side: RelativeSide): ItemHandlerMode { private fun determineDefaultMode(input: IItemHandler?, output: IItemHandler?, inputOutput: IItemHandler?, battery: IItemHandler?, side: RelativeSide): ItemHandlerMode {
if (side == RelativeSide.BACK && battery != null) { if (side == RelativeSide.BACK && battery != null) {
return ItemHandlerMode.BATTERY return ItemHandlerMode.BATTERY

View File

@ -4,20 +4,21 @@ import com.google.common.collect.ImmutableList
import com.mojang.serialization.Codec import com.mojang.serialization.Codec
import com.mojang.serialization.MapCodec import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.component.DataComponents
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.network.chat.Component import net.minecraft.network.chat.ComponentSerialization
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.level.storage.loot.LootContext import net.minecraft.world.level.storage.loot.LootContext
import net.minecraft.world.level.storage.loot.functions.LootItemFunction import net.minecraft.world.level.storage.loot.functions.LootItemFunction
import net.minecraft.world.level.storage.loot.functions.LootItemFunctionType import net.minecraft.world.level.storage.loot.functions.LootItemFunctionType
import net.minecraft.world.level.storage.loot.parameters.LootContextParams import net.minecraft.world.level.storage.loot.parameters.LootContextParams
import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity
import ru.dbotthepony.mc.otm.core.nbt.getJson import ru.dbotthepony.mc.otm.core.fromNbt
import ru.dbotthepony.mc.otm.core.nbt.set import ru.dbotthepony.mc.otm.core.nbt.set
import ru.dbotthepony.mc.otm.core.stream import ru.dbotthepony.mc.otm.core.stream
import ru.dbotthepony.mc.otm.registry.MItemFunctionTypes import ru.dbotthepony.mc.otm.registry.MItemFunctionTypes
import java.util.Optional import java.util.*
import java.util.stream.Stream import java.util.stream.Stream
class CopyTileNbtFunction(filter: Stream<out String> = Stream.empty()) : LootItemFunction, LootItemFunction.Builder { class CopyTileNbtFunction(filter: Stream<out String> = Stream.empty()) : LootItemFunction, LootItemFunction.Builder {
@ -28,43 +29,49 @@ class CopyTileNbtFunction(filter: Stream<out String> = Stream.empty()) : LootIte
filter.forEach(this) filter.forEach(this)
}*/ filter.collect(ImmutableList.toImmutableList()) }*/ filter.collect(ImmutableList.toImmutableList())
override fun apply(t: ItemStack, u: LootContext): ItemStack { override fun apply(itemStack: ItemStack, context: LootContext): ItemStack {
val blockEntity = u.getParamOrNull(LootContextParams.BLOCK_ENTITY) ?: return t val blockEntity = context.getParamOrNull(LootContextParams.BLOCK_ENTITY) ?: return itemStack
val result = t.tagNotNull[BlockItem.BLOCK_ENTITY_TAG] as? CompoundTag val result = itemStack[DataComponents.BLOCK_ENTITY_DATA] ?: CustomData.EMPTY
val data: CompoundTag val data: CompoundTag
if (blockEntity is MatteryBlockEntity) { if (blockEntity is MatteryBlockEntity) {
data = CompoundTag() data = CompoundTag()
blockEntity.saveShared(data) // TODO: 1.21 added components, which are present even on blockentities; these are lost
blockEntity.saveShared(data, context.level.registryAccess())
} else { } else {
data = blockEntity.saveWithoutMetadata() data = blockEntity.saveWithoutMetadata(context.level.registryAccess())
} }
for (k in filter) { for (k in filter) {
data.remove(k) data.remove(k)
} }
if (result == null) { if (result.isEmpty) {
t.tagNotNull[BlockItem.BLOCK_ENTITY_TAG] = data itemStack[DataComponents.BLOCK_ENTITY_DATA] = CustomData.of(data)
} else { } else {
val copy = result.copyTag()
for (k in data.allKeys) { for (k in data.allKeys) {
result[k] = data[k]!! copy[k] = data[k]!!
} }
itemStack[DataComponents.BLOCK_ENTITY_DATA] = CustomData.of(copy)
} }
if ("Name" in data && "display" !in t.tagNotNull) { if ("Name" in data && !itemStack.has(DataComponents.CUSTOM_NAME)) {
t.tagNotNull["display"] = CompoundTag().also { val deserialize = ComponentSerialization.CODEC.fromNbt(data["Name"]!!)
it["Name"] = Component.Serializer.toJson(Component.Serializer.fromJson(data.getJson("Name")!!)!!)
if (deserialize != null) {
itemStack[DataComponents.CUSTOM_NAME] = deserialize
} }
data.remove("Name") data.remove("Name")
} }
return t return itemStack
} }
override fun getType(): LootItemFunctionType { override fun getType(): LootItemFunctionType<CopyTileNbtFunction> {
return MItemFunctionTypes.COPY_TILE_NBT return MItemFunctionTypes.COPY_TILE_NBT
} }