Extracting 'lost' items from SlottedContainer

This commit is contained in:
DBotThePony 2025-02-27 21:17:13 +07:00
parent 8a4abb90bd
commit a0b04fc1f4
Signed by: DBot
GPG Key ID: DCC23B5715498507

View File

@ -8,11 +8,15 @@ import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.ListTag
import net.minecraft.nbt.NbtOps
import net.minecraft.nbt.Tag
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack
import net.neoforged.neoforge.common.util.INBTSerializable
import org.apache.logging.log4j.LogManager
import ru.dbotthepony.mc.otm.core.isNotEmpty
import ru.dbotthepony.mc.otm.core.math.set
import ru.dbotthepony.mc.otm.core.nbt.set
import ru.dbotthepony.mc.otm.data.codec.minRange
import java.util.function.Predicate
@ -111,6 +115,36 @@ class SlottedContainer(
}
private val lostItems = ArrayList<CompoundTag>()
private var provider: HolderLookup.Provider? = null
fun takeLostItems(): List<ItemStack> {
if (lostItems.isEmpty())
return listOf()
val provider = provider?.createSerializationContext(NbtOps.INSTANCE) ?: return listOf()
val result = ArrayList<ItemStack>()
for (entry in lostItems) {
if ("item" in entry) {
ItemStack.OPTIONAL_CODEC.decode(provider, entry["item"])
.ifError { LOGGER.warn("Unable to deserialize 'lost' item: ${it.message()}") }
.ifSuccess { if (it.first.isNotEmpty) result.add(it.first) }
}
}
lostItems.clear()
return result
}
fun takeLostItems(player: ServerPlayer) {
for (stack in takeLostItems()) {
player.inventory.add(stack)
if (stack.isNotEmpty) {
player.drop(stack, false, false)
}
}
}
override fun serializeNBT(provider: HolderLookup.Provider): ListTag {
return ListTag().also {
@ -137,6 +171,16 @@ class SlottedContainer(
for ((item, slot) in items) {
if (slot in 0 until containerSize) {
slots[slot].item = item
} else if (item.isNotEmpty) {
ItemStack.CODEC.encodeStart(provider.createSerializationContext(NbtOps.INSTANCE), item)
.ifError { LOGGER.warn("Unable to serialize 'lost' item: ${it.message()}") }
.ifSuccess { s ->
this.provider = provider
lostItems.add(CompoundTag().also {
it["item"] = s
})
}
}
}
@ -162,6 +206,7 @@ class SlottedContainer(
slots[i].deserializeNBT(provider, element)
} else {
lostItems.add(element)
this.provider = provider
}
}
} else {