package net.minecraft.core; import com.mojang.serialization.DynamicOps; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; import java.util.stream.Collectors; import java.util.stream.Stream; import net.minecraft.nbt.Tag; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; import net.minecraft.resources.RegistryDataLoader; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.RegistryLayer; import net.minecraft.server.packs.repository.KnownPack; public class RegistrySynchronization { private static final Set>> NETWORKABLE_REGISTRIES = RegistryDataLoader.SYNCHRONIZED_REGISTRIES .stream() .map(RegistryDataLoader.RegistryData::key) .collect(Collectors.toUnmodifiableSet()); public static void packRegistries( DynamicOps p_330752_, RegistryAccess p_332359_, Set p_331327_, BiConsumer>, List> p_335166_ ) { RegistryDataLoader.SYNCHRONIZED_REGISTRIES.forEach(p_325710_ -> packRegistry(p_330752_, (RegistryDataLoader.RegistryData)p_325710_, p_332359_, p_331327_, p_335166_)); } private static void packRegistry( DynamicOps p_328835_, RegistryDataLoader.RegistryData p_329218_, RegistryAccess p_335981_, Set p_330196_, BiConsumer>, List> p_330046_ ) { p_335981_.lookup(p_329218_.key()) .ifPresent( p_358104_ -> { List list = new ArrayList<>(p_358104_.size()); p_358104_.listElements() .forEach( p_325717_ -> { boolean flag = p_358104_.registrationInfo(p_325717_.key()) .flatMap(RegistrationInfo::knownPackInfo) .filter(p_330196_::contains) .isPresent(); Optional optional; if (flag) { optional = Optional.empty(); } else { Tag tag = p_329218_.elementCodec() .encodeStart(p_328835_, p_325717_.value()) .getOrThrow( p_325700_ -> new IllegalArgumentException("Failed to serialize " + p_325717_.key() + ": " + p_325700_) ); optional = Optional.of(tag); } list.add(new RegistrySynchronization.PackedRegistryEntry(p_325717_.key().location(), optional)); } ); p_330046_.accept(p_358104_.key(), list); } ); } private static Stream> ownedNetworkableRegistries(RegistryAccess p_251842_) { return p_251842_.registries().filter(p_358099_ -> isNetworkable(p_358099_.key())); } public static Stream> networkedRegistries(LayeredRegistryAccess p_259290_) { return ownedNetworkableRegistries(p_259290_.getAccessFrom(RegistryLayer.WORLDGEN)); } public static Stream> networkSafeRegistries(LayeredRegistryAccess p_249066_) { Stream> stream = p_249066_.getLayer(RegistryLayer.STATIC).registries(); Stream> stream1 = networkedRegistries(p_249066_); return Stream.concat(stream1, stream); } public static boolean isNetworkable(ResourceKey> p_362141_) { return NETWORKABLE_REGISTRIES.contains(p_362141_); } public record PackedRegistryEntry(ResourceLocation id, Optional data) { public static final StreamCodec STREAM_CODEC = StreamCodec.composite( ResourceLocation.STREAM_CODEC, RegistrySynchronization.PackedRegistryEntry::id, ByteBufCodecs.TAG.apply(ByteBufCodecs::optional), RegistrySynchronization.PackedRegistryEntry::data, RegistrySynchronization.PackedRegistryEntry::new ); } }