ReloadableServerRegistries.java

net.minecraft.server.ReloadableServerRegistries

信息

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

    TODO

字段/常量

  • LOGGER

    • 类型: Logger
    • 修饰符: private static final
    • 源码定位: L37
    • 说明:

      TODO

  • DEFAULT_REGISTRATION_INFO

    • 类型: RegistrationInfo
    • 修饰符: private static final
    • 源码定位: L38
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.server.ReloadableServerRegistries.Holder

    • 类型: class
    • 修饰符: public static
    • 源码定位: L101
    • 说明:

      TODO

  • net.minecraft.server.ReloadableServerRegistries.LoadResult

    • 类型: record
    • 修饰符: public
    • 源码定位: L117
    • 说明:

      TODO

构造器

方法

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

public static CompletableFuture<ReloadableServerRegistries.LoadResult> reload(LayeredRegistryAccess<RegistryLayer> context, List<Registry.PendingTags<?>> updatedContextTags, ResourceManager manager, Executor executor) @ L40

  • 方法名:reload
  • 源码定位:L40
  • 返回类型:CompletableFuture<ReloadableServerRegistries.LoadResult>
  • 修饰符:public static

参数:

  • context: LayeredRegistryAccess
  • updatedContextTags: List<Registry.PendingTags<?>>
  • manager: ResourceManager
  • executor: Executor

说明:

TODO

private static <T extends Validatable> CompletableFuture<WritableRegistry<?>> scheduleRegistryLoad(LootDataType<T> type, RegistryOps<JsonElement> ops, ResourceManager manager, Executor taskExecutor) @ L57

  • 方法名:scheduleRegistryLoad
  • 源码定位:L57
  • 返回类型: CompletableFuture<WritableRegistry<?>>
  • 修饰符:private static

参数:

  • type: LootDataType
  • ops: RegistryOps
  • manager: ResourceManager
  • taskExecutor: Executor

说明:

TODO

private static ReloadableServerRegistries.LoadResult createAndValidateFullContext(LayeredRegistryAccess<RegistryLayer> contextLayers, HolderLookup.Provider contextLookupWithUpdatedTags, List<WritableRegistry<?>> newRegistries) @ L70

  • 方法名:createAndValidateFullContext
  • 源码定位:L70
  • 返回类型:ReloadableServerRegistries.LoadResult
  • 修饰符:private static

参数:

  • contextLayers: LayeredRegistryAccess
  • contextLookupWithUpdatedTags: HolderLookup.Provider
  • newRegistries: List<WritableRegistry<?>>

说明:

TODO

private static HolderLookup.Provider concatenateLookups(HolderLookup.Provider first, HolderLookup.Provider second) @ L79

  • 方法名:concatenateLookups
  • 源码定位:L79
  • 返回类型:HolderLookup.Provider
  • 修饰符:private static

参数:

  • first: HolderLookup.Provider
  • second: HolderLookup.Provider

说明:

TODO

private static void validateLootRegistries(HolderLookup.Provider fullContextWithNewTags) @ L83

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

参数:

  • fullContextWithNewTags: HolderLookup.Provider

说明:

TODO

private static LayeredRegistryAccess<RegistryLayer> createUpdatedRegistries(LayeredRegistryAccess<RegistryLayer> context, List<WritableRegistry<?>> registries) @ L90

  • 方法名:createUpdatedRegistries
  • 源码定位:L90
  • 返回类型:LayeredRegistryAccess
  • 修饰符:private static

参数:

  • context: LayeredRegistryAccess
  • registries: List<WritableRegistry<?>>

说明:

TODO

private static <T extends Validatable> void validateRegistry(ValidationContextSource contextSource, LootDataType<T> type, HolderLookup.Provider registries) @ L96

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

参数:

  • contextSource: ValidationContextSource
  • type: LootDataType
  • registries: HolderLookup.Provider

说明:

TODO

代码

public class ReloadableServerRegistries {
    private static final Logger LOGGER = LogUtils.getLogger();
    private static final RegistrationInfo DEFAULT_REGISTRATION_INFO = new RegistrationInfo(Optional.empty(), Lifecycle.experimental());
 
    public static CompletableFuture<ReloadableServerRegistries.LoadResult> reload(
        LayeredRegistryAccess<RegistryLayer> context, List<Registry.PendingTags<?>> updatedContextTags, ResourceManager manager, Executor executor
    ) {
        List<HolderLookup.RegistryLookup<?>> contextRegistriesWithTags = TagLoader.buildUpdatedLookups(
            context.getAccessForLoading(RegistryLayer.RELOADABLE), updatedContextTags
        );
        HolderLookup.Provider loadingContextWithTags = HolderLookup.Provider.create(contextRegistriesWithTags.stream());
        RegistryOps<JsonElement> ops = loadingContextWithTags.createSerializationContext(JsonOps.INSTANCE);
        List<CompletableFuture<WritableRegistry<?>>> registryLoads = LootDataType.values()
            .map(type -> scheduleRegistryLoad((LootDataType<?>)type, ops, manager, executor))
            .toList();
        CompletableFuture<List<WritableRegistry<?>>> sequence = Util.sequence(registryLoads);
        return sequence.thenApplyAsync(
            newlyLoadedRegistries -> createAndValidateFullContext(context, loadingContextWithTags, (List<WritableRegistry<?>>)newlyLoadedRegistries), executor
        );
    }
 
