Advancement generators

This commit is contained in:
SD 2021-02-17 09:36:09 +05:30
parent eccabf469d
commit ef82c830de
No known key found for this signature in database
GPG key ID: E36B57EE08544BC5
13 changed files with 347 additions and 8 deletions

View file

@ -0,0 +1,61 @@
package org.dimdev.dimdoors.datagen;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import com.google.common.collect.ImmutableList;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import net.minecraft.advancement.Advancement;
import net.minecraft.data.DataCache;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.DataProvider;
import net.minecraft.util.Identifier;
public class AdvancementProvider implements DataProvider {
private static final Logger LOGGER = LogManager.getLogger();
private static final Gson GSON = (new GsonBuilder()).setPrettyPrinting().create();
private final DataGenerator root;
private final List<Consumer<Consumer<Advancement>>> tabGenerators = ImmutableList.of(new AdvancementTab());
public AdvancementProvider(DataGenerator dataGenerator) {
this.root = dataGenerator;
}
private static Path getOutput(Path root, Advancement advancement) {
return root.resolve("data/" + advancement.getId().getNamespace() + "/advancements/" + advancement.getId().getPath() + ".json");
}
@Override
public void run(DataCache dataCache) {
Path outputRoot = this.root.getOutput();
Set<Identifier> ids = new HashSet<>();
Consumer<Advancement> writer = advancement -> {
if (!ids.add(advancement.getId())) {
throw new IllegalStateException("Duplicate advancement " + advancement.getId());
}
Path output = getOutput(outputRoot, advancement);
try {
DataProvider.writeToPath(GSON, dataCache, advancement.createTask().toJson(), output);
} catch (IOException ex) {
LOGGER.error("Couldn't save advancement {}", output, ex);
}
};
for (Consumer<Consumer<Advancement>> generator : this.tabGenerators) {
generator.accept(writer);
}
}
@Override
public String getName() {
return "Dimdoors Advancements";
}
}

View file

@ -0,0 +1,76 @@
package org.dimdev.dimdoors.datagen;
import java.util.function.Consumer;
import org.dimdev.dimdoors.item.ModItems;
import org.dimdev.dimdoors.world.ModDimensions;
import net.minecraft.advancement.Advancement;
import net.minecraft.advancement.AdvancementDisplay;
import net.minecraft.advancement.AdvancementFrame;
import net.minecraft.advancement.criterion.ChangedDimensionCriterion;
import net.minecraft.advancement.criterion.InventoryChangedCriterion;
import net.minecraft.item.ItemConvertible;
import net.minecraft.item.Items;
import net.minecraft.predicate.entity.EntityPredicate;
import net.minecraft.text.TranslatableText;
public class AdvancementTab implements Consumer<Consumer<Advancement>> {
static AdvancementDisplay makeDisplay(ItemConvertible item, String titleKey) {
return new AdvancementDisplay(item.asItem().getDefaultStack(),
new TranslatableText("dimdoors.advancement." + titleKey),
new TranslatableText("dimdoors.advancement." + titleKey + ".desc"),
null,
AdvancementFrame.TASK,
true,
true,
false
);
}
static AdvancementDisplay makeDisplay(ItemConvertible item, String titleKey, AdvancementFrame advancementFrame) {
return new AdvancementDisplay(item.asItem().getDefaultStack(),
new TranslatableText("dimdoors.advancement." + titleKey),
new TranslatableText("dimdoors.advancement." + titleKey + ".desc"),
null,
advancementFrame,
true,
true,
false
);
}
@Override
public void accept(Consumer<Advancement> advancementConsumer) {
Advancement root = Advancement.Task.create()
.display(makeDisplay(ModItems.RIFT_BLADE, "root"))
.criterion("inventory_changed", InventoryChangedCriterion.Conditions.items(Items.ENDER_PEARL))
.build(advancementConsumer, "dimdoors:dimdoors/root");
Advancement.Task.create()
.display(makeDisplay(ModItems.IRON_DIMENSIONAL_DOOR, "public_pocket"))
.criterion("changed_dimension", ChangedDimensionCriterion.Conditions.to(ModDimensions.PUBLIC))
.parent(root)
.build(advancementConsumer, "dimdoors:dimdoors/public_pocket");
Advancement.Task.create()
.display(makeDisplay(ModItems.QUARTZ_DIMENSIONAL_DOOR, "private_pocket"))
.criterion("changed_dimension", ChangedDimensionCriterion.Conditions.to(ModDimensions.PERSONAL))
.parent(root)
.build(advancementConsumer, "dimdoors:dimdoors/private_pocket");
Advancement.Task.create()
.display(makeDisplay(ModItems.GOLD_DIMENSIONAL_DOOR, "dungeon"))
.criterion("changed_dimension", ChangedDimensionCriterion.Conditions.to(ModDimensions.DUNGEON))
.parent(root)
.build(advancementConsumer, "dimdoors:dimdoors/dungeon");
Advancement.Task.create()
.display(makeDisplay(ModItems.UNRAVELLED_FABRIC, "limbo"))
.criterion("changed_dimension", ChangedDimensionCriterion.Conditions.to(ModDimensions.LIMBO))
.parent(root)
.build(advancementConsumer, "dimdoors:dimdoors/limbo");
Advancement.Task.create()
.display(makeDisplay(ModItems.ETERNAL_FLUID_BUCKET, "escape_limbo"))
.criterion("changed_dimension", new ChangedDimensionCriterion.Conditions(EntityPredicate.Extended.EMPTY, ModDimensions.LIMBO, null))
.parent(root)
.build(advancementConsumer, "dimdoors:dimdoors/escape_limbo");
}
}

