diff --git a/src/main/java/org/betterx/bclib/api/v2/advancement/AdvancementManager.java b/src/main/java/org/betterx/bclib/api/v2/advancement/AdvancementManager.java index d4ca94bb..44f09c76 100644 --- a/src/main/java/org/betterx/bclib/api/v2/advancement/AdvancementManager.java +++ b/src/main/java/org/betterx/bclib/api/v2/advancement/AdvancementManager.java @@ -5,6 +5,7 @@ import org.betterx.bclib.api.v2.levelgen.structures.BCLStructure; import org.betterx.bclib.complexmaterials.WoodenComplexMaterial; import org.betterx.bclib.complexmaterials.set.wood.WoodSlots; import org.betterx.bclib.items.complex.EquipmentSet; +import org.betterx.bclib.items.complex.EquipmentSlot; import net.minecraft.advancements.*; import net.minecraft.advancements.critereon.*; @@ -355,7 +356,7 @@ public class AdvancementManager { // - public Builder addEquipmentSetSlotCriterion(EquipmentSet set, String slot) { + public Builder addEquipmentSetSlotCriterion(EquipmentSet set, EquipmentSlot slot) { return addInventoryChangedCriterion( set.baseName + "_" + slot, set.getSlot(slot) diff --git a/src/main/java/org/betterx/bclib/items/complex/EquipmentDescription.java b/src/main/java/org/betterx/bclib/items/complex/EquipmentDescription.java index 40b6a575..efb23730 100644 --- a/src/main/java/org/betterx/bclib/items/complex/EquipmentDescription.java +++ b/src/main/java/org/betterx/bclib/items/complex/EquipmentDescription.java @@ -12,23 +12,38 @@ import net.minecraft.world.item.*; import net.minecraft.world.level.ItemLike; import java.util.function.Function; +import org.jetbrains.annotations.Nullable; public class EquipmentDescription { private final Function creator; private I item; + public final org.betterx.bclib.items.complex.EquipmentSlot slot; - public EquipmentDescription(Function creator) { + public EquipmentDescription(org.betterx.bclib.items.complex.EquipmentSlot slot, Function creator) { this.creator = creator; + this.slot = slot; } - public void init(ResourceLocation id, ItemRegistry itemsRegistry, Tier material, ItemLike stick) { + public void init( + ResourceLocation id, + ItemRegistry itemsRegistry, + Tier material, + ItemLike stick, + @Nullable EquipmentSet sourceSet + ) { item = creator.apply(material); itemsRegistry.registerTool(id, item); - addRecipe(id, item, material, stick); + addRecipe(id, item, material, stick, sourceSet); } - public void addRecipe(ResourceLocation id, Item tool, Tier material, ItemLike stick) { + public void addRecipe( + ResourceLocation id, + Item tool, + Tier material, + ItemLike stick, + @Nullable EquipmentSet sourceSet + ) { if (material == null) return; var repair = material.getRepairIngredient(); if (repair == null) return; @@ -36,14 +51,25 @@ public class EquipmentDescription { if (repairItems == null || repairItems.length == 0) return; final ItemLike ingot = repairItems[0].getItem(); - var builder = BCLRecipeBuilder.crafting(id, tool) - .addMaterial('#', ingot) - .setCategory(RecipeCategory.TOOLS); + if (material instanceof SmithingSet smit && smit.getSmithingTemplateItem() != null && sourceSet != null) { + var builder = BCLRecipeBuilder + .smithing(id, tool) + .setTemplate(smit.getSmithingTemplateItem()) + .setPrimaryInput(sourceSet.getSlot(this.slot)) + .setAdditionAndUnlock(ingot) + .setCategory(slot.category()); - if (buildRecipe(tool, stick, builder)) return; - builder - .setGroup(id.getPath()) - .build(); + builder.build(); + } else { + var builder = BCLRecipeBuilder.crafting(id, tool) + .addMaterial('#', ingot) + .setCategory(RecipeCategory.TOOLS); + + if (buildRecipe(tool, stick, builder)) return; + builder + .setGroup(id.getPath()) + .build(); + } } diff --git a/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java b/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java index 71eded7e..2a983b88 100644 --- a/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java +++ b/src/main/java/org/betterx/bclib/items/complex/EquipmentSet.java @@ -2,6 +2,7 @@ package org.betterx.bclib.items.complex; import org.betterx.bclib.registry.ItemRegistry; +import net.minecraft.data.recipes.RecipeCategory; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.Item; import net.minecraft.world.item.Tier; @@ -106,11 +107,11 @@ public abstract class EquipmentSet { } public interface ItemDescriptorCreator { - EquipmentDescription build(Item base, Function creator); + EquipmentDescription build(EquipmentSlot slot, Item base, Function creator); } public interface DescriptorCreator { - EquipmentDescription build(Function creator); + EquipmentDescription build(EquipmentSlot slot, Function creator); } public interface ItemCreator { @@ -118,7 +119,7 @@ public abstract class EquipmentSet { } public static class SetValues { - private final Map values; + private final Map values; private SetValues() { values = new HashMap<>(); @@ -135,17 +136,17 @@ public abstract class EquipmentSet { return v; } - public SetValues add(String slot, float value) { + public SetValues add(EquipmentSlot slot, float value) { values.put(slot, value); return this; } - public SetValues offset(String slot, float offset) { + public SetValues offset(EquipmentSlot slot, float offset) { values.put(slot, get(slot) + offset); return this; } - public float get(String slot) { + public float get(EquipmentSlot slot) { return values.getOrDefault(slot, 0.0f); } } @@ -155,31 +156,22 @@ public abstract class EquipmentSet { public final String modID; public final ItemLike stick; - public static final String PICKAXE_SLOT = "pickaxe"; - public static final String AXE_SLOT = "axe"; - public static final String SHOVEL_SLOT = "shovel"; - public static final String SWORD_SLOT = "sword"; - public static final String HOE_SLOT = "hoe"; - public static final String SHEARS_SLOT = "shears"; - public static final String HELMET_SLOT = "helmet"; - public static final String CHESTPLATE_SLOT = "chestplate"; - public static final String LEGGINGS_SLOT = "leggings"; - public static final String BOOTS_SLOT = "boots"; + public static final EquipmentSlot PICKAXE_SLOT = new EquipmentSlot("pickaxe", RecipeCategory.TOOLS); + public static final EquipmentSlot AXE_SLOT = new EquipmentSlot("axe", RecipeCategory.TOOLS); + public static final EquipmentSlot SHOVEL_SLOT = new EquipmentSlot("shovel", RecipeCategory.TOOLS); + public static final EquipmentSlot SWORD_SLOT = new EquipmentSlot("sword", RecipeCategory.COMBAT); + public static final EquipmentSlot HOE_SLOT = new EquipmentSlot("hoe", RecipeCategory.TOOLS); + public static final EquipmentSlot SHEARS_SLOT = new EquipmentSlot("shears", RecipeCategory.TOOLS); + public static final EquipmentSlot HELMET_SLOT = new EquipmentSlot("helmet", RecipeCategory.COMBAT); + public static final EquipmentSlot CHESTPLATE_SLOT = new EquipmentSlot("chestplate", RecipeCategory.COMBAT); + public static final EquipmentSlot LEGGINGS_SLOT = new EquipmentSlot("leggings", RecipeCategory.COMBAT); + public static final EquipmentSlot BOOTS_SLOT = new EquipmentSlot("boots", RecipeCategory.COMBAT); public final SetValues attackDamage; public final SetValues attackSpeed; - private final Map> descriptions = new HashMap<>(); - - @Deprecated(forRemoval = true) - public EquipmentSet( - Tier material, - String modID, - String baseName, - ItemLike stick - ) { - this(material, modID, baseName, stick, AttackDamage.IRON_LEVEL, AttackSpeed.IRON_LEVEL); - } + private final Map> descriptions = new HashMap<>(); + protected final EquipmentSet sourceSet; public EquipmentSet( Tier material, @@ -188,6 +180,18 @@ public abstract class EquipmentSet { ItemLike stick, SetValues attackDamage, SetValues attackSpeed + ) { + this(material, modID, baseName, stick, null, attackDamage, attackSpeed); + } + + public EquipmentSet( + Tier material, + String modID, + String baseName, + ItemLike stick, + EquipmentSet sourceSet, + SetValues attackDamage, + SetValues attackSpeed ) { this.material = material; this.baseName = baseName; @@ -195,27 +199,30 @@ public abstract class EquipmentSet { this.stick = stick; this.attackDamage = attackDamage; this.attackSpeed = attackSpeed; + this.sourceSet = sourceSet; } - protected void add(String slot, EquipmentDescription desc) { + protected void add(EquipmentSlot slot, EquipmentDescription desc) { descriptions.put(slot, desc); } protected void add( - String slot, + EquipmentSlot slot, EquipmentSet baseSet, ItemDescriptorCreator descriptor, ItemCreator item ) { EquipmentDescription desc = descriptor.build( + slot, baseSet.getSlot(slot), (tier) -> item.build(tier, this.attackDamage.get(slot), this.attackSpeed.get(slot)) ); descriptions.put(slot, desc); } - protected void add(String slot, DescriptorCreator descriptor, ItemCreator item) { + protected void add(EquipmentSlot slot, DescriptorCreator descriptor, ItemCreator item) { EquipmentDescription desc = descriptor.build( + slot, (tier) -> item.build(tier, this.attackDamage.get(slot), this.attackSpeed.get(slot)) ); descriptions.put(slot, desc); @@ -225,17 +232,17 @@ public abstract class EquipmentSet { public EquipmentSet init(ItemRegistry itemsRegistry) { for (var desc : descriptions.entrySet()) { desc.getValue() - .init(buildID(desc), itemsRegistry, material, stick); + .init(buildID(desc), itemsRegistry, material, stick, sourceSet); } return this; } @NotNull - protected ResourceLocation buildID(Map.Entry> desc) { - return new ResourceLocation(modID, baseName + "_" + desc.getKey()); + protected ResourceLocation buildID(Map.Entry> desc) { + return new ResourceLocation(modID, baseName + "_" + desc.getKey().name()); } - public I getSlot(String slot) { + public I getSlot(EquipmentSlot slot) { return (I) descriptions.get(slot).getItem(); } } diff --git a/src/main/java/org/betterx/bclib/items/complex/EquipmentSlot.java b/src/main/java/org/betterx/bclib/items/complex/EquipmentSlot.java new file mode 100644 index 00000000..e43b31e6 --- /dev/null +++ b/src/main/java/org/betterx/bclib/items/complex/EquipmentSlot.java @@ -0,0 +1,6 @@ +package org.betterx.bclib.items.complex; + +import net.minecraft.data.recipes.RecipeCategory; + +public record EquipmentSlot(String name, RecipeCategory category) { +} diff --git a/src/main/java/org/betterx/bclib/items/complex/SmithingSet.java b/src/main/java/org/betterx/bclib/items/complex/SmithingSet.java new file mode 100644 index 00000000..629c98f9 --- /dev/null +++ b/src/main/java/org/betterx/bclib/items/complex/SmithingSet.java @@ -0,0 +1,7 @@ +package org.betterx.bclib.items.complex; + +import net.minecraft.world.item.SmithingTemplateItem; + +public interface SmithingSet { + SmithingTemplateItem getSmithingTemplateItem(); +} diff --git a/src/main/java/org/betterx/bclib/recipes/SmithingRecipeBuilder.java b/src/main/java/org/betterx/bclib/recipes/SmithingRecipeBuilder.java index f8b7b7aa..11f0ebd3 100644 --- a/src/main/java/org/betterx/bclib/recipes/SmithingRecipeBuilder.java +++ b/src/main/java/org/betterx/bclib/recipes/SmithingRecipeBuilder.java @@ -57,6 +57,12 @@ public class SmithingRecipeBuilder extends AbstractUnlockableRecipeBuilder ARMOR_AND_TOOLS = List.of( + EMPTY_SLOT_HELMET, + EMPTY_SLOT_SWORD, + EMPTY_SLOT_CHESTPLATE, + EMPTY_SLOT_PICKAXE, + EMPTY_SLOT_LEGGINGS, + EMPTY_SLOT_AXE, + EMPTY_SLOT_BOOTS, + EMPTY_SLOT_HOE, + EMPTY_SLOT_SHOVEL + ); + public static Builder create(ResourceLocation id) { return new Builder(id); } diff --git a/src/main/resources/bclib.accesswidener b/src/main/resources/bclib.accesswidener index 57277b7d..92a0e4f2 100644 --- a/src/main/resources/bclib.accesswidener +++ b/src/main/resources/bclib.accesswidener @@ -34,4 +34,5 @@ accessible method net/minecraft/world/level/block/Blocks never (Lnet/minecraft/w accessible method net/minecraft/world/level/block/Blocks never (Lnet/minecraft/world/level/block/state/BlockState;Lnet/minecraft/world/level/BlockGetter;Lnet/minecraft/core/BlockPos;)Z #Fields -accessible field net/minecraft/world/entity/ai/village/poi/PoiTypes TYPE_BY_STATE Ljava/util/Map; \ No newline at end of file +accessible field net/minecraft/world/entity/ai/village/poi/PoiTypes TYPE_BY_STATE Ljava/util/Map; +accessible field net/minecraft/world/level/block/entity/RandomizableContainerBlockEntity lootTable Lnet/minecraft/resources/ResourceLocation; \ No newline at end of file