    private static <T extends Validatable> CompletableFuture<WritableRegistry<?>> scheduleRegistryLoad(
        LootDataType<T> type, RegistryOps<JsonElement> ops, ResourceManager manager, Executor taskExecutor
    ) {
        return CompletableFuture.supplyAsync(() -> {
            WritableRegistry<T> registry = new MappedRegistry<>(type.registryKey(), Lifecycle.experimental());
            Map<Identifier, T> elements = new HashMap<>();
            SimpleJsonResourceReloadListener.scanDirectory(manager, type.registryKey(), ops, type.codec(), elements);
            elements.forEach((id, element) -> registry.register(ResourceKey.create(type.registryKey(), id), (T)element, DEFAULT_REGISTRATION_INFO));
            TagLoader.loadTagsForRegistry(manager, registry);
            return registry;
        }, taskExecutor);
    }
 
    private static ReloadableServerRegistries.LoadResult createAndValidateFullContext(
        LayeredRegistryAccess<RegistryLayer> contextLayers, HolderLookup.Provider contextLookupWithUpdatedTags, List<WritableRegistry<?>> newRegistries
    ) {
        LayeredRegistryAccess<RegistryLayer> fullLayers = createUpdatedRegistries(contextLayers, newRegistries);
        HolderLookup.Provider fullLookupWithUpdatedTags = concatenateLookups(contextLookupWithUpdatedTags, fullLayers.getLayer(RegistryLayer.RELOADABLE));
        validateLootRegistries(fullLookupWithUpdatedTags);
        return new ReloadableServerRegistries.LoadResult(fullLayers, fullLookupWithUpdatedTags);
    }
 
    private static HolderLookup.Provider concatenateLookups(HolderLookup.Provider first, HolderLookup.Provider second) {
        return HolderLookup.Provider.create(Stream.concat(first.listRegistries(), second.listRegistries()));
    }
 
    private static void validateLootRegistries(HolderLookup.Provider fullContextWithNewTags) {
        ProblemReporter.Collector problems = new ProblemReporter.Collector();
        ValidationContextSource contextSource = new ValidationContextSource(problems, fullContextWithNewTags);
        LootDataType.values().forEach(lootDataType -> validateRegistry(contextSource, (LootDataType<?>)lootDataType, fullContextWithNewTags));
        problems.forEach((id, problem) -> LOGGER.warn("Found loot table element validation problem in {}: {}", id, problem.description()));
    }
 
    private static LayeredRegistryAccess<RegistryLayer> createUpdatedRegistries(
        LayeredRegistryAccess<RegistryLayer> context, List<WritableRegistry<?>> registries
    ) {
        return context.replaceFrom(RegistryLayer.RELOADABLE, new RegistryAccess.ImmutableRegistryAccess(registries).freeze());
    }
 
    private static <T extends Validatable> void validateRegistry(ValidationContextSource contextSource, LootDataType<T> type, HolderLookup.Provider registries) {
        HolderLookup<T> registry = registries.lookupOrThrow(type.registryKey());
        type.runValidation(contextSource, registry);
    }
 
    public static class Holder {
        private final HolderLookup.Provider registries;
 
        public Holder(HolderLookup.Provider registries) {
            this.registries = registries;
        }
 
        public HolderLookup.Provider lookup() {
            return this.registries;
        }
 
        public LootTable getLootTable(ResourceKey<LootTable> id) {
            return this.registries.lookup(Registries.LOOT_TABLE).flatMap(r -> r.get(id)).map(net.minecraft.core.Holder::value).orElse(LootTable.EMPTY);
        }
    }
 
    public record LoadResult(LayeredRegistryAccess<RegistryLayer> layers, HolderLookup.Provider lookupWithUpdatedTags) {
    }
}

引用的其他类

  • HolderLookup

    • 引用位置: 参数/方法调用/返回值
    • 关联成员: HolderLookup.Provider.create()
  • LayeredRegistryAccess

    • 引用位置: 参数/返回值
  • RegistrationInfo

    • 引用位置: 字段/构造调用
    • 关联成员: RegistrationInfo()
  • Registry

    • 引用位置: 参数
  • RegistryAccess

    • 引用位置: 方法调用/构造调用
    • 关联成员: ImmutableRegistryAccess(), RegistryAccess.ImmutableRegistryAccess()
  • WritableRegistry

    • 引用位置: 参数/返回值
  • RegistryOps

    • 引用位置: 参数
  • ResourceKey

    • 引用位置: 方法调用
    • 关联成员: ResourceKey.create()
  • RegistryLayer

    • 引用位置: 参数/返回值
  • ResourceManager

    • 引用位置: 参数
  • SimpleJsonResourceReloadListener

    • 引用位置: 方法调用
    • 关联成员: SimpleJsonResourceReloadListener.scanDirectory()
  • TagLoader

    • 引用位置: 方法调用
    • 关联成员: TagLoader.buildUpdatedLookups(), TagLoader.loadTagsForRegistry()
  • ProblemReporter

    • 引用位置: 方法调用/构造调用
    • 关联成员: Collector(), ProblemReporter.Collector()
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.sequence()
  • LootDataType

    • 引用位置: 参数/方法调用
    • 关联成员: LootDataType.values()
  • Validatable

    • 引用位置: 返回值
  • ValidationContextSource

    • 引用位置: 参数/构造调用
    • 关联成员: ValidationContextSource()