diff --git a/libraries/data-gen/build.gradle b/libraries/data-gen/build.gradle new file mode 100644 index 00000000..99b09f4a --- /dev/null +++ b/libraries/data-gen/build.gradle @@ -0,0 +1,6 @@ +setUpLibrary(project) + +dependencies { + implementation 'com.google.code.gson:gson:2.8.0' + implementation 'com.google.guava:guava:17.0' +} \ No newline at end of file diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/build.gradle b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/build.gradle new file mode 100644 index 00000000..0a350fdb --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/build.gradle @@ -0,0 +1 @@ +setUpModule(project) diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/gradle.properties b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/gradle.properties new file mode 100644 index 00000000..038ff5db --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/gradle.properties @@ -0,0 +1,5 @@ +#min_mc_version = 1.13-pre6 +min_mc_version = 18w43a +max_mc_version = 1.14.4 + +minecraft_version = 1.14.4 diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/ModelBuilder.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/ModelBuilder.java new file mode 100644 index 00000000..eb0e12b3 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/ModelBuilder.java @@ -0,0 +1,48 @@ +package net.ornithemc.osl.datagen.api.model; + +import com.google.gson.JsonObject; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; + +import java.util.HashMap; +import java.util.Map; + +public class ModelBuilder { + private NamespacedIdentifier parent; + private Map textures = new HashMap<>(); + + public static ModelBuilder create() { + return new ModelBuilder(); + } + + public static ModelBuilder create(NamespacedIdentifier parent) { + return new ModelBuilder().parent(parent); + } + + public ModelBuilder parent(NamespacedIdentifier parent) { + this.parent = parent; + return this; + } + + public ModelBuilder texture(String name, NamespacedIdentifier texture) { + this.textures.put(name, texture); + return this; + } + + public JsonObject build() { + JsonObject model = new JsonObject(); + + if (parent != null) { + model.addProperty("parent", parent.toString()); + } + + if (!textures.isEmpty()) { + JsonObject texturesJson = new JsonObject(); + for (Map.Entry entry : textures.entrySet()) { + texturesJson.addProperty(entry.getKey(), entry.getValue().toString()); + } + model.add("textures", texturesJson); + } + + return model; + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/ModelGenerator.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/ModelGenerator.java new file mode 100644 index 00000000..20e83b9f --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/ModelGenerator.java @@ -0,0 +1,17 @@ +package net.ornithemc.osl.datagen.api.model; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemLike; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.datagen.api.model.block.BlockModelDefinitionBuilder; +import net.ornithemc.osl.datagen.api.model.block.BlockModelTemplates; + +public interface ModelGenerator { + void blockstate(Block block, BlockModelDefinitionBuilder builder); + void itemModel(ItemLike item, ModelBuilder builder); + NamespacedIdentifier blockModel(NamespacedIdentifier identifier, ModelBuilder builder); + NamespacedIdentifier blockModel(Block block, ModelBuilder builder); + NamespacedIdentifier blockModel(Block block, String suffix, ModelBuilder builder); + + BlockModelTemplates blockTemplates(); +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/block/BlockModelDefinitionBuilder.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/block/BlockModelDefinitionBuilder.java new file mode 100644 index 00000000..1ef1c8b1 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/block/BlockModelDefinitionBuilder.java @@ -0,0 +1,137 @@ +package net.ornithemc.osl.datagen.api.model.block; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.minecraft.block.state.BlockState; +import net.minecraft.client.render.block.BlockModelShaper; +import net.minecraft.state.property.Property; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; + +import java.util.*; + +public class BlockModelDefinitionBuilder { + private final Map variants = new HashMap<>(); + private final List selectors = new ArrayList<>(); + + private BlockModelDefinitionBuilder() { + } + + public static BlockModelDefinitionBuilder create() { + return new BlockModelDefinitionBuilder(); + } + + public static BlockModelDefinitionBuilder createSimple(NamespacedIdentifier modelLocation) { + return new BlockModelDefinitionBuilder().variant("", VariantsBuilder.of(modelLocation)); + } + + public BlockModelDefinitionBuilder variant(BlockState state, VariantsBuilder variants) { + this.variants.put(BlockModelShaper.propertiesToString(state.values()), variants); + return this; + } + + public BlockModelDefinitionBuilder variant(BlockState state, NamespacedIdentifier modelLocation) { + this.variants.put(BlockModelShaper.propertiesToString(state.values()), VariantsBuilder.of(modelLocation)); + return this; + } + + public BlockModelDefinitionBuilder variant(PredicateBuilder predicateBuilder, VariantsBuilder variants) { + this.variants.put(predicateBuilder.build(), variants); + return this; + } + + public BlockModelDefinitionBuilder variant(PredicateBuilder predicateBuilder, NamespacedIdentifier modelLocation) { + this.variants.put(predicateBuilder.build(), VariantsBuilder.of(modelLocation)); + return this; + } + + private BlockModelDefinitionBuilder variant(String variantName, VariantsBuilder variants) { + this.variants.put(variantName, variants); + return this; + } + + public BlockModelDefinitionBuilder selector(VariantsBuilder variants) { + this.selectors.add(new SelectorBuilder(null, variants)); + return this; + } + + public BlockModelDefinitionBuilder selector(NamespacedIdentifier modelLocation) { + this.selectors.add(new SelectorBuilder(null, VariantsBuilder.of(modelLocation))); + return this; + } + + public BlockModelDefinitionBuilder selector(ConditionsBuilder conditions, VariantsBuilder variants) { + this.selectors.add(new SelectorBuilder(conditions, variants)); + return this; + } + + public BlockModelDefinitionBuilder selector(ConditionsBuilder conditions, NamespacedIdentifier modelLocation) { + this.selectors.add(new SelectorBuilder(conditions, VariantsBuilder.of(modelLocation))); + return this; + } + + public JsonObject build() { + JsonObject json = new JsonObject(); + + if (!variants.isEmpty()) { + JsonObject variantsJson = new JsonObject(); + + for (Map.Entry entry : variants.entrySet()) { + variantsJson.add(entry.getKey(), entry.getValue().build()); + } + + json.add("variants", variantsJson); + } + + if (!selectors.isEmpty()) { + JsonArray multiPart = new JsonArray(); + + for (SelectorBuilder entry : selectors) { + multiPart.add(entry.build()); + } + + json.add("multipart", multiPart); + } + + if (json.keySet().isEmpty()) { + throw new IllegalStateException("Block state model definition is empty"); + } + + return json; + } + + static class SelectorBuilder { + private final ConditionsBuilder conditions; + private final VariantsBuilder variants; + + SelectorBuilder(ConditionsBuilder conditions, VariantsBuilder variants) { + this.conditions = conditions; + this.variants = variants; + } + + private JsonObject build() { + JsonObject json = new JsonObject(); + + if (conditions != null) json.add("when", conditions.build()); + json.add("apply", variants.build()); + + return json; + } + } + + public static > PredicateBuilder predicate(Property property, T value) { + return new PredicateBuilder().set(property, value); + } + + public static class PredicateBuilder { + private final Map, Comparable> predicates = new HashMap<>(); + + public > PredicateBuilder set(Property property, T value) { + predicates.put(property, value); + return this; + } + + private String build() { + return BlockModelShaper.propertiesToString(predicates); + } + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/block/BlockModelTemplates.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/block/BlockModelTemplates.java new file mode 100644 index 00000000..6365db11 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/block/BlockModelTemplates.java @@ -0,0 +1,132 @@ +package net.ornithemc.osl.datagen.api.model.block; + +import net.minecraft.block.Block; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.api.util.NamespacedIdentifiers; +import net.ornithemc.osl.datagen.api.model.ModelBuilder; + +public interface BlockModelTemplates { + BlockModelTemplates simpleBlock(Block block, NamespacedIdentifier texture); + BlockModelTemplates simpleBlockWithoutItem(Block block, NamespacedIdentifier texture); + BlockModelTemplates slab(Block block, NamespacedIdentifier doubleModelLocation, NamespacedIdentifier sideTexture, NamespacedIdentifier topTexture, NamespacedIdentifier bottomTexture); + BlockModelTemplates simpleSlab(Block block, NamespacedIdentifier doubleModelLocation, NamespacedIdentifier texture); + BlockModelTemplates stairs(Block block, NamespacedIdentifier sideTexture, NamespacedIdentifier topTexture, NamespacedIdentifier bottomTexture); + BlockModelTemplates simpleStairs(Block block, NamespacedIdentifier texture); + + static ModelBuilder cube( + NamespacedIdentifier downTexture, + NamespacedIdentifier upTexture, + NamespacedIdentifier northTexture, + NamespacedIdentifier southTexture, + NamespacedIdentifier westTexture, + NamespacedIdentifier eastTexture + ) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/cube")) + .texture("down", downTexture) + .texture("up", upTexture) + .texture("north", northTexture) + .texture("south", southTexture) + .texture("west", westTexture) + .texture("east", eastTexture); + } + + static ModelBuilder cubeAll(NamespacedIdentifier texture) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/cube_all")).texture("all", texture); + } + + static ModelBuilder cubeBottomTop(NamespacedIdentifier sideTexture, NamespacedIdentifier topTexture, NamespacedIdentifier bottomTexture) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/cube_bottom_top")) + .texture("side", sideTexture) + .texture("bottom", bottomTexture) + .texture("top", topTexture); + } + + static ModelBuilder cubeColumn(NamespacedIdentifier sideTexture, NamespacedIdentifier endTexture) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/cube_column")) + .texture("side", sideTexture) + .texture("end", endTexture); + } + + static ModelBuilder cubeDirectional( + NamespacedIdentifier downTexture, + NamespacedIdentifier upTexture, + NamespacedIdentifier northTexture, + NamespacedIdentifier southTexture, + NamespacedIdentifier westTexture, + NamespacedIdentifier eastTexture + ) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/cube_directional")) + .texture("down", downTexture) + .texture("up", upTexture) + .texture("north", northTexture) + .texture("south", southTexture) + .texture("west", westTexture) + .texture("east", eastTexture); + } + + static ModelBuilder cubeMirrored( + NamespacedIdentifier downTexture, + NamespacedIdentifier upTexture, + NamespacedIdentifier northTexture, + NamespacedIdentifier southTexture, + NamespacedIdentifier westTexture, + NamespacedIdentifier eastTexture + ) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/cube_mirrored")) + .texture("down", downTexture) + .texture("up", upTexture) + .texture("north", northTexture) + .texture("south", southTexture) + .texture("west", westTexture) + .texture("east", eastTexture); + } + + static ModelBuilder cubeAllMirrored(NamespacedIdentifier texture) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/cube_all_mirrored")).texture("all", texture); + } + + static ModelBuilder cubeTop(NamespacedIdentifier sideTexture, NamespacedIdentifier topTexture) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/cube_top")) + .texture("side", sideTexture) + .texture("top", topTexture); + } + + static ModelBuilder slabBottom(NamespacedIdentifier sideTexture, NamespacedIdentifier topTexture, NamespacedIdentifier bottomTexture) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/slab")) + .texture("side", sideTexture) + .texture("top", topTexture) + .texture("bottom", bottomTexture); + } + + static ModelBuilder slabTop(NamespacedIdentifier sideTexture, NamespacedIdentifier topTexture, NamespacedIdentifier bottomTexture) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/slab_top")) + .texture("side", sideTexture) + .texture("top", topTexture) + .texture("bottom", bottomTexture); + } + + static ModelBuilder cross(NamespacedIdentifier texture) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/cross")).texture("cross", texture); + } + + static ModelBuilder stairs(NamespacedIdentifier sideTexture, NamespacedIdentifier topTexture, NamespacedIdentifier bottomTexture) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/stairs")) + .texture("side", sideTexture) + .texture("top", topTexture) + .texture("bottom", bottomTexture); + } + + static ModelBuilder stairsInner(NamespacedIdentifier sideTexture, NamespacedIdentifier topTexture, NamespacedIdentifier bottomTexture) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/inner_stairs")) + .texture("side", sideTexture) + .texture("top", topTexture) + .texture("bottom", bottomTexture); + } + + static ModelBuilder stairsOuter(NamespacedIdentifier sideTexture, NamespacedIdentifier topTexture, NamespacedIdentifier bottomTexture) { + return ModelBuilder.create(NamespacedIdentifiers.from("block/outer_stairs")) + .texture("side", sideTexture) + .texture("top", topTexture) + .texture("bottom", bottomTexture); + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/block/ConditionsBuilder.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/block/ConditionsBuilder.java new file mode 100644 index 00000000..324d955c --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/block/ConditionsBuilder.java @@ -0,0 +1,134 @@ +package net.ornithemc.osl.datagen.api.model.block; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.minecraft.state.property.Property; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public interface ConditionsBuilder { + JsonObject build(); + + @SafeVarargs + static > PropertyBuilder propertyNegated(Property property, @NotNull T mainMatch, T... extraPossibleMatch) { + List valueList = new ArrayList<>(); + valueList.add(mainMatch); + valueList.addAll(Arrays.asList(extraPossibleMatch)); + return new PropertyBuilder<>(false, property, valueList); + } + + @SafeVarargs + static > PropertyBuilder property(Property property, @NotNull T mainMatch, T... extraPossibleMatch) { + List valueList = new ArrayList<>(); + valueList.add(mainMatch); + valueList.addAll(Arrays.asList(extraPossibleMatch)); + return new PropertyBuilder<>(false, property, valueList); + } + + static ConditionsBuilder properties(PropertyBuilder...properties) { + if (properties.length == 0) { + throw new IllegalArgumentException("Must provide at least one property"); + } + + return new PropertyConditionBuilder(properties); + } + + static ConditionsBuilder or(ConditionsBuilder...conditions) { + if (conditions.length == 0) { + throw new IllegalArgumentException("Must provide at least one condition"); + } + + return new OrConditonBuilder(conditions); + } + + static ConditionsBuilder and(ConditionsBuilder...conditions) { + if (conditions.length == 0) { + throw new IllegalArgumentException("Must provide at least one condition"); + } + + return new AndConditonBuilder(conditions); + } + + class PropertyBuilder> { + private final boolean negated; + private final Property property; + private final List values; + + private PropertyBuilder(boolean negated, Property property, List values) { + this.negated = negated; + this.property = property; + this.values = values; + } + + private void write(JsonObject object) { + object.addProperty(property.getName(), (negated ? "!" : "") + values.stream().map(property::getName).collect(Collectors.joining("|"))); + } + } + + class PropertyConditionBuilder implements ConditionsBuilder { + private final PropertyBuilder[] properties; + + private PropertyConditionBuilder(PropertyBuilder[] properties) { + this.properties = properties; + } + + @Override + public JsonObject build() { + JsonObject object = new JsonObject(); + + for (PropertyBuilder propertyBuilder : properties) { + propertyBuilder.write(object); + } + + return object; + } + } + + class AndConditonBuilder implements ConditionsBuilder { + private final ConditionsBuilder[] conditions; + + private AndConditonBuilder(ConditionsBuilder[] conditions) { + this.conditions = conditions; + } + + @Override + public JsonObject build() { + JsonArray array = new JsonArray(); + + for (ConditionsBuilder condition : conditions) { + array.add(condition.build()); + } + + JsonObject object = new JsonObject(); + object.add("AND", array); + + return object; + } + } + + class OrConditonBuilder implements ConditionsBuilder { + private final ConditionsBuilder[] conditions; + + private OrConditonBuilder(ConditionsBuilder[] conditions) { + this.conditions = conditions; + } + + @Override + public JsonObject build() { + JsonArray array = new JsonArray(); + + for (ConditionsBuilder condition : conditions) { + array.add(condition.build()); + } + + JsonObject object = new JsonObject(); + object.add("OR", array); + + return object; + } + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/block/VariantsBuilder.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/block/VariantsBuilder.java new file mode 100644 index 00000000..d67d29fb --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/block/VariantsBuilder.java @@ -0,0 +1,114 @@ +package net.ornithemc.osl.datagen.api.model.block; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.client.resource.model.ModelRotation; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; + +public interface VariantsBuilder { + JsonElement build(); + + static VariantBuilder of(NamespacedIdentifier modelLocation) { + return new VariantBuilder(modelLocation); + } + + static VariantsBuilder multi(VariantBuilder... variants) { + if (variants.length == 0) { + throw new IllegalArgumentException("Must provide at least one variant"); + } + + return new MultiBuilder(variants); + } + + class VariantBuilder implements VariantsBuilder { + private final NamespacedIdentifier modelLocation; + private int x = 0; + private int y = 0; + private boolean lockedUV = false; + private int weight = 1; + + private VariantBuilder(NamespacedIdentifier modelLocation) { + this.modelLocation = modelLocation; + } + + public VariantBuilder x(int x) { + ModelRotation rotation = ModelRotation.by(x, y); + + if (rotation == null) { + throw new IllegalArgumentException("Invalid x rotation " + x); + } + + this.x = x; + return this; + } + + public VariantBuilder y(int y) { + ModelRotation rotation = ModelRotation.by(x, y); + + if (rotation == null) { + throw new IllegalArgumentException("Invalid y rotation " + y); + } + + this.y = y; + return this; + } + + public VariantBuilder lockedUV(boolean lockUV) { + this.lockedUV = lockUV; + return this; + } + + public VariantBuilder weight(int weight) { + if (weight <= 0) { + throw new IllegalArgumentException("Weight must be greater than 0"); + } + + this.weight = weight; + return this; + } + + public JsonElement build() { + JsonObject json = new JsonObject(); + json.addProperty("model", modelLocation.toString()); + + // Defaulted properties + if (x != 0) { + json.addProperty("x", x); + } + + if (y != 0) { + json.addProperty("y", y); + } + + if (lockedUV) { + json.addProperty("uvlock", true); + } + + if (weight > 1) { + json.addProperty("weight", weight); + } + + return json; + } + } + + class MultiBuilder implements VariantsBuilder { + private final VariantBuilder[] variants; + + private MultiBuilder(VariantBuilder... variants) { + this.variants = variants; + } + + @Override + public JsonElement build() { + JsonArray json = new JsonArray(); + + for (VariantBuilder variant : variants) { + json.add(variant.build()); + } + + return json; + } + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/item/ItemModelTemplates.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/item/ItemModelTemplates.java new file mode 100644 index 00000000..bd984828 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/model/item/ItemModelTemplates.java @@ -0,0 +1,15 @@ +package net.ornithemc.osl.datagen.api.model.item; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.api.util.NamespacedIdentifiers; +import net.ornithemc.osl.datagen.api.model.ModelBuilder; + +public final class ItemModelTemplates { + public static ModelBuilder basic(NamespacedIdentifier texture) { + return ModelBuilder.create(NamespacedIdentifiers.from("item/generated")).texture("layer0", texture); + } + + public static ModelBuilder basic(NamespacedIdentifier firstLayer, NamespacedIdentifier secondLayer) { + return ModelBuilder.create(NamespacedIdentifiers.from("item/generated")).texture("layer0", firstLayer).texture("layer1", secondLayer); + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModAdvancementProvider.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModAdvancementProvider.java new file mode 100644 index 00000000..d2de3518 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModAdvancementProvider.java @@ -0,0 +1,40 @@ +package net.ornithemc.osl.datagen.api.provider; + +import com.google.gson.JsonElement; +import net.fabricmc.loader.api.ModContainer; +import net.minecraft.advancement.Advancement; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.datagen.api.PackGenerator; +import net.ornithemc.osl.resource.loader.api.resource.ResourcePath; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; + +import java.nio.file.Path; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public abstract class ModAdvancementProvider extends GsonPackProvider { + protected ModAdvancementProvider(PackGenerator generator, ModContainer mod) { + super(generator, mod); + } + + @Override + protected final void generate(BiConsumer consumer) { + Consumer advancementConsumer = advancement -> { + consumer.accept(advancement.getId(), advancement.builder().toJson()); + }; + + generateAdvancements(advancementConsumer); + } + + public abstract void generateAdvancements(Consumer consumer); + + @Override + protected Path getPath(NamespacedIdentifier id) { + return generator.getOutputPath().resolve(ResourcePath.nameOf(ResourceType.SERVER_DATA, id.prefixed("advancements/").suffixed(".json"))); + } + + @Override + public String getProviderName() { + return "Advancements"; + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModLanguageProvider.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModLanguageProvider.java new file mode 100644 index 00000000..04b0217e --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModLanguageProvider.java @@ -0,0 +1,76 @@ +package net.ornithemc.osl.datagen.api.provider; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.fabricmc.loader.api.ModContainer; +import net.minecraft.block.Block; +import net.minecraft.entity.EntityType; +import net.minecraft.item.Item; +import net.minecraft.resource.Identifier; +import net.minecraft.world.biome.Biome; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.datagen.api.PackGenerator; +import net.ornithemc.osl.resource.loader.api.resource.ResourcePath; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; + +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; + +public abstract class ModLanguageProvider extends GsonPackProvider { + private final String languageCode; + + protected ModLanguageProvider(PackGenerator generator, ModContainer mod, String languageCode) { + super(generator, mod); + this.languageCode = languageCode; + } + + protected ModLanguageProvider(PackGenerator generator, ModContainer mod) { + this(generator, mod, "en_us"); + } + + @Override + protected final void generate(BiConsumer consumer) { + Map translations = new HashMap<>(); + + generateTranslations(translations::put); + + JsonObject jsonObject = new JsonObject(); + translations.forEach(jsonObject::addProperty); + + consumer.accept(new Identifier(mod.getMetadata().getId(), this.languageCode), jsonObject); + } + + protected abstract void generateTranslations(TranslationBuilder builder); + + @Override + protected Path getPath(NamespacedIdentifier id) { + return this.generator.getOutputPath().resolve(ResourcePath.nameOf(ResourceType.CLIENT_ASSETS, id.prefixed("lang").suffixed(".json"))); + } + + @Override + public String getProviderName() { + return String.format("Language (%s)", this.languageCode); + } + + public interface TranslationBuilder { + void add(String key, String value); + + default void add(Block block, String value) { + this.add(block.getTranslationKey(), value); + } + + default void add(Item item, String value) { + this.add(item.getTranslationKey(), value); + } + + default void add(EntityType entityType, String value) { + this.add(entityType.getTranslationKey(), value); + } + + default void add(Biome biome, String value) { + this.add(biome.getTranslationKey(), value); + } + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModLootTablesProvider.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModLootTablesProvider.java new file mode 100644 index 00000000..3350ce69 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModLootTablesProvider.java @@ -0,0 +1,36 @@ +package net.ornithemc.osl.datagen.api.provider; + +import com.google.gson.JsonElement; +import net.fabricmc.loader.api.ModContainer; +import net.minecraft.world.gen.loot.LootTable; +import net.minecraft.world.gen.loot.LootTables; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.datagen.api.PackGenerator; +import net.ornithemc.osl.resource.loader.api.resource.ResourcePath; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; + +import java.nio.file.Path; +import java.util.function.BiConsumer; + +public abstract class ModLootTablesProvider extends GsonPackProvider { + protected ModLootTablesProvider(PackGenerator generator, ModContainer mod) { + super(generator, mod); + } + + @Override + protected final void generate(BiConsumer consumer) { + generateLootTables((id, lootTable) -> consumer.accept(id, LootTables.m_19064268(lootTable.m_74891066()).getAsJsonObject())); + } + + public abstract void generateLootTables(BiConsumer consumer); + + @Override + protected Path getPath(NamespacedIdentifier id) { + return generator.getOutputPath().resolve(ResourcePath.nameOf(ResourceType.SERVER_DATA, id.prefixed("loot_tables/").suffixed(".json"))); + } + + @Override + public String getProviderName() { + return "LootTables"; + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModModelProvider.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModModelProvider.java new file mode 100644 index 00000000..a7fdcdb7 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModModelProvider.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.datagen.api.provider; + +import com.google.gson.JsonElement; +import net.fabricmc.loader.api.ModContainer; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.api.util.NamespacedIdentifiers; +import net.ornithemc.osl.datagen.api.PackGenerator; +import net.ornithemc.osl.datagen.api.model.ModelGenerator; +import net.ornithemc.osl.datagen.impl.model.ModelGeneratorImpl; +import net.ornithemc.osl.resource.loader.api.resource.ResourcePath; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; + +import java.nio.file.Path; +import java.util.function.BiConsumer; + +public abstract class ModModelProvider extends GsonPackProvider{ + protected ModModelProvider(PackGenerator generator, ModContainer mod) { + super(generator, mod); + } + + @Override + protected final void generate(BiConsumer consumer) { + ModelGenerator modelGenerator = new ModelGeneratorImpl(consumer); + generateModels(modelGenerator); + } + + public abstract void generateModels(ModelGenerator generator); + + public NamespacedIdentifier block(NamespacedIdentifier id) { + return id.suffixed("block/"); + } + + public NamespacedIdentifier block(String path) { + return block(NamespacedIdentifiers.parse(path)); + } + + public NamespacedIdentifier item(NamespacedIdentifier id) { + return id.suffixed("item/"); + } + + public NamespacedIdentifier item(String path) { + return item(NamespacedIdentifiers.parse(path)); + } + + @Override + protected Path getPath(NamespacedIdentifier id) { + return generator.getOutputPath().resolve(ResourcePath.nameOf(ResourceType.CLIENT_ASSETS, id.suffixed(".json"))); + } + + @Override + public String getProviderName() { + return "Models"; + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModRecipesProvider.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModRecipesProvider.java new file mode 100644 index 00000000..523ceefc --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/api/provider/ModRecipesProvider.java @@ -0,0 +1,42 @@ +package net.ornithemc.osl.datagen.api.provider; + +import com.google.common.collect.Sets; +import com.google.gson.JsonObject; +import net.minecraft.data.DataGenerator; +import net.minecraft.data.HashCache; +import net.minecraft.data.recipe.RecipesProvider; +import net.minecraft.resource.Identifier; +import net.minecraft.unmapped.C_23159014; +import net.ornithemc.osl.datagen.api.PackGenerator; +import net.ornithemc.osl.datagen.impl.access.RecipeBuilderAccess; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Set; +import java.util.function.Consumer; + +public abstract class ModRecipesProvider extends RecipesProvider { + public ModRecipesProvider(PackGenerator generator) { + super((DataGenerator) generator); + } + + @Override + public final void run(HashCache cache) { + Path path = this.generator.getOutput(); + Set set = Sets.newHashSet(); + this.generateRecipes((c_23159014) -> { + if (!set.add(c_23159014.m_80989661())) { + throw new IllegalStateException("Duplicate recipe " + c_23159014.m_80989661()); + } else { + this.save(cache, ((RecipeBuilderAccess) c_23159014).getRecipe(), path.resolve("data/" + c_23159014.m_80989661().getNamespace() + "/recipes/" + c_23159014.m_80989661().getPath() + ".json")); + JsonObject jsonObject = c_23159014.m_38911806(); + if (jsonObject != null) { + this.saveAdvancement(cache, jsonObject, path.resolve("data/" + c_23159014.m_80989661().getNamespace() + "/advancements/" + c_23159014.m_66233363().getPath() + ".json")); + } + + } + }); + } + + protected abstract void generateRecipes(Consumer consumer); +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/DataGenMixinPlugin.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/DataGenMixinPlugin.java new file mode 100644 index 00000000..50c1fcd8 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/DataGenMixinPlugin.java @@ -0,0 +1,51 @@ +package net.ornithemc.osl.datagen.impl; + +import net.ornithemc.osl.core.impl.util.MinecraftVersion; +import org.objectweb.asm.tree.ClassNode; +import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin; +import org.spongepowered.asm.mixin.extensibility.IMixinInfo; + +import java.util.List; +import java.util.Set; + +public class DataGenMixinPlugin implements IMixinConfigPlugin { + + @Override + public void onLoad(String mixinPackage) { + } + + @Override + public String getRefMapperConfig() { + return null; + } + + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if ("net.ornithemc.osl.datagen.impl.mixin.C_23159014NewMixin".equals(mixinClassName)) { + return MinecraftVersion.resolve().compareTo("19w03a") >= 0; + } + + if ("net.ornithemc.osl.datagen.impl.mixin.C_23159014OldMixin".equals(mixinClassName)) { + return MinecraftVersion.resolve().compareTo("19w03a") < 0; + } + + return true; + } + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { + } + + @Override + public List getMixins() { + return null; + } + + @Override + public void preApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } + + @Override + public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/DataGeneratorInit.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/DataGeneratorInit.java new file mode 100644 index 00000000..61c2c574 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/DataGeneratorInit.java @@ -0,0 +1,47 @@ +package net.ornithemc.osl.datagen.impl; + +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.entrypoint.EntrypointContainer; +import net.ornithemc.osl.datagen.api.DataGeneratorInitializer; +import net.ornithemc.osl.entrypoints.api.ModInitializer; +import net.ornithemc.osl.registries.api.RegistryEvents; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; + +public class DataGeneratorInit implements ModInitializer { + @Override + public void init() { + if (!DataGenHelperImpl.ENABLED) return; + + RegistryEvents.REGISTRIES_FROZEN.register(() -> { + Path basePath = DataGenHelperImpl.getOutputDir(); + + List> entrypoints = FabricLoader.getInstance() + .getEntrypointContainers(DataGeneratorInitializer.KEY, DataGeneratorInitializer.class); + + List generators = new ArrayList<>(); + + for (EntrypointContainer entrypoint : entrypoints) { + final String modId = entrypoint.getProvider().getMetadata().getId(); + + if (DataGenHelperImpl.MOD_ID_FILTER != null && !modId.equals(DataGenHelperImpl.MOD_ID_FILTER)) { + continue; + } + + ModDataGeneratorImpl generator = new ModDataGeneratorImpl(basePath, entrypoint.getProvider()); + generators.add(generator); + + DataGeneratorInitializer initializer = entrypoint.getEntrypoint(); + initializer.onDatagenInit(generator); + } + + for (ModDataGeneratorImpl generator : generators) { + generator.run(); + } + + System.exit(0); + }); + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/ModDataGeneratorImpl.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/ModDataGeneratorImpl.java new file mode 100644 index 00000000..c363ef8e --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/ModDataGeneratorImpl.java @@ -0,0 +1,54 @@ +package net.ornithemc.osl.datagen.impl; + +import net.fabricmc.loader.api.ModContainer; +import net.minecraft.data.DataGenerator; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.datagen.api.ModDataGenerator; +import net.ornithemc.osl.datagen.api.PackGenerator; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ModDataGeneratorImpl implements ModDataGenerator { + private final Path basePath; + private final ModContainer modContainer; + private final List generators; + + public ModDataGeneratorImpl(Path basePath, ModContainer modContainer) { + this.basePath = basePath; + this.modContainer = modContainer; + generators = new ArrayList<>(); + } + + @Override + public PackGenerator createPack() { + DataGenerator generator = new PackDataGeneratorImpl(basePath, Collections.emptySet(), modContainer.getMetadata().getDescription()); + generators.add(generator); + return generator; + } + + @Override + public PackGenerator createBuiltinResourcePack(NamespacedIdentifier id) { + DataGenerator generator = new PackDataGeneratorImpl(basePath.resolve(id.prefixed("resourcepacks/").identifier()), Collections.emptySet(), id.toString()); + generators.add(generator); + return generator; + } + + @Override + public ModContainer getMod() { + return modContainer; + } + + public void run() { + for (DataGenerator generator : generators) { + try { + generator.run(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/PackDataGeneratorImpl.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/PackDataGeneratorImpl.java new file mode 100644 index 00000000..77540962 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/PackDataGeneratorImpl.java @@ -0,0 +1,14 @@ +package net.ornithemc.osl.datagen.impl; + +import net.minecraft.data.DataGenerator; +import net.ornithemc.osl.datagen.impl.provider.MCMetaProvider; + +import java.nio.file.Path; +import java.util.Collection; + +public class PackDataGeneratorImpl extends DataGenerator { + public PackDataGeneratorImpl(Path output, Collection inputs, String description) { + super(output, inputs); + this.addProvider(new MCMetaProvider(this, description)); + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/PackProviderExtensionImpl.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/PackProviderExtensionImpl.java new file mode 100644 index 00000000..6b9d44e7 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/PackProviderExtensionImpl.java @@ -0,0 +1,14 @@ +package net.ornithemc.osl.datagen.impl; + +import net.ornithemc.osl.datagen.api.PackCache; +import net.ornithemc.osl.datagen.api.provider.PackProvider; + +public interface PackProviderExtensionImpl extends PackProvider { + @Override + default void provide(PackCache cache) {} + + @Override + default String getProviderName() { + return ""; + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/access/RecipeBuilderAccess.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/access/RecipeBuilderAccess.java new file mode 100644 index 00000000..b7d6fa28 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/access/RecipeBuilderAccess.java @@ -0,0 +1,7 @@ +package net.ornithemc.osl.datagen.impl.access; + +import com.google.gson.JsonObject; + +public interface RecipeBuilderAccess { + JsonObject getRecipe(); +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/C_23159014NewMixin.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/C_23159014NewMixin.java new file mode 100644 index 00000000..003acf19 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/C_23159014NewMixin.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.datagen.impl.mixin; + +import com.google.gson.JsonObject; +import net.minecraft.unmapped.C_23159014; +import net.ornithemc.osl.datagen.impl.access.RecipeBuilderAccess; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(C_23159014.class) +public interface C_23159014NewMixin extends RecipeBuilderAccess { + @Shadow + JsonObject m_77277228(); + + @Override + default JsonObject getRecipe() { + return this.m_77277228(); + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/C_23159014OldMixin.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/C_23159014OldMixin.java new file mode 100644 index 00000000..8001fc52 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/C_23159014OldMixin.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.datagen.impl.mixin; + +import com.google.gson.JsonObject; +import net.minecraft.unmapped.C_23159014; +import net.ornithemc.osl.datagen.impl.access.RecipeBuilderAccess; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(C_23159014.class) +public interface C_23159014OldMixin extends RecipeBuilderAccess { + @Shadow + JsonObject m_13901626(); + + @Override + default JsonObject getRecipe() { + return this.m_13901626(); + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/DataGeneratorMixin.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/DataGeneratorMixin.java new file mode 100644 index 00000000..ce2c6bae --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/DataGeneratorMixin.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.datagen.impl.mixin; + +import net.minecraft.data.DataGenerator; +import net.minecraft.data.DataProvider; +import net.ornithemc.osl.datagen.api.PackGenerator; +import net.ornithemc.osl.datagen.api.provider.PackProvider; +import net.ornithemc.osl.datagen.impl.wrapper.PackProviderWrapper; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.nio.file.Path; + +@Mixin(DataGenerator.class) +public abstract class DataGeneratorMixin implements PackGenerator { + @Shadow + public abstract void addProvider(DataProvider provider); + + @Shadow + public abstract Path getOutput(); + + @Override + public void addProvider(PackProvider provider) { + if (provider instanceof DataProvider) { + addProvider((DataProvider) provider); + } else { + addProvider(new PackProviderWrapper(provider)); + } + } + + @Override + public Path getOutputPath() { + return this.getOutput(); + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/DataProviderMixin.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/DataProviderMixin.java new file mode 100644 index 00000000..8938cb91 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/DataProviderMixin.java @@ -0,0 +1,17 @@ +package net.ornithemc.osl.datagen.impl.mixin; + +import net.minecraft.data.DataProvider; +import net.ornithemc.osl.datagen.impl.PackProviderExtensionImpl; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +@Mixin(DataProvider.class) +public interface DataProviderMixin extends PackProviderExtensionImpl { + @Shadow + String getName(); + + @Override + default String getProviderName() { + return this.getName(); + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/HashCacheMixin.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/HashCacheMixin.java new file mode 100644 index 00000000..2626db15 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/mixin/HashCacheMixin.java @@ -0,0 +1,51 @@ +package net.ornithemc.osl.datagen.impl.mixin; + +import net.minecraft.data.HashCache; +import net.ornithemc.osl.datagen.api.PackCache; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; + +@Mixin(HashCache.class) +public abstract class HashCacheMixin implements PackCache { + @Shadow + @Nullable + public abstract String get(Path path); + + @Shadow + public abstract void put(Path path, String hash); + + @Override + public void checkAndWrite(Path path, byte[] data) throws IOException { + String hash = SHA1.hashBytes(data).toString(); + + if (!Objects.equals(this.get(path), hash) || !Files.exists(path)) { + Files.createDirectories(path.getParent()); + + Files.write(path, data); + } + + this.put(path, hash); + } + + @Override + public void checkAndWrite(Path path, String data) throws IOException { + String hash = SHA1.hashUnencodedChars(data).toString(); + + if (!Objects.equals(this.get(path), hash) || !Files.exists(path)) { + Files.createDirectories(path.getParent()); + + try (BufferedWriter bufferedWriter = Files.newBufferedWriter(path)) { + bufferedWriter.write(data); + } + } + + this.put(path, hash); + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/model/BlockModelTemplatesImpl.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/model/BlockModelTemplatesImpl.java new file mode 100644 index 00000000..6254e03b --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/model/BlockModelTemplatesImpl.java @@ -0,0 +1,332 @@ +package net.ornithemc.osl.datagen.impl.model; + +import net.minecraft.block.Block; +import net.minecraft.block.SlabBlock; +import net.minecraft.block.StairsBlock; +import net.minecraft.block.state.property.SlabType; +import net.minecraft.block.state.property.StairHalf; +import net.minecraft.block.state.property.StairShape; +import net.minecraft.util.math.Direction; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.datagen.api.model.ModelBuilder; +import net.ornithemc.osl.datagen.api.model.ModelGenerator; +import net.ornithemc.osl.datagen.api.model.block.BlockModelDefinitionBuilder; +import net.ornithemc.osl.datagen.api.model.block.BlockModelTemplates; +import net.ornithemc.osl.datagen.api.model.block.VariantsBuilder; + +public class BlockModelTemplatesImpl implements BlockModelTemplates { + private final ModelGenerator modelGenerator; + + public BlockModelTemplatesImpl(ModelGenerator modelGenerator) { + this.modelGenerator = modelGenerator; + } + + @Override + public BlockModelTemplates simpleBlock(Block block, NamespacedIdentifier texture) { + NamespacedIdentifier blockModelId = modelGenerator.blockModel(block, BlockModelTemplates.cubeAll(texture)); + modelGenerator.itemModel(block, ModelBuilder.create(blockModelId)); + modelGenerator.blockstate(block, BlockModelDefinitionBuilder.createSimple(blockModelId)); + + return this; + } + + @Override + public BlockModelTemplates simpleBlockWithoutItem(Block block, NamespacedIdentifier texture) { + NamespacedIdentifier blockModelId = modelGenerator.blockModel(block, BlockModelTemplates.cubeAll(texture)); + modelGenerator.blockstate(block, BlockModelDefinitionBuilder.createSimple(blockModelId)); + + return this; + } + + @Override + public BlockModelTemplates slab(Block block, NamespacedIdentifier doubleModelLocation, NamespacedIdentifier sideTexture, NamespacedIdentifier topTexture, NamespacedIdentifier bottomTexture) { + NamespacedIdentifier bottomId = modelGenerator.blockModel(block, BlockModelTemplates.slabBottom(sideTexture, topTexture, bottomTexture)); + NamespacedIdentifier topId = modelGenerator.blockModel(block, "_top", BlockModelTemplates.slabTop(sideTexture, topTexture, bottomTexture)); + modelGenerator.itemModel(block, ModelBuilder.create(bottomId)); + modelGenerator.blockstate( + block, + BlockModelDefinitionBuilder.create() + .variant(BlockModelDefinitionBuilder.predicate(SlabBlock.HALF, SlabType.BOTTOM), bottomId) + .variant(BlockModelDefinitionBuilder.predicate(SlabBlock.HALF, SlabType.TOP), topId) + .variant(BlockModelDefinitionBuilder.predicate(SlabBlock.HALF, SlabType.DOUBLE), doubleModelLocation) + ); + + return this; + } + + @Override + public BlockModelTemplates simpleSlab(Block block, NamespacedIdentifier doubleModelLocation, NamespacedIdentifier texture) { + return slab(block, doubleModelLocation, texture, texture, texture); + } + + @Override + public BlockModelTemplates stairs(Block block, NamespacedIdentifier sideTexture, NamespacedIdentifier topTexture, NamespacedIdentifier bottomTexture) { + NamespacedIdentifier baseId = modelGenerator.blockModel(block, BlockModelTemplates.stairs(sideTexture, topTexture, bottomTexture)); + NamespacedIdentifier innerId = modelGenerator.blockModel(block, "_inner", BlockModelTemplates.stairsInner(sideTexture, topTexture, bottomTexture)); + NamespacedIdentifier outerId = modelGenerator.blockModel(block, "_outer", BlockModelTemplates.stairsOuter(sideTexture, topTexture, bottomTexture)); + modelGenerator.itemModel(block, ModelBuilder.create(baseId)); + + modelGenerator.blockstate( + block, + BlockModelDefinitionBuilder.create() + // Straight Bottom + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.EAST) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.STRAIGHT), + VariantsBuilder.of(baseId) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.WEST) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.STRAIGHT), + VariantsBuilder.of(baseId).y(180).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.SOUTH) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.STRAIGHT), + VariantsBuilder.of(baseId).y(90).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.NORTH) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.STRAIGHT), + VariantsBuilder.of(baseId).y(270).lockedUV(true) + ) + // Outer Right Bottom + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.EAST) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.OUTER_RIGHT), + VariantsBuilder.of(outerId) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.WEST) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.OUTER_RIGHT), + VariantsBuilder.of(outerId).y(180).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.SOUTH) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.OUTER_RIGHT), + VariantsBuilder.of(outerId).y(90).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.NORTH) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.OUTER_RIGHT), + VariantsBuilder.of(outerId).y(270).lockedUV(true) + ) + // Outer Left Bottom + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.EAST) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.OUTER_LEFT), + VariantsBuilder.of(outerId).y(270).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.WEST) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.OUTER_LEFT), + VariantsBuilder.of(outerId).y(90).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.SOUTH) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.OUTER_LEFT), + VariantsBuilder.of(outerId) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.NORTH) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.OUTER_LEFT), + VariantsBuilder.of(outerId).y(180).lockedUV(true) + ) + // Inner Right Bottom + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.EAST) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.INNER_RIGHT), + VariantsBuilder.of(innerId) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.WEST) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.INNER_RIGHT), + VariantsBuilder.of(innerId).y(180).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.SOUTH) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.INNER_RIGHT), + VariantsBuilder.of(innerId).y(90).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.NORTH) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.INNER_RIGHT), + VariantsBuilder.of(innerId).y(270).lockedUV(true) + ) + // Inner Left Bottom + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.EAST) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.INNER_LEFT), + VariantsBuilder.of(innerId).y(270).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.WEST) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.INNER_LEFT), + VariantsBuilder.of(innerId).y(90).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.SOUTH) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.INNER_LEFT), + VariantsBuilder.of(innerId) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.NORTH) + .set(StairsBlock.HALF, StairHalf.BOTTOM) + .set(StairsBlock.SHAPE, StairShape.INNER_LEFT), + VariantsBuilder.of(innerId).y(180).lockedUV(true) + ) + + // Straight Top + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.EAST) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.STRAIGHT), + VariantsBuilder.of(baseId).x(180).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.WEST) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.STRAIGHT), + VariantsBuilder.of(baseId).x(180).y(180).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.SOUTH) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.STRAIGHT), + VariantsBuilder.of(baseId).x(180).y(90).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.NORTH) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.STRAIGHT), + VariantsBuilder.of(baseId).x(180).y(270).lockedUV(true) + ) + // Outer Right Top + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.EAST) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.OUTER_RIGHT), + VariantsBuilder.of(outerId).x(180).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.WEST) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.OUTER_RIGHT), + VariantsBuilder.of(outerId).x(180).y(180).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.SOUTH) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.OUTER_RIGHT), + VariantsBuilder.of(outerId).x(180).y(90).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.NORTH) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.OUTER_RIGHT), + VariantsBuilder.of(outerId).x(180).y(270).lockedUV(true) + ) + // Outer Left Top + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.EAST) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.OUTER_LEFT), + VariantsBuilder.of(outerId).x(180).y(270).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.WEST) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.OUTER_LEFT), + VariantsBuilder.of(outerId).x(180).y(90).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.SOUTH) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.OUTER_LEFT), + VariantsBuilder.of(outerId).x(180).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.NORTH) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.OUTER_LEFT), + VariantsBuilder.of(outerId).x(180).y(180).lockedUV(true) + ) + // Inner Right Top + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.EAST) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.INNER_RIGHT), + VariantsBuilder.of(innerId).x(180).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.WEST) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.INNER_RIGHT), + VariantsBuilder.of(innerId).x(180).y(180).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.SOUTH) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.INNER_RIGHT), + VariantsBuilder.of(innerId).x(180).y(90).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.NORTH) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.INNER_RIGHT), + VariantsBuilder.of(innerId).x(180).y(270).lockedUV(true) + ) + // Inner Left Top + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.EAST) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.INNER_LEFT), + VariantsBuilder.of(innerId).x(180).y(270).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.WEST) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.INNER_LEFT), + VariantsBuilder.of(innerId).x(180).y(90).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.SOUTH) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.INNER_LEFT), + VariantsBuilder.of(innerId).x(180).lockedUV(true) + ) + .variant( + BlockModelDefinitionBuilder.predicate(StairsBlock.FACING, Direction.NORTH) + .set(StairsBlock.HALF, StairHalf.TOP) + .set(StairsBlock.SHAPE, StairShape.INNER_LEFT), + VariantsBuilder.of(innerId).x(180).y(180).lockedUV(true) + ) + ); + + return this; + } + + @Override + public BlockModelTemplates simpleStairs(Block block, NamespacedIdentifier texture) { + return stairs(block, texture, texture, texture); + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/model/ModelGeneratorImpl.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/model/ModelGeneratorImpl.java new file mode 100644 index 00000000..cbc9eea7 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/model/ModelGeneratorImpl.java @@ -0,0 +1,59 @@ +package net.ornithemc.osl.datagen.impl.model; + +import com.google.gson.JsonElement; +import net.minecraft.block.Block; +import net.minecraft.item.ItemLike; +import net.ornithemc.osl.blocks.api.BlockRegistry; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.datagen.api.model.ModelBuilder; +import net.ornithemc.osl.datagen.api.model.ModelGenerator; +import net.ornithemc.osl.datagen.api.model.block.BlockModelDefinitionBuilder; +import net.ornithemc.osl.datagen.api.model.block.BlockModelTemplates; +import net.ornithemc.osl.items.api.ItemRegistry; + +import java.util.function.BiConsumer; + +public class ModelGeneratorImpl implements ModelGenerator { + private final BiConsumer writer; + private final BlockModelTemplates templates; + + public ModelGeneratorImpl(BiConsumer writer) { + this.writer = writer; + this.templates = new BlockModelTemplatesImpl(this); + } + + @Override + public void blockstate(Block block, BlockModelDefinitionBuilder builder) { + NamespacedIdentifier blockId = BlockRegistry.getIdentifier(block); + writer.accept(blockId.prefixed("blockstates/"), builder.build()); + } + + @Override + public void itemModel(ItemLike item, ModelBuilder builder) { + NamespacedIdentifier itemId = ItemRegistry.getIdentifier(item.asItem()); + writer.accept(itemId.prefixed("models/item/"), builder.build()); + } + + @Override + public NamespacedIdentifier blockModel(NamespacedIdentifier identifier, ModelBuilder builder) { + writer.accept(identifier.prefixed("models/block/"), builder.build()); + return identifier.prefixed("block/"); + } + + @Override + public NamespacedIdentifier blockModel(Block block, ModelBuilder builder) { + NamespacedIdentifier blockId = BlockRegistry.getIdentifier(block); + return blockModel(blockId, builder); + } + + @Override + public NamespacedIdentifier blockModel(Block block, String suffix, ModelBuilder builder) { + NamespacedIdentifier blockId = BlockRegistry.getIdentifier(block); + return blockModel(blockId.suffixed(suffix), builder); + } + + @Override + public BlockModelTemplates blockTemplates() { + return templates; + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/wrapper/PackProviderWrapper.java b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/wrapper/PackProviderWrapper.java new file mode 100644 index 00000000..548c94b5 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/java/net/ornithemc/osl/datagen/impl/wrapper/PackProviderWrapper.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.datagen.impl.wrapper; + +import net.minecraft.data.DataProvider; +import net.minecraft.data.HashCache; +import net.ornithemc.osl.datagen.api.provider.PackProvider; + +import java.io.IOException; + +public class PackProviderWrapper implements DataProvider { + private final PackProvider delegate; + + public PackProviderWrapper(PackProvider delegate) { + this.delegate = delegate; + } + + @Override + public void run(HashCache cache) throws IOException { + delegate.provide(cache); + } + + @Override + public String getName() { + return delegate.getProviderName(); + } +} diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json new file mode 100644 index 00000000..3dde67e4 --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/resources/fabric.mod.json @@ -0,0 +1,41 @@ +{ + "schemaVersion": 1, + "id": "osl-data-gen", + "version": "0.1.0-alpha.1+mc18w43a-mc1.14.4", + "environment": "*", + "entrypoints": { + "init": [ + "net.ornithemc.osl.datagen.impl.DataGeneratorInit" + ] + }, + "mixins": [ + "osl.data-gen.mixins.json" + ], + "accessWidener": "osl.data-gen.classtweaker", + "depends": { + "fabricloader": "\u003e\u003d0.18.0", + "minecraft": "\u003e\u003d1.14-alpha.18.43.a \u003c\u003d1.14.4", + "osl-core": "\u003e\u003d0.10.0", + "osl-entrypoints": "\u003e\u003d0.5.0", + "osl-lifecycle-events": "\u003e\u003d0.6.0", + "osl-executors": "\u003e\u003d0.1.0", + "osl-text-components": "\u003e\u003d0.1.0-", + "osl-networking": "\u003e\u003d0.10.0", + "osl-networking-impl": "\u003e\u003d0.2.0", + "osl-registries": "\u003e\u003d0.1.0", + "osl-resource-loader": "\u003e\u003d0.8.0", + "osl-blocks": "\u003e\u003d0.2.0", + "osl-items": "\u003e\u003d0.2.0" + }, + "name": "OSL Data Gen", + "description": "Data Generator api.", + "authors": [ + "OrnitheMC" + ], + "contact": { + "homepage": "https://ornithemc.net/", + "issues": "https://github.com/OrnitheMC/ornithe-standard-libraries/issues", + "sources": "https://github.com/OrnitheMC/ornithe-standard-libraries" + }, + "license": "Apache-2.0" +} \ No newline at end of file diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/resources/osl.data-gen.classtweaker b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/resources/osl.data-gen.classtweaker new file mode 100644 index 00000000..30b3574b --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/resources/osl.data-gen.classtweaker @@ -0,0 +1,14 @@ +classTweaker v1 named + +transitive-accessible method net/minecraft/data/recipe/RecipesProvider m_22877789 (Lnet/minecraft/block/Block;)Lnet/minecraft/advancement/criterion/EnterBlockTrigger$Instance; +transitive-accessible method net/minecraft/data/recipe/RecipesProvider m_87855158 (Lnet/minecraft/advancement/criterion/NumberPredicate$Ints;Lnet/minecraft/item/ItemLike;)Lnet/minecraft/advancement/criterion/InventoryChangedTrigger$Instance; +transitive-accessible method net/minecraft/data/recipe/RecipesProvider m_04657628 (Lnet/minecraft/item/ItemLike;)Lnet/minecraft/advancement/criterion/InventoryChangedTrigger$Instance; +transitive-accessible method net/minecraft/data/recipe/RecipesProvider m_53363402 (Lnet/minecraft/tag/Tag;)Lnet/minecraft/advancement/criterion/InventoryChangedTrigger$Instance; +transitive-accessible field net/minecraft/data/recipe/RecipesProvider generator Lnet/minecraft/data/DataGenerator; + +transitive-inject-interface net/minecraft/data/DataGenerator net/ornithemc/osl/datagen/api/PackGenerator +transitive-inject-interface net/minecraft/data/DataProvider net/ornithemc/osl/datagen/api/provider/PackProvider +transitive-inject-interface net/minecraft/data/HashCache net/ornithemc/osl/datagen/api/PackCache + +accessible method net/minecraft/data/recipe/RecipesProvider save (Lnet/minecraft/data/HashCache;Lcom/google/gson/JsonObject;Ljava/nio/file/Path;)V +accessible method net/minecraft/data/recipe/RecipesProvider saveAdvancement (Lnet/minecraft/data/HashCache;Lcom/google/gson/JsonObject;Ljava/nio/file/Path;)V \ No newline at end of file diff --git a/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/resources/osl.data-gen.mixins.json b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/resources/osl.data-gen.mixins.json new file mode 100644 index 00000000..5cf9acaf --- /dev/null +++ b/libraries/data-gen/data-gen-mc18w43a-mc1.14.4/src/main/resources/osl.data-gen.mixins.json @@ -0,0 +1,21 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "net.ornithemc.osl.datagen.impl.mixin", + "compatibilityLevel": "JAVA_8", + "plugin": "net.ornithemc.osl.datagen.impl.DataGenMixinPlugin", + "mixins": [ + "C_23159014NewMixin", + "C_23159014OldMixin", + "DataGeneratorMixin", + "DataProviderMixin", + "HashCacheMixin" + ], + "client": [ + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + } +} diff --git a/libraries/data-gen/gradle.properties b/libraries/data-gen/gradle.properties new file mode 100644 index 00000000..84a9b26c --- /dev/null +++ b/libraries/data-gen/gradle.properties @@ -0,0 +1,7 @@ +library_id = data-gen +library_name = Data Gen +library_description = Data Generator api. +library_version = 0.1.0-alpha.1 + +entrypoint_init = net.ornithemc.osl.datagen.impl.DataGeneratorInit +osl_dependencies = core:0.8.0,entrypoints:0.5.0,registries:0.1.0,resource-loader:0.8.0,blocks:0.2.0,items:0.2.0 diff --git a/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/DataGeneratorInitializer.java b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/DataGeneratorInitializer.java new file mode 100644 index 00000000..928e8b19 --- /dev/null +++ b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/DataGeneratorInitializer.java @@ -0,0 +1,7 @@ +package net.ornithemc.osl.datagen.api; + +public interface DataGeneratorInitializer { + String KEY = "datagen"; + + void onDatagenInit(ModDataGenerator dataGenerator); +} diff --git a/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/ModDataGenerator.java b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/ModDataGenerator.java new file mode 100644 index 00000000..ce93bf75 --- /dev/null +++ b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/ModDataGenerator.java @@ -0,0 +1,10 @@ +package net.ornithemc.osl.datagen.api; + +import net.fabricmc.loader.api.ModContainer; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; + +public interface ModDataGenerator { + PackGenerator createPack(); + PackGenerator createBuiltinResourcePack(NamespacedIdentifier id); + ModContainer getMod(); +} diff --git a/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/PackCache.java b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/PackCache.java new file mode 100644 index 00000000..ca7f2474 --- /dev/null +++ b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/PackCache.java @@ -0,0 +1,14 @@ +package net.ornithemc.osl.datagen.api; + +import com.google.common.hash.HashFunction; +import com.google.common.hash.Hashing; + +import java.io.IOException; +import java.nio.file.Path; + +public interface PackCache { + HashFunction SHA1 = Hashing.sha1(); + + void checkAndWrite(Path path, byte[] data) throws IOException; + void checkAndWrite(Path path, String data) throws IOException; +} diff --git a/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/PackGenerator.java b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/PackGenerator.java new file mode 100644 index 00000000..52e075f7 --- /dev/null +++ b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/PackGenerator.java @@ -0,0 +1,10 @@ +package net.ornithemc.osl.datagen.api; + +import net.ornithemc.osl.datagen.api.provider.PackProvider; + +import java.nio.file.Path; + +public interface PackGenerator { + void addProvider(PackProvider provider); + Path getOutputPath(); +} diff --git a/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/provider/GsonPackProvider.java b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/provider/GsonPackProvider.java new file mode 100644 index 00000000..0e287a79 --- /dev/null +++ b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/provider/GsonPackProvider.java @@ -0,0 +1,45 @@ +package net.ornithemc.osl.datagen.api.provider; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import net.fabricmc.loader.api.ModContainer; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.datagen.api.PackGenerator; +import net.ornithemc.osl.datagen.api.PackCache; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.function.BiConsumer; + +public abstract class GsonPackProvider implements PackProvider { + private static final Logger LOGGER = LogManager.getLogger(); + private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting().create(); + public final PackGenerator generator; + public final ModContainer mod; + + protected GsonPackProvider(PackGenerator generator, ModContainer mod) { + this.generator = generator; + this.mod = mod; + } + + @Override + public void provide(PackCache cache) { + generate((id, json) -> { + Path path = getPath(id); + + try { + String string = GSON.toJson(json); + cache.checkAndWrite(path, string); + } catch (IOException iOException) { + LOGGER.error("Couldn't save data to {}", path, iOException); + } + }); + } + + protected abstract void generate(BiConsumer consumer); + + protected abstract Path getPath(NamespacedIdentifier id); +} diff --git a/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/provider/PackProvider.java b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/provider/PackProvider.java new file mode 100644 index 00000000..b192a008 --- /dev/null +++ b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/api/provider/PackProvider.java @@ -0,0 +1,10 @@ +package net.ornithemc.osl.datagen.api.provider; + +import net.ornithemc.osl.datagen.api.PackCache; + +import java.io.IOException; + +public interface PackProvider { + String getProviderName(); + void provide(PackCache cache) throws IOException; +} diff --git a/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/impl/DataGenHelperImpl.java b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/impl/DataGenHelperImpl.java new file mode 100644 index 00000000..f6162ee2 --- /dev/null +++ b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/impl/DataGenHelperImpl.java @@ -0,0 +1,31 @@ +package net.ornithemc.osl.datagen.impl; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Objects; + +public class DataGenHelperImpl { + /** + * When enabled the startup will be hijacked to run the data generators and then quit. + */ + public static final boolean ENABLED = System.getProperty("fabric-api.datagen") != null; + + /** + * Sets the output directory for the generated data. + */ + private static final String OUTPUT_DIR = System.getProperty("fabric-api.datagen.output-dir"); + + /** + * When enabled providers can enable extra validation, such as ensuring all registry entries have data generated for them. + */ + public static final boolean STRICT_VALIDATION = System.getProperty("fabric-api.datagen.strict-validation") != null; + + /** + * Filter to a specific mod ID with this property, useful if dependencies also have data generators. + */ + public static final String MOD_ID_FILTER = System.getProperty("fabric-api.datagen.modid"); + + public static Path getOutputDir() { + return Paths.get(Objects.requireNonNull(OUTPUT_DIR, "No output dir provided with the 'fabric-api.datagen.output-dir' property")); + } +} diff --git a/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/impl/provider/MCMetaProvider.java b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/impl/provider/MCMetaProvider.java new file mode 100644 index 00000000..3720449b --- /dev/null +++ b/libraries/data-gen/src/main/java/net/ornithemc/osl/datagen/impl/provider/MCMetaProvider.java @@ -0,0 +1,42 @@ +package net.ornithemc.osl.datagen.impl.provider; + +import net.ornithemc.osl.datagen.api.PackCache; +import net.ornithemc.osl.datagen.api.PackGenerator; +import net.ornithemc.osl.datagen.api.provider.PackProvider; +import net.ornithemc.osl.resource.loader.api.resource.pack.ResourcePackMetadata; +import net.ornithemc.osl.resource.loader.impl.resource.pack.ResourcePacks; +import net.ornithemc.osl.resource.loader.impl.resource.pack.SimpleResourcePackMetadata; +import net.ornithemc.osl.text.api.TextComponents; + +import java.io.IOException; +import java.nio.file.Path; + +public class MCMetaProvider implements PackProvider { + private final PackGenerator generator; + private final String description; + + public MCMetaProvider(PackGenerator generator, String description) { + this.generator = generator; + this.description = description; + } + + private Path getPath() { + return this.generator.getOutputPath().resolve("pack.mcmeta"); + } + + @Override + public String getProviderName() { + return "MCMeta"; + } + + @Override + public void provide(PackCache cache) throws IOException { + ResourcePackMetadata metadata = new SimpleResourcePackMetadata(ResourcePacks.getSupportedFormat(), TextComponents.literal(this.description)); + + Path path = getPath(); + + String json = SimpleResourcePackMetadata.SERIALIZER.serialize(metadata).toString(); + + cache.checkAndWrite(path, json); + } +} diff --git a/libraries/registries/src/main/java/net/ornithemc/osl/registries/api/RegistryEvents.java b/libraries/registries/src/main/java/net/ornithemc/osl/registries/api/RegistryEvents.java index 9d829188..f416acad 100644 --- a/libraries/registries/src/main/java/net/ornithemc/osl/registries/api/RegistryEvents.java +++ b/libraries/registries/src/main/java/net/ornithemc/osl/registries/api/RegistryEvents.java @@ -28,4 +28,6 @@ public final class RegistryEvents { */ public static final Event BOOTSTRAP_REGISTRIES = Event.runnable(); + public static final Event REGISTRIES_FROZEN = Event.runnable(); + } diff --git a/libraries/registries/src/main/java/net/ornithemc/osl/registries/impl/registry/RegistriesImpl.java b/libraries/registries/src/main/java/net/ornithemc/osl/registries/impl/registry/RegistriesImpl.java index 2b823195..b89a33fd 100644 --- a/libraries/registries/src/main/java/net/ornithemc/osl/registries/impl/registry/RegistriesImpl.java +++ b/libraries/registries/src/main/java/net/ornithemc/osl/registries/impl/registry/RegistriesImpl.java @@ -91,6 +91,8 @@ public static void init() { validate(); LOGGER.info("Bootstrapped {} registries.", BOOTSTRAPS.size()); + + RegistryEvents.REGISTRIES_FROZEN.invoker().run(); } private static void bootstrap() { diff --git a/settings.gradle b/settings.gradle index e53df069..ee653dff 100644 --- a/settings.gradle +++ b/settings.gradle @@ -140,3 +140,6 @@ include ':libraries:resource-loader:resource-loader-mc19w07a-mc1.14.4' include ':libraries:text-components' include ':libraries:text-components:text-components-mca1.0.1_01-mc1.6.4' include ':libraries:text-components:text-components-mc13w36a-mc1.14.4' + +include ':libraries:data-gen' +include ':libraries:data-gen:data-gen-mc18w43a-mc1.14.4'