RegistrySynchronization.java

net.minecraft.core.RegistrySynchronization

信息

  • 全限定名:net.minecraft.core.RegistrySynchronization
  • 类型:public class
  • 包:net.minecraft.core
  • 源码路径:src/main/java/net/minecraft/core/RegistrySynchronization.java
  • 起始行号:L21
  • 职责:

    TODO

字段/常量

  • NETWORKABLE_REGISTRIES
    • 类型: Set<ResourceKey<?extends Registry<?>>>
    • 修饰符: private static final
    • 源码定位: L22
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.core.RegistrySynchronization.PackedRegistryEntry
    • 类型: record
    • 修饰符: public
    • 源码定位: L91
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

public static void packRegistries(DynamicOps<Tag> ops, RegistryAccess registries, Set<KnownPack> clientKnownPacks, BiConsumer<ResourceKey<?extends Registry<?>>,List<RegistrySynchronization.PackedRegistryEntry>> output) @ L27

  • 方法名:packRegistries
  • 源码定位:L27
  • 返回类型:void
  • 修饰符:public static

参数:

  • ops: DynamicOps
  • registries: RegistryAccess
  • clientKnownPacks: Set
  • output: BiConsumer<ResourceKey>,List<RegistrySynchronization.PackedRegistryEntry>>

说明:

TODO

private static <T> void packRegistry(DynamicOps<Tag> ops, RegistryDataLoader.RegistryData<T> registryData, RegistryAccess registries, Set<KnownPack> clientKnownPacks, BiConsumer<ResourceKey<?extends Registry<?>>,List<RegistrySynchronization.PackedRegistryEntry>> output) @ L37

  • 方法名:packRegistry
  • 源码定位:L37
  • 返回类型: void
  • 修饰符:private static

参数:

  • ops: DynamicOps
  • registryData: RegistryDataLoader.RegistryData
  • registries: RegistryAccess
  • clientKnownPacks: Set
  • output: BiConsumer<ResourceKey>,List<RegistrySynchronization.PackedRegistryEntry>>

说明:

TODO

private static Stream<RegistryAccess.RegistryEntry<?>> ownedNetworkableRegistries(RegistryAccess access) @ L73

  • 方法名:ownedNetworkableRegistries
  • 源码定位:L73
  • 返回类型:Stream<RegistryAccess.RegistryEntry<?>>
  • 修饰符:private static

参数:

  • access: RegistryAccess

说明:

TODO

public static Stream<RegistryAccess.RegistryEntry<?>> networkedRegistries(LayeredRegistryAccess<RegistryLayer> registries) @ L77

  • 方法名:networkedRegistries
  • 源码定位:L77
  • 返回类型:Stream<RegistryAccess.RegistryEntry<?>>
  • 修饰符:public static

参数:

  • registries: LayeredRegistryAccess

说明:

TODO

public static Stream<RegistryAccess.RegistryEntry<?>> networkSafeRegistries(LayeredRegistryAccess<RegistryLayer> registries) @ L81

  • 方法名:networkSafeRegistries
  • 源码定位:L81
  • 返回类型:Stream<RegistryAccess.RegistryEntry<?>>
  • 修饰符:public static

参数:

  • registries: LayeredRegistryAccess

说明:

TODO

public static boolean isNetworkable(ResourceKey<?extends Registry<?>> key) @ L87

  • 方法名:isNetworkable
  • 源码定位:L87
  • 返回类型:boolean
  • 修饰符:public static

参数:

  • key: ResourceKey>

说明:

TODO

代码

public class RegistrySynchronization {
    private static final Set<ResourceKey<? extends Registry<?>>> NETWORKABLE_REGISTRIES = RegistryDataLoader.SYNCHRONIZED_REGISTRIES
        .stream()
        .map(RegistryDataLoader.RegistryData::key)
        .collect(Collectors.toUnmodifiableSet());
 
    public static void packRegistries(
        DynamicOps<Tag> ops,
        RegistryAccess registries,
        Set<KnownPack> clientKnownPacks,
        BiConsumer<ResourceKey<? extends Registry<?>>, List<RegistrySynchronization.PackedRegistryEntry>> output
    ) {
        RegistryDataLoader.SYNCHRONIZED_REGISTRIES
            .forEach(registryEntry -> packRegistry(ops, (RegistryDataLoader.RegistryData<?>)registryEntry, registries, clientKnownPacks, output));
    }
 
    private static <T> void packRegistry(
        DynamicOps<Tag> ops,
        RegistryDataLoader.RegistryData<T> registryData,
        RegistryAccess registries,
        Set<KnownPack> clientKnownPacks,
        BiConsumer<ResourceKey<? extends Registry<?>>, List<RegistrySynchronization.PackedRegistryEntry>> output
    ) {
        registries.lookup(registryData.key())
            .ifPresent(
                registry -> {
                    List<RegistrySynchronization.PackedRegistryEntry> packedElements = new ArrayList<>(registry.size());
                    registry.listElements()
                        .forEach(
                            element -> {
                                boolean canSkipContents = registry.registrationInfo(element.key())
                                    .flatMap(RegistrationInfo::knownPackInfo)
                                    .filter(clientKnownPacks::contains)
                                    .isPresent();
                                Optional<Tag> contents;
                                if (canSkipContents) {
                                    contents = Optional.empty();
                                } else {
                                    Tag encodedElement = registryData.elementCodec()
                                        .encodeStart(ops, element.value())
                                        .getOrThrow(s -> new IllegalArgumentException("Failed to serialize " + element.key() + ": " + s));
                                    contents = Optional.of(encodedElement);
                                }
 
                                packedElements.add(new RegistrySynchronization.PackedRegistryEntry(element.key().identifier(), contents));
                            }
                        );
                    output.accept(registry.key(), packedElements);
                }
            );
    }
 
    private static Stream<RegistryAccess.RegistryEntry<?>> ownedNetworkableRegistries(RegistryAccess access) {
        return access.registries().filter(e -> isNetworkable(e.key()));
    }
 
    public static Stream<RegistryAccess.RegistryEntry<?>> networkedRegistries(LayeredRegistryAccess<RegistryLayer> registries) {
        return ownedNetworkableRegistries(registries.getAccessFrom(RegistryLayer.WORLDGEN));
    }
 
    public static Stream<RegistryAccess.RegistryEntry<?>> networkSafeRegistries(LayeredRegistryAccess<RegistryLayer> registries) {
        Stream<RegistryAccess.RegistryEntry<?>> staticRegistries = registries.getLayer(RegistryLayer.STATIC).registries();
        Stream<RegistryAccess.RegistryEntry<?>> networkedRegistries = networkedRegistries(registries);
        return Stream.concat(networkedRegistries, staticRegistries);
    }
 
    public static boolean isNetworkable(ResourceKey<? extends Registry<?>> key) {
        return NETWORKABLE_REGISTRIES.contains(key);
    }
 
    public record PackedRegistryEntry(Identifier id, Optional<Tag> data) {
        public static final StreamCodec<ByteBuf, RegistrySynchronization.PackedRegistryEntry> STREAM_CODEC = StreamCodec.composite(
            Identifier.STREAM_CODEC,
            RegistrySynchronization.PackedRegistryEntry::id,
            ByteBufCodecs.TAG.apply(ByteBufCodecs::optional),
            RegistrySynchronization.PackedRegistryEntry::data,
            RegistrySynchronization.PackedRegistryEntry::new
        );
    }
}

引用的其他类