diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/EnergyContainerRecipe.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/EnergyContainerRecipe.kt index 9f3667807..caf8f34d8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/EnergyContainerRecipe.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/EnergyContainerRecipe.kt @@ -1,73 +1,32 @@ package ru.dbotthepony.mc.otm.recipe import com.mojang.serialization.Codec -import net.minecraft.core.NonNullList +import com.mojang.serialization.MapCodec +import net.minecraft.core.HolderLookup import net.minecraft.core.RegistryAccess +import net.minecraft.core.component.DataComponents import net.minecraft.network.FriendlyByteBuf -import net.minecraft.world.inventory.CraftingContainer +import net.minecraft.network.RegistryFriendlyByteBuf +import net.minecraft.network.codec.StreamCodec import net.minecraft.world.item.ItemStack import net.minecraft.world.item.crafting.CraftingBookCategory -import net.minecraft.world.item.crafting.CraftingRecipe -import net.minecraft.world.item.crafting.Ingredient +import net.minecraft.world.item.crafting.CraftingInput import net.minecraft.world.item.crafting.RecipeSerializer -import net.minecraft.world.item.crafting.RecipeType import net.minecraft.world.item.crafting.ShapedRecipe +import net.minecraft.world.item.crafting.ShapedRecipePattern +import net.minecraft.world.item.enchantment.ItemEnchantments import net.minecraft.world.level.Level -import net.minecraftforge.common.crafting.IShapedRecipe import ru.dbotthepony.mc.otm.capability.matteryEnergy import ru.dbotthepony.mc.otm.container.util.iterator -import ru.dbotthepony.mc.otm.container.util.stream import ru.dbotthepony.mc.otm.core.filterNotNull -class EnergyContainerRecipe(val parent: ShapedRecipe) : CraftingRecipe, IShapedRecipe by parent { - override fun canCraftInDimensions(p_43999_: Int, p_44000_: Int): Boolean { - return parent.canCraftInDimensions(p_43999_, p_44000_) - } +class EnergyContainerRecipe(group: String, category: CraftingBookCategory, pattern: ShapedRecipePattern, result: ItemStack, showNotification: Boolean = true) : ShapedRecipe(group, category, pattern, result, showNotification) { + constructor(parent: ShapedRecipe) : this(parent.group, parent.category(), parent.pattern, parent.result, parent.showNotification()) - override fun getResultItem(p_267052_: RegistryAccess): ItemStack { - return parent.getResultItem(p_267052_) - } + override fun assemble(container: CraftingInput, registryAccess: HolderLookup.Provider): ItemStack { + val itemStack = super.assemble(container, registryAccess) - override fun category(): CraftingBookCategory { - return parent.category() - } - - override fun getRemainingItems(p_44004_: CraftingContainer): NonNullList { - return parent.getRemainingItems(p_44004_) - } - - override fun getIngredients(): NonNullList { - return parent.ingredients - } - - override fun isSpecial(): Boolean { - return parent.isSpecial - } - - override fun showNotification(): Boolean { - return parent.showNotification() - } - - override fun getGroup(): String { - return parent.group - } - - override fun getToastSymbol(): ItemStack { - return parent.toastSymbol - } - - override fun isIncomplete(): Boolean { - return parent.isIncomplete - } - - override fun getType(): RecipeType<*> { - return parent.type - } - - override fun assemble(container: CraftingContainer, registryAccess: RegistryAccess): ItemStack { - val itemStack = parent.assemble(container, registryAccess) - - val battery = container.stream() + val battery = container.items().stream() .filter { !it.isEmpty } .map { it.matteryEnergy } .filterNotNull() @@ -78,10 +37,16 @@ class EnergyContainerRecipe(val parent: ShapedRecipe) : CraftingRecipe, IShapedR } if (itemStack.isEnchantable) { - for (it in container.iterator()) { - if (it.isEnchanted) { - for ((key, value) in it.allEnchantments) { - itemStack.enchant(key, value) + for (it in container.items()) { + val enchantments = it[DataComponents.ENCHANTMENTS] + + if (enchantments != null) { + itemStack[DataComponents.ENCHANTMENTS] = ItemEnchantments.Mutable(itemStack.getOrDefault(DataComponents.ENCHANTMENTS, ItemEnchantments.EMPTY)).let { + for ((key, level) in enchantments.entrySet()) { + it.upgrade(key, level) + } + + it.toImmutable() } } } @@ -90,8 +55,8 @@ class EnergyContainerRecipe(val parent: ShapedRecipe) : CraftingRecipe, IShapedR return itemStack } - override fun matches(container: CraftingContainer, level: Level): Boolean { - return parent.matches(container, level) && !container.stream().anyMatch { it.isDamaged } + override fun matches(container: CraftingInput, level: Level): Boolean { + return super.matches(container, level) && container.items().none { it.isDamaged } } override fun getSerializer(): RecipeSerializer { @@ -100,19 +65,19 @@ class EnergyContainerRecipe(val parent: ShapedRecipe) : CraftingRecipe, IShapedR companion object : RecipeSerializer { private val codec by lazy { - RecipeSerializer.SHAPED_RECIPE.codec().xmap(::EnergyContainerRecipe, EnergyContainerRecipe::parent) + RecipeSerializer.SHAPED_RECIPE.codec().xmap(::EnergyContainerRecipe, { it }) } - override fun codec(): Codec { + private val streamCodec by lazy { + RecipeSerializer.SHAPED_RECIPE.streamCodec().map(::EnergyContainerRecipe, { it }) + } + + override fun codec(): MapCodec { return codec } - override fun fromNetwork(data: FriendlyByteBuf): EnergyContainerRecipe? { - return ShapedRecipe.Serializer.SHAPED_RECIPE.fromNetwork(data)?.let(::EnergyContainerRecipe) - } - - override fun toNetwork(buff: FriendlyByteBuf, value: EnergyContainerRecipe) { - ShapedRecipe.Serializer.SHAPED_RECIPE.toNetwork(buff, value.parent) + override fun streamCodec(): StreamCodec { + return streamCodec } } } diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 4da41e68e..1c99e33c3 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -12,6 +12,8 @@ public net.minecraft.client.gui.screens.inventory.AbstractContainerScreen f_1696 public net.minecraft.client.gui.screens.inventory.AbstractContainerScreen menu public net.minecraft.client.gui.screens.inventory.AbstractContainerScreen playerInventoryTitle +public net.minecraft.world.item.crafting.ShapedRecipe result + protected net.minecraft.client.gui.screens.inventory.AbstractContainerScreen clickedSlot protected net.minecraft.client.gui.screens.inventory.AbstractContainerScreen snapbackEnd protected net.minecraft.client.gui.screens.inventory.AbstractContainerScreen quickdropSlot