DataGenerator.java

net.minecraft.data.DataGenerator

信息

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

    TODO

字段/常量

  • LOGGER

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

      TODO

  • vanillaPackOutput

    • 类型: PackOutput
    • 修饰符: protected final
    • 源码定位: L19
    • 说明:

      TODO

  • allProviderIds

    • 类型: Set<String>
    • 修饰符: protected final
    • 源码定位: L20
    • 说明:

      TODO

  • providersToRun

    • 类型: Map<String,DataProvider>
    • 修饰符: protected final
    • 源码定位: L21
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.data.DataGenerator.Cached

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

      TODO

  • net.minecraft.data.DataGenerator.PackGenerator

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

      TODO

  • net.minecraft.data.DataGenerator.Uncached

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

      TODO

构造器

public DataGenerator(Path output) @ L23

  • 构造器名:DataGenerator
  • 源码定位:L23
  • 修饰符:public

参数:

  • output: Path

说明:

TODO

方法

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

public abstract void run() @ L27

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

参数:

说明:

TODO

public DataGenerator.PackGenerator getVanillaPack(boolean toRun) @ L29

  • 方法名:getVanillaPack
  • 源码定位:L29
  • 返回类型:DataGenerator.PackGenerator
  • 修饰符:public

参数:

  • toRun: boolean

说明:

TODO

public DataGenerator.PackGenerator getBuiltinDatapack(boolean toRun, String packId) @ L33

  • 方法名:getBuiltinDatapack
  • 源码定位:L33
  • 返回类型:DataGenerator.PackGenerator
  • 修饰符:public

参数:

  • toRun: boolean
  • packId: String

说明:

TODO

代码

public abstract class DataGenerator {
    private static final Logger LOGGER = LogUtils.getLogger();
    protected final PackOutput vanillaPackOutput;
    protected final Set<String> allProviderIds = new HashSet<>();
    protected final Map<String, DataProvider> providersToRun = new LinkedHashMap<>();
 
    public DataGenerator(Path output) {
        this.vanillaPackOutput = new PackOutput(output);
    }
 
    public abstract void run() throws IOException;
 
    public DataGenerator.PackGenerator getVanillaPack(boolean toRun) {
        return new DataGenerator.PackGenerator(toRun, "vanilla", this.vanillaPackOutput);
    }
 
    public DataGenerator.PackGenerator getBuiltinDatapack(boolean toRun, String packId) {
        Path packOutputDir = this.vanillaPackOutput.getOutputFolder(PackOutput.Target.DATA_PACK).resolve("minecraft").resolve("datapacks").resolve(packId);
        return new DataGenerator.PackGenerator(toRun, packId, new PackOutput(packOutputDir));
    }
 
    static {
        Bootstrap.bootStrap();
    }
 
    public static class Cached extends DataGenerator {
        private final Path rootOutputFolder;
        private final WorldVersion version;
        private final boolean alwaysGenerate;
 
        public Cached(Path output, WorldVersion version, boolean alwaysGenerate) {
            super(output);
            this.rootOutputFolder = output;
            this.alwaysGenerate = alwaysGenerate;
            this.version = version;
        }
 
        @Override
        public void run() throws IOException {
            HashCache cache = new HashCache(this.rootOutputFolder, this.allProviderIds, this.version);
            Stopwatch totalTime = Stopwatch.createStarted();
            Stopwatch stopwatch = Stopwatch.createUnstarted();
            this.providersToRun.forEach((providerId, provider) -> {
                if (!this.alwaysGenerate && !cache.shouldRunInThisVersion(providerId)) {
                    DataGenerator.LOGGER.debug("Generator {} already run for version {}", providerId, this.version.name());
                } else {
                    DataGenerator.LOGGER.info("Starting provider: {}", providerId);
                    stopwatch.start();
                    cache.applyUpdate(cache.generateUpdate(providerId, provider::run).join());
                    stopwatch.stop();
                    DataGenerator.LOGGER.info("{} finished after {} ms", providerId, stopwatch.elapsed(TimeUnit.MILLISECONDS));
                    stopwatch.reset();
                }
            });
            DataGenerator.LOGGER.info("All providers took: {} ms", totalTime.elapsed(TimeUnit.MILLISECONDS));
            cache.purgeStaleAndWrite();
        }
    }
 
    public class PackGenerator {
        private final boolean toRun;
        private final String providerPrefix;
        private final PackOutput output;
 
        private PackGenerator(boolean toRun, String providerPrefix, PackOutput output) {
            Objects.requireNonNull(DataGenerator.this);
            super();
            this.toRun = toRun;
            this.providerPrefix = providerPrefix;
            this.output = output;
        }
 
        public <T extends DataProvider> T addProvider(DataProvider.Factory<T> factory) {
            T provider = factory.create(this.output);
            String providerId = this.providerPrefix + "/" + provider.getName();
            if (!DataGenerator.this.allProviderIds.add(providerId)) {
                throw new IllegalStateException("Duplicate provider: " + providerId);
            } else {
                if (this.toRun) {
                    DataGenerator.this.providersToRun.put(providerId, provider);
                }
 
                return provider;
            }
        }
    }
 
    public static class Uncached extends DataGenerator {
        public Uncached(Path output) {
            super(output);
        }
 
        @Override
        public void run() throws IOException {
            Stopwatch totalTime = Stopwatch.createStarted();
            Stopwatch stopwatch = Stopwatch.createUnstarted();
            this.providersToRun.forEach((providerId, provider) -> {
                DataGenerator.LOGGER.info("Starting uncached provider: {}", providerId);
                stopwatch.start();
                provider.run(CachedOutput.NO_CACHE).join();
                stopwatch.stop();
                DataGenerator.LOGGER.info("{} finished after {} ms", providerId, stopwatch.elapsed(TimeUnit.MILLISECONDS));
                stopwatch.reset();
            });
            DataGenerator.LOGGER.info("All providers took: {} ms", totalTime.elapsed(TimeUnit.MILLISECONDS));
        }
    }
}

引用的其他类

  • DataProvider

    • 引用位置: 字段
  • HashCache

    • 引用位置: 构造调用
    • 关联成员: HashCache()
  • PackOutput

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

    • 引用位置: 方法调用
    • 关联成员: Bootstrap.bootStrap()
  • Stopwatch

    • 引用位置: 方法调用
    • 关联成员: Stopwatch.createStarted(), Stopwatch.createUnstarted()