package net.minecraft.core; import com.mojang.serialization.Codec; import com.mojang.serialization.DynamicOps; import com.mojang.serialization.JavaOps; import java.util.HashMap; import java.util.Map; import net.minecraft.resources.ResourceKey; import org.jetbrains.annotations.Nullable; public class Cloner { private final Codec directCodec; Cloner(Codec directCodec) { this.directCodec = directCodec; } public T clone(T object, HolderLookup.Provider lookupProvider1, HolderLookup.Provider lookupProvider2) { DynamicOps dynamicOps = lookupProvider1.createSerializationContext(JavaOps.INSTANCE); DynamicOps dynamicOps2 = lookupProvider2.createSerializationContext(JavaOps.INSTANCE); Object object2 = this.directCodec.encodeStart(dynamicOps, object).getOrThrow(string -> new IllegalStateException("Failed to encode: " + string)); return this.directCodec.parse(dynamicOps2, object2).getOrThrow(string -> new IllegalStateException("Failed to decode: " + string)); } public static class Factory { private final Map>, Cloner> codecs = new HashMap(); public Cloner.Factory addCodec(ResourceKey> registryKey, Codec codec) { this.codecs.put(registryKey, new Cloner<>(codec)); return this; } @Nullable public Cloner cloner(ResourceKey> registryKey) { return (Cloner)this.codecs.get(registryKey); } } }