BlockStateModelLoader.java

net.minecraft.client.resources.model.BlockStateModelLoader

信息

  • 全限定名:net.minecraft.client.resources.model.BlockStateModelLoader
  • 类型:public class
  • 包:net.minecraft.client.resources.model
  • 源码路径:src/main/java/net/minecraft/client/resources/model/BlockStateModelLoader.java
  • 起始行号:L32
  • 职责:

    TODO

字段/常量

  • LOGGER

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

      TODO

  • BLOCKSTATE_LISTER

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

      TODO

内部类/嵌套类型

  • net.minecraft.client.resources.model.BlockStateModelLoader.LoadedBlockStateModelDispatcher

    • 类型: record
    • 修饰符: private
    • 源码定位: L113
    • 说明:

      TODO

  • net.minecraft.client.resources.model.BlockStateModelLoader.LoadedModels

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

      TODO

构造器

方法

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

public static CompletableFuture<BlockStateModelLoader.LoadedModels> loadBlockStates(ResourceManager manager, Executor executor) @ L36

  • 方法名:loadBlockStates
  • 源码定位:L36
  • 返回类型:CompletableFuture<BlockStateModelLoader.LoadedModels>
  • 修饰符:public static

参数:

  • manager: ResourceManager
  • executor: Executor

说明:

TODO

private static BlockStateModelLoader.LoadedModels loadBlockStateDefinitionStack(Identifier stateDefinitionId, StateDefinition<Block,BlockState> stateDefinition, List<BlockStateModelLoader.LoadedBlockStateModelDispatcher> definitionStack) @ L98

  • 方法名:loadBlockStateDefinitionStack
  • 源码定位:L98
  • 返回类型:BlockStateModelLoader.LoadedModels
  • 修饰符:private static

参数:

  • stateDefinitionId: Identifier
  • stateDefinition: StateDefinition<Block,BlockState>
  • definitionStack: List<BlockStateModelLoader.LoadedBlockStateModelDispatcher>

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class BlockStateModelLoader {
    private static final Logger LOGGER = LogUtils.getLogger();
    private static final FileToIdConverter BLOCKSTATE_LISTER = FileToIdConverter.json("blockstates");
 
    public static CompletableFuture<BlockStateModelLoader.LoadedModels> loadBlockStates(ResourceManager manager, Executor executor) {
        Function<Identifier, StateDefinition<Block, BlockState>> definitionToBlockState = BlockStateDefinitions.definitionLocationToBlockStateMapper();
        return CompletableFuture.<Map<Identifier, List<Resource>>>supplyAsync(() -> BLOCKSTATE_LISTER.listMatchingResourceStacks(manager), executor)
            .thenCompose(
                resources -> {
                    List<CompletableFuture<BlockStateModelLoader.LoadedModels>> result = new ArrayList<>(resources.size());
 
                    for (Entry<Identifier, List<Resource>> resourceStack : resources.entrySet()) {
                        result.add(
                            CompletableFuture.supplyAsync(
                                () -> {
                                    Identifier stateDefinitionId = BLOCKSTATE_LISTER.fileToId(resourceStack.getKey());
                                    StateDefinition<Block, BlockState> stateDefinition = definitionToBlockState.apply(stateDefinitionId);
                                    if (stateDefinition == null) {
                                        LOGGER.debug("Discovered unknown block state definition {}, ignoring", stateDefinitionId);
                                        return null;
                                    } else {
                                        List<Resource> stack = resourceStack.getValue();
                                        List<BlockStateModelLoader.LoadedBlockStateModelDispatcher> loadedStack = new ArrayList<>(stack.size());
 
                                        for (Resource resource : stack) {
                                            try (Reader reader = resource.openAsReader()) {
                                                JsonElement element = StrictJsonParser.parse(reader);
                                                BlockStateModelDispatcher definition = BlockStateModelDispatcher.CODEC
                                                    .parse(JsonOps.INSTANCE, element)
                                                    .getOrThrow(JsonParseException::new);
                                                loadedStack.add(new BlockStateModelLoader.LoadedBlockStateModelDispatcher(resource.sourcePackId(), definition));
                                            } catch (Exception var14) {
                                                LOGGER.error(
                                                    "Failed to load blockstate definition {} from pack {}", stateDefinitionId, resource.sourcePackId(), var14
                                                );
                                            }
                                        }
 
                                        try {
                                            return loadBlockStateDefinitionStack(stateDefinitionId, stateDefinition, loadedStack);
                                        } catch (Exception var11) {
                                            LOGGER.error("Failed to load blockstate definition {}", stateDefinitionId, var11);
                                            return null;
                                        }
                                    }
                                },
                                executor
                            )
                        );
                    }
 
                    return Util.sequence(result).thenApply(partialMaps -> {
                        Map<BlockState, BlockStateModel.UnbakedRoot> fullMap = new IdentityHashMap<>();
 
                        for (BlockStateModelLoader.LoadedModels partialMap : partialMaps) {
                            if (partialMap != null) {
                                fullMap.putAll(partialMap.models());
                            }
                        }
 
                        return new BlockStateModelLoader.LoadedModels(fullMap);
                    });
                }
            );
    }
 
    private static BlockStateModelLoader.LoadedModels loadBlockStateDefinitionStack(
        Identifier stateDefinitionId,
        StateDefinition<Block, BlockState> stateDefinition,
        List<BlockStateModelLoader.LoadedBlockStateModelDispatcher> definitionStack
    ) {
        Map<BlockState, BlockStateModel.UnbakedRoot> result = new IdentityHashMap<>();
 
        for (BlockStateModelLoader.LoadedBlockStateModelDispatcher definition : definitionStack) {
            result.putAll(definition.contents.instantiate(stateDefinition, () -> stateDefinitionId + "/" + definition.source));
        }
 
        return new BlockStateModelLoader.LoadedModels(result);
    }
 
    @OnlyIn(Dist.CLIENT)
    private record LoadedBlockStateModelDispatcher(String source, BlockStateModelDispatcher contents) {
    }
 
    @OnlyIn(Dist.CLIENT)
    public record LoadedModels(Map<BlockState, BlockStateModel.UnbakedRoot> models) {
    }
}

引用的其他类