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.Provider.create()
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置:
-
- 引用位置:
字段/构造调用 - 关联成员:
RegistrationInfo()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用/构造调用 - 关联成员:
ImmutableRegistryAccess(), RegistryAccess.ImmutableRegistryAccess()
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ResourceKey.create()
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
SimpleJsonResourceReloadListener
- 引用位置:
方法调用 - 关联成员:
SimpleJsonResourceReloadListener.scanDirectory()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
TagLoader.buildUpdatedLookups(), TagLoader.loadTagsForRegistry()
- 引用位置:
-
- 引用位置:
方法调用/构造调用 - 关联成员:
Collector(), ProblemReporter.Collector()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
Util.sequence()
- 引用位置:
-
- 引用位置:
参数/方法调用 - 关联成员:
LootDataType.values()
- 引用位置:
-
- 引用位置:
返回值
- 引用位置:
-
- 引用位置:
参数/构造调用 - 关联成员:
ValidationContextSource()
- 引用位置: