Enhancements for Advancement API
This commit is contained in:
parent
165ac1ca27
commit
7fef0a090c
2 changed files with 100 additions and 20 deletions
|
@ -1,11 +1,19 @@
|
||||||
package org.betterx.bclib.api.v2.advancement;
|
package org.betterx.bclib.api.v2.advancement;
|
||||||
|
|
||||||
|
import org.betterx.bclib.BCLib;
|
||||||
|
import org.betterx.bclib.api.v2.levelgen.structures.BCLStructure;
|
||||||
|
import org.betterx.bclib.complexmaterials.WoodenComplexMaterial;
|
||||||
|
import org.betterx.bclib.items.complex.EquipmentSet;
|
||||||
|
|
||||||
import net.minecraft.advancements.*;
|
import net.minecraft.advancements.*;
|
||||||
import net.minecraft.advancements.critereon.InventoryChangeTrigger;
|
import net.minecraft.advancements.critereon.InventoryChangeTrigger;
|
||||||
|
import net.minecraft.advancements.critereon.LocationPredicate;
|
||||||
|
import net.minecraft.advancements.critereon.PlayerTrigger;
|
||||||
import net.minecraft.advancements.critereon.RecipeUnlockedTrigger;
|
import net.minecraft.advancements.critereon.RecipeUnlockedTrigger;
|
||||||
import net.minecraft.core.Registry;
|
import net.minecraft.core.Registry;
|
||||||
import net.minecraft.data.recipes.RecipeBuilder;
|
import net.minecraft.data.recipes.RecipeBuilder;
|
||||||
import net.minecraft.network.chat.Component;
|
import net.minecraft.network.chat.Component;
|
||||||
|
import net.minecraft.resources.ResourceKey;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
import net.minecraft.world.Container;
|
import net.minecraft.world.Container;
|
||||||
import net.minecraft.world.item.Item;
|
import net.minecraft.world.item.Item;
|
||||||
|
@ -13,8 +21,14 @@ import net.minecraft.world.item.ItemStack;
|
||||||
import net.minecraft.world.item.Items;
|
import net.minecraft.world.item.Items;
|
||||||
import net.minecraft.world.item.crafting.Recipe;
|
import net.minecraft.world.item.crafting.Recipe;
|
||||||
import net.minecraft.world.level.ItemLike;
|
import net.minecraft.world.level.ItemLike;
|
||||||
|
import net.minecraft.world.level.biome.Biome;
|
||||||
|
import net.minecraft.world.level.levelgen.structure.Structure;
|
||||||
|
|
||||||
|
import com.google.gson.Gson;
|
||||||
|
import com.google.gson.GsonBuilder;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
|
@ -110,31 +124,31 @@ public class AdvancementManager {
|
||||||
return new Builder(id, type);
|
return new Builder(id, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Builder create(Item item) {
|
public static Builder create(Item icon) {
|
||||||
return create(item, AdvancementType.REGULAR);
|
return create(icon, AdvancementType.REGULAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Builder create(ItemStack item) {
|
public static Builder create(ItemStack icon) {
|
||||||
return create(item, AdvancementType.REGULAR);
|
return create(icon, AdvancementType.REGULAR);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Builder create(ItemLike item, AdvancementType type) {
|
public static Builder create(ItemLike icon, AdvancementType type) {
|
||||||
return create(new ItemStack(item), type);
|
return create(new ItemStack(icon), type);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Builder create(ItemStack item, AdvancementType type) {
|
public static Builder create(ItemStack icon, AdvancementType type) {
|
||||||
return create(item, type, (displayBuilder) -> {
|
return create(icon, type, (displayBuilder) -> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Builder create(Item item, AdvancementType type, Consumer<DisplayBuilder> displayAdapter) {
|
public static Builder create(Item icon, AdvancementType type, Consumer<DisplayBuilder> displayAdapter) {
|
||||||
return create(new ItemStack(item), type, displayAdapter);
|
return create(new ItemStack(icon), type, displayAdapter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Builder create(ItemStack item, AdvancementType type, Consumer<DisplayBuilder> displayAdapter) {
|
public static Builder create(ItemStack icon, AdvancementType type, Consumer<DisplayBuilder> displayAdapter) {
|
||||||
var id = Registry.ITEM.getKey(item.getItem());
|
var id = Registry.ITEM.getKey(icon.getItem());
|
||||||
boolean canBuild = true;
|
boolean canBuild = true;
|
||||||
if (id == null || item.is(Items.AIR)) {
|
if (id == null || icon.is(Items.AIR)) {
|
||||||
canBuild = false;
|
canBuild = false;
|
||||||
id = Registry.ITEM.getDefaultKey();
|
id = Registry.ITEM.getDefaultKey();
|
||||||
}
|
}
|
||||||
|
@ -142,7 +156,7 @@ public class AdvancementManager {
|
||||||
String baseName = "advancements." + id.getNamespace() + "." + id.getPath() + ".";
|
String baseName = "advancements." + id.getNamespace() + "." + id.getPath() + ".";
|
||||||
Builder b = new Builder(id, type);
|
Builder b = new Builder(id, type);
|
||||||
var displayBuilder = b.startDisplay(
|
var displayBuilder = b.startDisplay(
|
||||||
item,
|
icon,
|
||||||
Component.translatable(baseName + "title"),
|
Component.translatable(baseName + "title"),
|
||||||
Component.translatable(baseName + "description")
|
Component.translatable(baseName + "description")
|
||||||
);
|
);
|
||||||
|
@ -172,7 +186,7 @@ public class AdvancementManager {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DisplayBuilder startDisplay(Item icon) {
|
public DisplayBuilder startDisplay(ItemLike icon) {
|
||||||
String baseName = "advancements." + id.getNamespace() + "." + id.getPath() + ".";
|
String baseName = "advancements." + id.getNamespace() + "." + id.getPath() + ".";
|
||||||
return startDisplay(
|
return startDisplay(
|
||||||
icon,
|
icon,
|
||||||
|
@ -230,6 +244,10 @@ public class AdvancementManager {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder rewardXP(int xp) {
|
||||||
|
return rewards(AdvancementRewards.Builder.experience(500).build());
|
||||||
|
}
|
||||||
|
|
||||||
public Builder addCriterion(String string, CriterionTriggerInstance criterionTriggerInstance) {
|
public Builder addCriterion(String string, CriterionTriggerInstance criterionTriggerInstance) {
|
||||||
builder.addCriterion(string, new Criterion(criterionTriggerInstance));
|
builder.addCriterion(string, new Criterion(criterionTriggerInstance));
|
||||||
return this;
|
return this;
|
||||||
|
@ -240,6 +258,21 @@ public class AdvancementManager {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder addAtStructureCriterion(String name, BCLStructure<?> structure) {
|
||||||
|
return addAtStructureCriterion(name, structure.structureKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder addAtStructureCriterion(String name, ResourceKey<Structure> structure) {
|
||||||
|
return addCriterion(
|
||||||
|
name,
|
||||||
|
PlayerTrigger
|
||||||
|
.TriggerInstance
|
||||||
|
.located(
|
||||||
|
LocationPredicate.inStructure(structure)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public <C extends Container, T extends Recipe<C>> Builder addRecipeUnlockCriterion(String name, T recipe) {
|
public <C extends Container, T extends Recipe<C>> Builder addRecipeUnlockCriterion(String name, T recipe) {
|
||||||
return addCriterion(
|
return addCriterion(
|
||||||
name,
|
name,
|
||||||
|
@ -258,6 +291,47 @@ public class AdvancementManager {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder addEquipmentSetSlotCriterion(EquipmentSet set, String slot) {
|
||||||
|
return addInventoryChangedCriterion(
|
||||||
|
set.baseName + "_" + slot,
|
||||||
|
set.getSlot(slot)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder addArmorSetCriterion(EquipmentSet set) {
|
||||||
|
return addEquipmentSetSlotCriterion(set, EquipmentSet.HELMET_SLOT)
|
||||||
|
.addEquipmentSetSlotCriterion(set, EquipmentSet.CHESTPLATE_SLOT)
|
||||||
|
.addEquipmentSetSlotCriterion(set, EquipmentSet.LEGGINGS_SLOT)
|
||||||
|
.addEquipmentSetSlotCriterion(set, EquipmentSet.BOOTS_SLOT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder addToolSetCriterion(EquipmentSet set) {
|
||||||
|
return addEquipmentSetSlotCriterion(set, EquipmentSet.PICKAXE_SLOT)
|
||||||
|
.addEquipmentSetSlotCriterion(set, EquipmentSet.AXE_SLOT)
|
||||||
|
.addEquipmentSetSlotCriterion(set, EquipmentSet.SHOVEL_SLOT)
|
||||||
|
.addEquipmentSetSlotCriterion(set, EquipmentSet.SWORD_SLOT)
|
||||||
|
.addEquipmentSetSlotCriterion(set, EquipmentSet.HOE_SLOT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder addWoodCriterion(WoodenComplexMaterial mat) {
|
||||||
|
return addInventoryChangedCriterion(
|
||||||
|
mat.getBaseName(),
|
||||||
|
mat.getBlock(WoodenComplexMaterial.BLOCK_LOG),
|
||||||
|
mat.getBlock(WoodenComplexMaterial.BLOCK_BARK),
|
||||||
|
mat.getBlock(WoodenComplexMaterial.BLOCK_PLANKS)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Builder addVisitBiomesCriterion(List<ResourceKey<Biome>> list) {
|
||||||
|
for (ResourceKey<Biome> resourceKey : list) {
|
||||||
|
addCriterion(
|
||||||
|
resourceKey.location().toString(),
|
||||||
|
PlayerTrigger.TriggerInstance.located(LocationPredicate.inBiome(resourceKey))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public Builder requirements(RequirementsStrategy requirementsStrategy) {
|
public Builder requirements(RequirementsStrategy requirementsStrategy) {
|
||||||
builder.requirements(requirementsStrategy);
|
builder.requirements(requirementsStrategy);
|
||||||
return this;
|
return this;
|
||||||
|
@ -268,6 +342,12 @@ public class AdvancementManager {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Builder printDebugJson() {
|
||||||
|
Gson gson = new GsonBuilder().setPrettyPrinting().create();
|
||||||
|
BCLib.LOGGER.info(gson.toJson(builder.serializeToJson()));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public ResourceLocation buildAndRegister() {
|
public ResourceLocation buildAndRegister() {
|
||||||
AdvancementManager.register(id, this.builder);
|
AdvancementManager.register(id, this.builder);
|
||||||
return this.id;
|
return this.id;
|
||||||
|
|
|
@ -13,7 +13,7 @@ import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public abstract class EquipmentSet {
|
public abstract class EquipmentSet {
|
||||||
public final Tier material;
|
public final Tier material;
|
||||||
public final String prefix;
|
public final String baseName;
|
||||||
public final String modID;
|
public final String modID;
|
||||||
public final ItemLike stick;
|
public final ItemLike stick;
|
||||||
|
|
||||||
|
@ -25,14 +25,14 @@ public abstract class EquipmentSet {
|
||||||
public static final String SHEARS_SLOT = "shears";
|
public static final String SHEARS_SLOT = "shears";
|
||||||
public static final String HELMET_SLOT = "helmet";
|
public static final String HELMET_SLOT = "helmet";
|
||||||
public static final String CHESTPLATE_SLOT = "chestplate";
|
public static final String CHESTPLATE_SLOT = "chestplate";
|
||||||
public static final String LEGGINS_SLOT = "leggings";
|
public static final String LEGGINGS_SLOT = "leggings";
|
||||||
public static final String BOOTS_SLOT = "boots";
|
public static final String BOOTS_SLOT = "boots";
|
||||||
|
|
||||||
private final Map<String, EquipmentDescription<?>> descriptions = new HashMap<>();
|
private final Map<String, EquipmentDescription<?>> descriptions = new HashMap<>();
|
||||||
|
|
||||||
public EquipmentSet(Tier material, String modID, String prefix, ItemLike stick) {
|
public EquipmentSet(Tier material, String modID, String baseName, ItemLike stick) {
|
||||||
this.material = material;
|
this.material = material;
|
||||||
this.prefix = prefix;
|
this.baseName = baseName;
|
||||||
this.modID = modID;
|
this.modID = modID;
|
||||||
this.stick = stick;
|
this.stick = stick;
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,7 @@ public abstract class EquipmentSet {
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
protected ResourceLocation buildID(Map.Entry<String, EquipmentDescription<?>> desc) {
|
protected ResourceLocation buildID(Map.Entry<String, EquipmentDescription<?>> desc) {
|
||||||
return new ResourceLocation(modID, prefix + "_" + desc.getKey());
|
return new ResourceLocation(modID, baseName + "_" + desc.getKey());
|
||||||
}
|
}
|
||||||
|
|
||||||
public <I extends Item> I getSlot(String slot) {
|
public <I extends Item> I getSlot(String slot) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue