CC-Tweaked/projects/common/src/main/java/dan200/computercraft/data/DataProviders.java

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

74 lines
3.0 KiB
Java
Raw Normal View History

// SPDX-FileCopyrightText: 2022 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
2022-11-09 22:02:47 +00:00
package dan200.computercraft.data;
import com.mojang.serialization.Codec;
import net.minecraft.core.HolderLookup;
2022-11-09 22:02:47 +00:00
import net.minecraft.data.DataProvider;
import net.minecraft.data.PackOutput;
import net.minecraft.data.loot.LootTableProvider.SubProviderEntry;
2022-11-09 22:02:47 +00:00
import net.minecraft.data.models.BlockModelGenerators;
import net.minecraft.data.models.ItemModelGenerators;
import net.minecraft.data.tags.TagsProvider;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.PackType;
2022-11-09 22:02:47 +00:00
import net.minecraft.world.item.Item;
import net.minecraft.world.level.block.Block;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
2022-11-09 22:02:47 +00:00
import java.util.function.Consumer;
/**
* All data providers for ComputerCraft. We require a mod-loader abstraction {@link GeneratorSink} (instead of
* {@link PackOutput})to handle the slight differences between how Forge and Fabric expose Minecraft's data providers.
2022-11-09 22:02:47 +00:00
*/
public final class DataProviders {
private DataProviders() {
}
public static void add(GeneratorSink generator) {
var turtleUpgrades = generator.add(TurtleUpgradeProvider::new);
var pocketUpgrades = generator.add(PocketUpgradeProvider::new);
generator.add((out, registries) -> new RecipeProvider(out, registries, turtleUpgrades, pocketUpgrades));
2022-11-09 22:02:47 +00:00
var blockTags = generator.blockTags(TagProvider::blockTags);
generator.itemTags(TagProvider::itemTags, blockTags);
2022-11-09 22:02:47 +00:00
generator.lootTable(LootTableProvider.getTables());
2022-11-09 22:02:47 +00:00
generator.models(BlockModelProvider::addBlockModels, ItemModelProvider::addItemModels);
2022-11-09 22:02:47 +00:00
generator.add(out -> new LanguageProvider(out, turtleUpgrades, pocketUpgrades));
// Unfortunately we rely on some client-side classes in this code. We just load in the client side data provider
// and invoke that.
try {
Class.forName("dan200.computercraft.data.client.ClientDataProviders")
.getMethod("add", GeneratorSink.class).invoke(null, generator);
} catch (ReflectiveOperationException e) {
throw new RuntimeException(e);
}
2022-11-09 22:02:47 +00:00
}
public interface GeneratorSink {
<T extends DataProvider> T add(DataProvider.Factory<T> factory);
2022-11-09 22:02:47 +00:00
<T extends DataProvider> T add(BiFunction<PackOutput, CompletableFuture<HolderLookup.Provider>, T> factory);
<T> void addFromCodec(String name, PackType type, String directory, Codec<T> codec, Consumer<BiConsumer<ResourceLocation, T>> output);
void lootTable(List<SubProviderEntry> tables);
2022-11-09 22:02:47 +00:00
TagsProvider<Block> blockTags(Consumer<TagProvider.TagConsumer<Block>> tags);
TagsProvider<Item> itemTags(Consumer<TagProvider.ItemTagConsumer> tags, TagsProvider<Block> blocks);
void models(Consumer<BlockModelGenerators> blocks, Consumer<ItemModelGenerators> items);
2022-11-09 22:02:47 +00:00
}
}