View file

@ -1,6 +1,5 @@
package org.dimdev.dimdoors.datagen;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Collections;
@ -26,7 +25,8 @@ public class DatagenInitializer implements PreLaunchEntrypoint {
ModBlocks.init();
ModItems.init();
DataGenerator dataGenerator = new DataGenerator(Paths.get("./generated"), Collections.emptyList());
dataGenerator.install(new FabricRecipeHandler(dataGenerator));
dataGenerator.install(new FabricRecipeProvider(dataGenerator));
dataGenerator.install(new AdvancementProvider(dataGenerator));
dataGenerator.install(RECIPE_CONSUMER = new RecipeConsumer(dataGenerator));
dataGenerator.run();
} catch (Exception e) {

View file

@ -17,10 +17,10 @@ import net.minecraft.util.Identifier;
import static org.dimdev.dimdoors.datagen.DatagenInitializer.RECIPE_CONSUMER;
public class FabricRecipeHandler implements DataProvider {
public class FabricRecipeProvider implements DataProvider {
private final DataGenerator dataGenerator;
public FabricRecipeHandler(DataGenerator dataGenerator) {
public FabricRecipeProvider(DataGenerator dataGenerator) {
this.dataGenerator = dataGenerator;
}

View file

@ -29,7 +29,7 @@ public class RecipeConsumer implements DataProvider, Consumer<RecipeJsonProvider
public void run(DataCache cache) throws IOException {
Path path = this.dataGenerator.getOutput();
Set<Identifier> set = Sets.newHashSet();
recipes.forEach((recipeJsonProvider) -> {
this.recipes.forEach((recipeJsonProvider) -> {
if (!set.add(recipeJsonProvider.getRecipeId())) {
throw new IllegalStateException("Duplicate recipe " + recipeJsonProvider.getRecipeId());
} else {
@ -49,6 +49,6 @@ public class RecipeConsumer implements DataProvider, Consumer<RecipeJsonProvider
@Override
public void accept(RecipeJsonProvider recipeJsonProvider) {
recipes.add(recipeJsonProvider);
this.recipes.add(recipeJsonProvider);
}
}

View file

@ -195,5 +195,17 @@
"dimdoors.config.screen.reload": "Reload Config",
"dimdoors.linkProperties.oneWay": "One way: %s",
"dimdoors.linkProperties.linksRemaining": "Remaining links: %s",
"dimdoors.color": "Color: "
"dimdoors.color": "Color: ",
"dimdoors.advancement.root": "Dimensional Doors",
"dimdoors.advancement.root.desc": "Venture into the depths",
"dimdoors.advancement.public_pocket": "Public Pockets",
"dimdoors.advancement.public_pocket.desc": "Enter a public pocket",
"dimdoors.advancement.private_pocket": "Private Pockets",
"dimdoors.advancement.private_pocket.desc": "Enter a private pocket",
"dimdoors.advancement.dungeon": "Dungeons",
"dimdoors.advancement.dungeon.desc": "Enter a dungeon",
"dimdoors.advancement.limbo": "Decay",
"dimdoors.advancement.limbo.desc": "Enter limbo",
"dimdoors.advancement.escape_limbo": "Escape",
"dimdoors.advancement.escape_limbo.desc": "Escape limbo"
}

View file

@ -44,4 +44,4 @@
"item.unstable_dimensional_door.info": "Attenziione: Porta a una destinazione casuale",
"item.oak_dimensional_door.info": "Piazzalo sul blocco sotto una \\nfrattura per creare un portale, \\no piazzalo da qualunque altra parte \\nin una dimensione tascabile per uscire.",
"entity.dimdoors.monolith": "Monolito"
}
}

View file

@ -0,0 +1,31 @@
{
"parent": "dimdoors:dimdoors/root",
"display": {
"icon": {
"item": "dimdoors:gold_dimensional_door"
},
"title": {
"translate": "dimdoors.advancement.dungeon"
},
"description": {
"translate": "dimdoors.advancement.dungeon.desc"
},
"frame": "task",
"show_toast": true,
"announce_to_chat": true,
"hidden": false
},
"criteria": {
"changed_dimension": {
"trigger": "minecraft:changed_dimension",
"conditions": {
"to": "dimdoors:dungeon_pockets"
}
}
},
"requirements": [
[
"changed_dimension"
]
]
}

View file

@ -0,0 +1,31 @@
{
"parent": "dimdoors:dimdoors/root",
"display": {
"icon": {
"item": "dimdoors:eternal_fluid_bucket"
},
"title": {
"translate": "dimdoors.advancement.escape_limbo"
},
"description": {
"translate": "dimdoors.advancement.escape_limbo.desc"
},
"frame": "task",
"show_toast": true,
"announce_to_chat": true,
"hidden": false
},
"criteria": {
"changed_dimension": {
"trigger": "minecraft:changed_dimension",
"conditions": {
"from": "dimdoors:limbo"
}
}
},
"requirements": [
[
"changed_dimension"
]
]
}

View file

@ -0,0 +1,31 @@
{
"parent": "dimdoors:dimdoors/root",
"display": {
"icon": {
"item": "dimdoors:unravelled_fabric"
},
"title": {
"translate": "dimdoors.advancement.limbo"
},
"description": {
"translate": "dimdoors.advancement.limbo.desc"
},
"frame": "task",
"show_toast": true,
"announce_to_chat": true,
"hidden": false
},
"criteria": {
"changed_dimension": {
"trigger": "minecraft:changed_dimension",
"conditions": {
"to": "dimdoors:limbo"
}
}
},
"requirements": [
[
"changed_dimension"
]
]
}

View file

@ -0,0 +1,31 @@
{
"parent": "dimdoors:dimdoors/root",
"display": {
"icon": {
"item": "dimdoors:quartz_dimensional_door"
},
"title": {
"translate": "dimdoors.advancement.private_pocket"
},
"description": {
"translate": "dimdoors.advancement.private_pocket.desc"
},
"frame": "task",
"show_toast": true,
"announce_to_chat": true,
"hidden": false
},
"criteria": {
"changed_dimension": {
"trigger": "minecraft:changed_dimension",
"conditions": {
"to": "dimdoors:personal_pockets"
}
}
},
"requirements": [
[
"changed_dimension"
]
]
}

View file

@ -0,0 +1,31 @@
{
"parent": "dimdoors:dimdoors/root",
"display": {
"icon": {
"item": "dimdoors:iron_dimensional_door"
},
"title": {
"translate": "dimdoors.advancement.public_pocket"
},
"description": {
"translate": "dimdoors.advancement.public_pocket.desc"
},
"frame": "task",
"show_toast": true,
"announce_to_chat": true,
"hidden": false
},
"criteria": {
"changed_dimension": {
"trigger": "minecraft:changed_dimension",
"conditions": {
"to": "dimdoors:public_pockets"
}
}
},
"requirements": [
[
"changed_dimension"
]
]
}

View file

@ -0,0 +1,35 @@
{
"display": {
"icon": {
"item": "dimdoors:rift_blade",
"nbt": "{Damage:0}"
},
"title": {
"translate": "dimdoors.advancement.root"
},
"description": {
"translate": "dimdoors.advancement.root.desc"
},
"frame": "task",
"show_toast": true,
"announce_to_chat": true,
"hidden": false
},
"criteria": {
"inventory_changed": {
"trigger": "minecraft:inventory_changed",
"conditions": {
"items": [
{
"item": "minecraft:ender_pearl"
}
]
}
}
},
"requirements": [
[
"inventory_changed"
]
]
}