From 7f927d5f059195b9487d78464e125656a19006eb Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 16 Aug 2024 21:53:10 +0700 Subject: [PATCH] Update plate press recipe --- .../ru/dbotthepony/mc/otm/network/Ext.kt | 6 +++ .../mc/otm/network/StreamCodecs.kt | 20 +++++---- .../mc/otm/recipe/PlatePressRecipe.kt | 45 +++++++++++++------ 3 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/Ext.kt index 4a2200964..2aaacf5d5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/Ext.kt @@ -1,11 +1,13 @@ package ru.dbotthepony.mc.otm.network +import com.mojang.serialization.Codec import io.netty.buffer.ByteBuf import io.netty.buffer.ByteBufAllocator import it.unimi.dsi.fastutil.bytes.ByteArrayList import net.minecraft.core.RegistryAccess import net.minecraft.network.FriendlyByteBuf import net.minecraft.network.RegistryFriendlyByteBuf +import net.minecraft.network.codec.ByteBufCodecs import net.minecraft.network.codec.StreamCodec import net.minecraft.network.protocol.common.custom.CustomPacketPayload import net.neoforged.neoforge.network.connection.ConnectionType @@ -84,3 +86,7 @@ fun StreamCodec.decode(registry: RegistryAcce decode(it) } } + +fun Codec.streamCodec(): MatteryStreamCodec { + return ByteBufCodecs.fromCodecWithRegistries(this).wrap() +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/StreamCodecs.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/StreamCodecs.kt index 010d6dcc1..d22e94611 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/StreamCodecs.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/StreamCodecs.kt @@ -4,27 +4,29 @@ import io.netty.buffer.ByteBuf import net.minecraft.core.UUIDUtil import net.minecraft.network.FriendlyByteBuf import net.minecraft.network.RegistryFriendlyByteBuf +import net.minecraft.network.codec.ByteBufCodecs import net.minecraft.network.codec.StreamCodec +import net.minecraft.util.valueproviders.FloatProvider import ru.dbotthepony.kommons.math.RGBAColor import ru.dbotthepony.mc.otm.core.math.readDecimal import ru.dbotthepony.mc.otm.core.math.writeDecimal import ru.dbotthepony.mc.otm.core.readItemType import ru.dbotthepony.mc.otm.core.writeItemType +import kotlin.reflect.KMutableProperty1 -// because mojang didn't bother object StreamCodecs { val NOTHING: MatteryStreamCodec = StreamCodec.of({ _, _ -> }, { null }).wrap() val BYTE: MatteryStreamCodec = StreamCodec.of({ s, v -> s.writeByte(v.toInt()) }, ByteBuf::readByte).wrap() - val SHORT = StreamCodec.of({ s, v -> s.writeShort(v.toInt()) }, ByteBuf::readShort).wrap() - val INT = StreamCodec.of(ByteBuf::writeInt, ByteBuf::readInt).wrap() - val VAR_INT = StreamCodec.of(FriendlyByteBuf::writeVarInt, FriendlyByteBuf::readVarInt).wrap() + val SHORT = ByteBufCodecs.SHORT.wrap() + val INT = ByteBufCodecs.INT.wrap() + val VAR_INT = ByteBufCodecs.VAR_INT.wrap() val LONG = StreamCodec.of(ByteBuf::writeLong, ByteBuf::readLong).wrap() - val VAR_LONG = StreamCodec.of(FriendlyByteBuf::writeVarLong, FriendlyByteBuf::readVarLong).wrap() - val DOUBLE = StreamCodec.of(ByteBuf::writeDouble, ByteBuf::readDouble).wrap() - val FLOAT = StreamCodec.of(ByteBuf::writeFloat, ByteBuf::readFloat).wrap() - val BOOLEAN = StreamCodec.of(ByteBuf::writeBoolean, ByteBuf::readBoolean).wrap() - val STRING = StreamCodec.of(FriendlyByteBuf::writeUtf, FriendlyByteBuf::readUtf).wrap() + val VAR_LONG = ByteBufCodecs.VAR_LONG.wrap() + val DOUBLE = ByteBufCodecs.DOUBLE.wrap() + val FLOAT = ByteBufCodecs.FLOAT.wrap() + val BOOLEAN = ByteBufCodecs.BOOL.wrap() + val STRING = ByteBufCodecs.STRING_UTF8.wrap() val UUID = UUIDUtil.STREAM_CODEC.wrap() val RGBA: MatteryStreamCodec = StreamCodec.of( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt index 84e49d68b..28c57ecc2 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt @@ -1,9 +1,13 @@ package ru.dbotthepony.mc.otm.recipe import com.mojang.serialization.Codec +import com.mojang.serialization.MapCodec import com.mojang.serialization.codecs.RecordCodecBuilder import net.minecraft.core.HolderLookup import net.minecraft.core.NonNullList +import net.minecraft.network.RegistryFriendlyByteBuf +import net.minecraft.network.codec.ByteBufCodecs +import net.minecraft.network.codec.StreamCodec import net.minecraft.resources.ResourceLocation import net.minecraft.util.valueproviders.ConstantFloat import net.minecraft.util.valueproviders.FloatProvider @@ -21,6 +25,8 @@ import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.registry.MRecipes import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.data.minRange +import ru.dbotthepony.mc.otm.network.StreamCodecs +import ru.dbotthepony.mc.otm.network.streamCodec import ru.dbotthepony.mc.otm.registry.MItems class PlatePressRecipe( @@ -70,7 +76,7 @@ class PlatePressRecipe( override fun getResultItem(registry: HolderLookup.Provider): ItemStack = outputStack override fun getSerializer(): RecipeSerializer<*> { - return SERIALIZER + return Companion } override fun getType(): RecipeType = MRecipes.PLATE_PRESS @@ -79,19 +85,32 @@ class PlatePressRecipe( return ItemStack(MItems.TWIN_PLATE_PRESS[null]!!) } - fun toFinished(id: ResourceLocation) = SERIALIZER.toFinished(this, id) + companion object : RecipeSerializer { + private val codec = RecordCodecBuilder.mapCodec { + it.group( + Ingredient.CODEC_NONEMPTY.fieldOf("input").forGetter(PlatePressRecipe::input), + Ingredient.CODEC_NONEMPTY.fieldOf("output").forGetter(PlatePressRecipe::output), + Codec.INT.minRange(1).optionalFieldOf("count", 1).forGetter(PlatePressRecipe::count), + Codec.INT.minRange(0).optionalFieldOf("workTime", 200).forGetter(PlatePressRecipe::workTime), + FloatProvider.CODEC.optionalFieldOf("experience", ConstantFloat.ZERO).forGetter(PlatePressRecipe::experience) + ).apply(it, ::PlatePressRecipe) + } - companion object { - val SERIALIZER = Codec2RecipeSerializer { context -> - RecordCodecBuilder.create { - it.group( - context.ingredients.fieldOf("input").forGetter(PlatePressRecipe::input), - context.ingredients.fieldOf("output").forGetter(PlatePressRecipe::output), - Codec.INT.minRange(1).optionalFieldOf("count", 1).forGetter(PlatePressRecipe::count), - Codec.INT.minRange(0).optionalFieldOf("workTime", 200).forGetter(PlatePressRecipe::workTime), - FloatProvider.CODEC.optionalFieldOf("experience", ConstantFloat.ZERO).forGetter(PlatePressRecipe::experience) - ).apply(it, ::PlatePressRecipe) - } + private val streamCodec = StreamCodec.composite( + Ingredient.CONTENTS_STREAM_CODEC, PlatePressRecipe::input, + Ingredient.CONTENTS_STREAM_CODEC, PlatePressRecipe::output, + ByteBufCodecs.INT, PlatePressRecipe::count, + ByteBufCodecs.INT, PlatePressRecipe::workTime, + FloatProvider.CODEC.streamCodec(), PlatePressRecipe::experience, + ::PlatePressRecipe + ) + + override fun codec(): MapCodec { + return codec + } + + override fun streamCodec(): StreamCodec { + return streamCodec } } }