From f881e36e9edef73e3097f5173304c0828eb35789 Mon Sep 17 00:00:00 2001 From: DaFuqs Date: Wed, 24 Jul 2024 19:38:51 +0200 Subject: [PATCH 1/5] added ShapedGatedCraftingRecipe & ShapelessGatedCraftingEMIRecipe Improved recipe code. Still missing: EMI & REI --- .../api/recipe/DescriptiveGatedRecipe.java | 3 +- .../spectrum/api/recipe/GatedRecipe.java | 32 +++++--- .../spectrum/commands/SanityCommand.java | 13 ++-- .../compat/REI/REIClientIntegration.java | 6 +- .../compat/emi/GatedSpectrumEmiRecipe.java | 2 +- .../compat/emi/SpectrumEmiPlugin.java | 8 ++ .../emi/recipes/EnchanterEmiRecipeGated.java | 6 +- .../recipes/ShapedGatedCraftingEMIRecipe.java | 54 +++++++++++++ .../ShapelessGatedCraftingEMIRecipe.java | 33 ++++++++ .../BookFluidConvertingPageRenderer.java | 20 ++--- .../pages/BookGatedRecipePageRenderer.java | 14 ++-- .../pages/BookGatedRecipePage.java | 10 +-- .../ShapelessRecipeSerializerAccessor.java | 17 ++++ .../spectrum/recipe/GatedSpectrumRecipe.java | 24 +----- .../recipe/GatedStackSpectrumRecipe.java | 2 +- .../anvil_crushing/AnvilCrushingRecipe.java | 2 +- .../cinderhearth/CinderhearthRecipe.java | 2 +- .../crafting/ShapedGatedCraftingRecipe.java | 44 +++++++++++ .../ShapedGatedCraftingRecipeSerializer.java | 77 +++++++++++++++++++ .../ShapelessGatedCraftingRecipe.java | 44 +++++++++++ ...hapelessGatedCraftingRecipeSerializer.java | 73 ++++++++++++++++++ .../ClearCraftingTabletRecipe.java | 4 +- .../{ => dynamic}/ClearEnderSpliceRecipe.java | 4 +- .../{ => dynamic}/ClearInkRecipe.java | 2 +- .../ClearPotionFillableRecipe.java | 2 +- .../ColorEverpromiseRibbonRecipe.java | 2 +- .../{ => dynamic}/RepairAnythingRecipe.java | 2 +- .../SingleItemCraftingRecipe.java | 6 +- .../{ => dynamic}/WrapPresentRecipe.java | 2 +- .../crystallarieum/CrystallarieumRecipe.java | 2 +- .../recipe/enchanter/EnchanterRecipe.java | 2 +- .../EnchantmentUpgradeRecipe.java | 2 +- .../FluidConvertingRecipe.java | 2 +- .../fusion_shrine/FusionShrineRecipe.java | 2 +- .../ink_converting/InkConvertingRecipe.java | 2 +- .../recipe/pedestal/PedestalRecipe.java | 2 +- .../PotionWorkshopReactingRecipe.java | 2 +- .../potion_workshop/PotionWorkshopRecipe.java | 2 +- .../PrimordialFireBurningRecipe.java | 2 +- .../SpiritInstillerRecipe.java | 2 +- .../ITitrationBarrelRecipe.java | 2 +- .../TitrationBarrelRecipe.java | 2 +- .../SpectrumCustomRecipeSerializers.java | 2 +- .../registries/SpectrumRecipeTypes.java | 11 ++- .../crafting_table/glistering_melon.json | 2 +- .../recipes/crafting_table/mushroom_stew.json | 2 +- src/main/resources/spectrum.mixins.json | 1 + 47 files changed, 452 insertions(+), 102 deletions(-) create mode 100644 src/main/java/de/dafuqs/spectrum/compat/emi/recipes/ShapedGatedCraftingEMIRecipe.java create mode 100644 src/main/java/de/dafuqs/spectrum/compat/emi/recipes/ShapelessGatedCraftingEMIRecipe.java create mode 100644 src/main/java/de/dafuqs/spectrum/mixin/accessors/ShapelessRecipeSerializerAccessor.java create mode 100644 src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapedGatedCraftingRecipe.java create mode 100644 src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapedGatedCraftingRecipeSerializer.java create mode 100644 src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapelessGatedCraftingRecipe.java create mode 100644 src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapelessGatedCraftingRecipeSerializer.java rename src/main/java/de/dafuqs/spectrum/recipe/crafting/{ => dynamic}/ClearCraftingTabletRecipe.java (89%) rename src/main/java/de/dafuqs/spectrum/recipe/crafting/{ => dynamic}/ClearEnderSpliceRecipe.java (90%) rename src/main/java/de/dafuqs/spectrum/recipe/crafting/{ => dynamic}/ClearInkRecipe.java (94%) rename src/main/java/de/dafuqs/spectrum/recipe/crafting/{ => dynamic}/ClearPotionFillableRecipe.java (95%) rename src/main/java/de/dafuqs/spectrum/recipe/crafting/{ => dynamic}/ColorEverpromiseRibbonRecipe.java (98%) rename src/main/java/de/dafuqs/spectrum/recipe/crafting/{ => dynamic}/RepairAnythingRecipe.java (97%) rename src/main/java/de/dafuqs/spectrum/recipe/crafting/{ => dynamic}/SingleItemCraftingRecipe.java (90%) rename src/main/java/de/dafuqs/spectrum/recipe/crafting/{ => dynamic}/WrapPresentRecipe.java (98%) diff --git a/src/main/java/de/dafuqs/spectrum/api/recipe/DescriptiveGatedRecipe.java b/src/main/java/de/dafuqs/spectrum/api/recipe/DescriptiveGatedRecipe.java index 7ad3b65a27..7db8c1c522 100644 --- a/src/main/java/de/dafuqs/spectrum/api/recipe/DescriptiveGatedRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/api/recipe/DescriptiveGatedRecipe.java @@ -1,9 +1,10 @@ package de.dafuqs.spectrum.api.recipe; +import net.minecraft.inventory.*; import net.minecraft.item.*; import net.minecraft.text.*; -public interface DescriptiveGatedRecipe extends GatedRecipe { +public interface DescriptiveGatedRecipe extends GatedRecipe { Text getDescription(); diff --git a/src/main/java/de/dafuqs/spectrum/api/recipe/GatedRecipe.java b/src/main/java/de/dafuqs/spectrum/api/recipe/GatedRecipe.java index e4dd5c2323..b9ed21dce4 100644 --- a/src/main/java/de/dafuqs/spectrum/api/recipe/GatedRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/api/recipe/GatedRecipe.java @@ -1,5 +1,6 @@ package de.dafuqs.spectrum.api.recipe; +import de.dafuqs.revelationary.api.advancements.*; import de.dafuqs.spectrum.progression.*; import net.fabricmc.api.*; import net.fabricmc.loader.api.*; @@ -10,28 +11,35 @@ import net.minecraft.util.*; import org.jetbrains.annotations.*; -public interface GatedRecipe extends Recipe { - - boolean canPlayerCraft(PlayerEntity playerEntity); +public interface GatedRecipe extends Recipe { boolean isSecret(); - Identifier getRequiredAdvancementIdentifier(); - Identifier getRecipeTypeUnlockIdentifier(); - - Text getSingleUnlockToastString(); - - Text getMultipleUnlockToastString(); - - default void registerInToastManager(RecipeType recipeType, GatedRecipe gatedRecipe) { + + String getRecipeTypeShortID(); + + default boolean canPlayerCraft(PlayerEntity playerEntity) { + return AdvancementHelper.hasAdvancement(playerEntity, getRecipeTypeUnlockIdentifier()) + && AdvancementHelper.hasAdvancement(playerEntity, getRequiredAdvancementIdentifier()); + } + + default Text getSingleUnlockToastString() { + return Text.translatable("spectrum.toast." + getRecipeTypeShortID() + "_recipe_unlocked.title"); + } + + default Text getMultipleUnlockToastString() { + return Text.translatable("spectrum.toast." + getRecipeTypeShortID() + "_recipes_unlocked.title"); + } + + default void registerInToastManager(RecipeType recipeType, GatedRecipe gatedRecipe) { if (FabricLoader.getInstance().getEnvironmentType() != EnvType.SERVER) { registerInToastManagerClient(recipeType, gatedRecipe); } } @Environment(EnvType.CLIENT) - private void registerInToastManagerClient(RecipeType recipeType, GatedRecipe gatedRecipe) { + private void registerInToastManagerClient(RecipeType recipeType, GatedRecipe gatedRecipe) { UnlockToastManager.registerGatedRecipe(recipeType, gatedRecipe); } diff --git a/src/main/java/de/dafuqs/spectrum/commands/SanityCommand.java b/src/main/java/de/dafuqs/spectrum/commands/SanityCommand.java index c882d3738d..d339fb136c 100644 --- a/src/main/java/de/dafuqs/spectrum/commands/SanityCommand.java +++ b/src/main/java/de/dafuqs/spectrum/commands/SanityCommand.java @@ -24,6 +24,7 @@ import net.minecraft.advancement.criterion.*; import net.minecraft.block.*; import net.minecraft.enchantment.*; +import net.minecraft.inventory.*; import net.minecraft.item.*; import net.minecraft.loot.*; import net.minecraft.recipe.*; @@ -174,7 +175,7 @@ private static int execute(ServerCommandSource source, String modId) { recipeManager.keys().forEach(identifier -> { Optional> recipe = recipeManager.get(identifier); if (recipe.isPresent()) { - if (recipe.get() instanceof GatedSpectrumRecipe gatedSpectrumRecipe) { + if (recipe.get() instanceof GatedSpectrumRecipe gatedSpectrumRecipe) { String group = gatedSpectrumRecipe.getGroup(); if (group == null) { SpectrumCommon.logWarning("Recipe with null group found! :" + gatedSpectrumRecipe.getId()); @@ -424,17 +425,17 @@ private static int execute(ServerCommandSource source, String modId) { return 0; } - private static void testRecipeUnlocks(RecipeType recipeType, String name, RecipeManager recipeManager, ServerAdvancementLoader advancementLoader) { - for (GatedRecipe recipe : recipeManager.listAllOfType(recipeType)) { + private static , C extends Inventory> void testRecipeUnlocks(RecipeType recipeType, String name, RecipeManager recipeManager, ServerAdvancementLoader advancementLoader) { + for (GatedRecipe recipe : recipeManager.listAllOfType(recipeType)) { Identifier advancementIdentifier = recipe.getRequiredAdvancementIdentifier(); if (advancementIdentifier != null && advancementLoader.get(advancementIdentifier) == null) { SpectrumCommon.logWarning("[SANITY: " + name + " Recipe Unlocks] Advancement '" + recipe.getRequiredAdvancementIdentifier() + "' in recipe '" + recipe.getId() + "' does not exist"); } } } - - private static void testIngredientsAndOutputInColorRegistry(RecipeType recipeType, String name, RecipeManager recipeManager, DynamicRegistryManager registryManager) { - for (GatedRecipe recipe : recipeManager.listAllOfType(recipeType)) { + + private static , C extends Inventory> void testIngredientsAndOutputInColorRegistry(RecipeType recipeType, String name, RecipeManager recipeManager, DynamicRegistryManager registryManager) { + for (GatedRecipe recipe : recipeManager.listAllOfType(recipeType)) { for (Ingredient inputIngredient : recipe.getIngredients()) { for (ItemStack matchingItemStack : inputIngredient.getMatchingStacks()) { if (ColorRegistry.ITEM_COLORS.getMapping(matchingItemStack.getItem()).isEmpty()) { diff --git a/src/main/java/de/dafuqs/spectrum/compat/REI/REIClientIntegration.java b/src/main/java/de/dafuqs/spectrum/compat/REI/REIClientIntegration.java index 27d7632289..6e3e551776 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/REI/REIClientIntegration.java +++ b/src/main/java/de/dafuqs/spectrum/compat/REI/REIClientIntegration.java @@ -66,8 +66,7 @@ public void registerCategories(CategoryRegistry registry) { registry.add(new CinderhearthCategory()); registry.add(new TitrationBarrelCategory()); registry.add(new PrimordialFireBurningCategory()); - - + EntryIngredient pedestals = EntryIngredient.of( EntryStacks.of(SpectrumBlocks.PEDESTAL_BASIC_TOPAZ), EntryStacks.of(SpectrumBlocks.PEDESTAL_BASIC_AMETHYST), @@ -82,6 +81,7 @@ public void registerCategories(CategoryRegistry registry) { } registry.addWorkstations(BuiltinPlugin.CRAFTING, EntryStacks.of(SpectrumItems.CRAFTING_TABLET)); + registry.addWorkstations(BuiltinPlugin.CRAFTING, EntryStacks.of(SpectrumBlocks.RESTOCKING_CHEST)); registry.addWorkstations(BuiltinPlugin.BLASTING, EntryStacks.of(SpectrumBlocks.CINDERHEARTH)); registry.addWorkstations(SpectrumPlugins.ANVIL_CRUSHING, EntryStacks.of(Blocks.ANVIL), EntryStacks.of(SpectrumBlocks.BEDROCK_ANVIL), EntryStacks.of(SpectrumBlocks.STRATINE_FRAGMENT_BLOCK), EntryStacks.of(SpectrumBlocks.PALTAERIA_FRAGMENT_BLOCK)); @@ -126,7 +126,7 @@ public void registerDisplays(DisplayRegistry registry) { registry.registerRecipeFiller(CinderhearthRecipe.class, SpectrumRecipeTypes.CINDERHEARTH, CinderhearthDisplay::new); registry.registerRecipeFiller(ITitrationBarrelRecipe.class, SpectrumRecipeTypes.TITRATION_BARREL, TitrationBarrelDisplay::new); registry.registerRecipeFiller(PrimordialFireBurningRecipe.class, SpectrumRecipeTypes.PRIMORDIAL_FIRE_BURNING, PrimordialFireBurningDisplay::new); - + NaturesStaffConversionDataLoader.CONVERSIONS.forEach((key, value) -> registry.add(new NaturesStaffConversionsDisplay(EntryStacks.of(key), EntryStacks.of(value.getBlock()), NaturesStaffConversionDataLoader.UNLOCK_IDENTIFIERS.getOrDefault(key, null)))); FreezingIdolBlock.FREEZING_STATE_MAP.forEach((key, value) -> registry.add(new FreezingDisplay(BlockToBlockWithChanceDisplay.blockToEntryStack(key.getBlock()), BlockToBlockWithChanceDisplay.blockToEntryStack(value.getLeft().getBlock()), value.getRight()))); FreezingIdolBlock.FREEZING_MAP.forEach((key, value) -> registry.add(new FreezingDisplay(BlockToBlockWithChanceDisplay.blockToEntryStack(key), BlockToBlockWithChanceDisplay.blockToEntryStack(value.getLeft().getBlock()), value.getRight()))); diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/GatedSpectrumEmiRecipe.java b/src/main/java/de/dafuqs/spectrum/compat/emi/GatedSpectrumEmiRecipe.java index 36dbf8b974..db9dc1365a 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/GatedSpectrumEmiRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/GatedSpectrumEmiRecipe.java @@ -9,7 +9,7 @@ import java.util.*; -public abstract class GatedSpectrumEmiRecipe extends SpectrumEmiRecipe { +public abstract class GatedSpectrumEmiRecipe> extends SpectrumEmiRecipe { public static final Text SECRET = Text.translatable("container.spectrum.rei.pedestal_crafting.secret_recipe"); public static final Text SECRET_HINT = Text.translatable("container.spectrum.rei.pedestal_crafting.secret_recipe.hint"); diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiPlugin.java b/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiPlugin.java index d37343385a..f04518a086 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiPlugin.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/SpectrumEmiPlugin.java @@ -87,6 +87,7 @@ public void registerCategories(EmiRegistry registry) { } registry.addWorkstation(VanillaEmiRecipeCategories.CRAFTING, EmiStack.of(SpectrumItems.CRAFTING_TABLET)); + registry.addWorkstation(VanillaEmiRecipeCategories.CRAFTING, EmiStack.of(SpectrumBlocks.RESTOCKING_CHEST)); registry.addWorkstation(VanillaEmiRecipeCategories.BLASTING, EmiStack.of(SpectrumBlocks.CINDERHEARTH)); registry.addWorkstation(SpectrumEmiRecipeCategories.ANVIL_CRUSHING, EmiStack.of(Blocks.ANVIL)); @@ -116,6 +117,12 @@ public void registerCategories(EmiRegistry registry) { } public void registerRecipes(EmiRegistry registry) { + // TODO: Register our recipes ourselves + // right now dev.emi.emi.VanillaPlugin handles them + // which does not process the unlock check + //addAll(registry, RecipeType.CRAFTING, ShapedGatedCraftingEMIRecipe::new); + //addAll(registry, RecipeType.CRAFTING, ShapelessGatedCraftingEMIRecipe::new); + addAll(registry, SpectrumRecipeTypes.ANVIL_CRUSHING, AnvilCrushingEmiRecipeGated::new); addAll(registry, SpectrumRecipeTypes.PEDESTAL, PedestalCraftingEmiRecipeGated::new); addAll(registry, SpectrumRecipeTypes.FUSION_SHRINE, FusionShrineEmiRecipeGated::new); @@ -191,4 +198,5 @@ public > void addAll(EmiRegistry regist registry.addRecipe(constructor.apply(recipe)); } } + } diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/EnchanterEmiRecipeGated.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/EnchanterEmiRecipeGated.java index ba2ebad1dd..a3f6dacb63 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/EnchanterEmiRecipeGated.java +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/EnchanterEmiRecipeGated.java @@ -17,7 +17,7 @@ import java.util.stream.*; -public class EnchanterEmiRecipeGated extends GatedSpectrumEmiRecipe { +public class EnchanterEmiRecipeGated extends GatedSpectrumEmiRecipe> { private final static Identifier BACKGROUND_TEXTURE = SpectrumCommon.locate("textures/gui/container/enchanter.png"); private final Text description; private final int craftingTime; @@ -40,8 +40,8 @@ public EnchanterEmiRecipeGated(EmiRecipeCategory category, EnchantmentUpgradeRec } inputs.add(EmiStack.of(KnowledgeGemItem.getKnowledgeDropStackWithXP(recipe.getRequiredExperience(), true))); } - - private EnchanterEmiRecipeGated(EmiRecipeCategory category, GatedSpectrumRecipe recipe, Text description, int craftingTime) { + + private EnchanterEmiRecipeGated(EmiRecipeCategory category, GatedSpectrumRecipe recipe, Text description, int craftingTime) { super(category, recipe, 132, 80); this.craftingTime = craftingTime; this.description = description; diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/ShapedGatedCraftingEMIRecipe.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/ShapedGatedCraftingEMIRecipe.java new file mode 100644 index 0000000000..789faa9e53 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/ShapedGatedCraftingEMIRecipe.java @@ -0,0 +1,54 @@ +package de.dafuqs.spectrum.compat.emi.recipes; + +import de.dafuqs.spectrum.compat.emi.*; +import de.dafuqs.spectrum.recipe.crafting.*; +import dev.emi.emi.api.recipe.*; +import dev.emi.emi.api.render.*; +import dev.emi.emi.api.stack.*; +import dev.emi.emi.api.widget.*; +import net.minecraft.item.*; + +public class ShapedGatedCraftingEMIRecipe extends GatedSpectrumEmiRecipe { + + public ShapedGatedCraftingEMIRecipe(ShapedGatedCraftingRecipe recipe) { + super(VanillaEmiRecipeCategories.CRAFTING, recipe, 118, 54); + } + + public boolean canFit(int width, int height) { + if (inputs.size() > 9) { + return false; + } + for (int i = 0; i < inputs.size(); i++) { + int x = i % 3; + int y = i / 3; + if (!inputs.get(i).isEmpty() && (x >= width || y >= height)) { + return false; + } + } + return true; + } + + @Override + public void addUnlockedWidgets(WidgetHolder widgets) { + widgets.addTexture(EmiTexture.EMPTY_ARROW, 60, 18); + + int sOff = 0; + if (canFit(1, 3)) { + sOff -= 1; + } + if (canFit(3, 1)) { + sOff -= 3; + } + for (int i = 0; i < 9; i++) { + int s = i + sOff; + if (s >= 0 && s < inputs.size()) { + widgets.addSlot(inputs.get(s), i % 3 * 18, i / 3 * 18); + } else { + widgets.addSlot(EmiStack.of(ItemStack.EMPTY), i % 3 * 18, i / 3 * 18); + } + } + + widgets.addSlot(outputs.get(0), 92, 14).large(true).recipeContext(this); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/ShapelessGatedCraftingEMIRecipe.java b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/ShapelessGatedCraftingEMIRecipe.java new file mode 100644 index 0000000000..daa4960fb1 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/compat/emi/recipes/ShapelessGatedCraftingEMIRecipe.java @@ -0,0 +1,33 @@ +package de.dafuqs.spectrum.compat.emi.recipes; + +import de.dafuqs.spectrum.compat.emi.*; +import de.dafuqs.spectrum.recipe.crafting.*; +import dev.emi.emi.api.recipe.*; +import dev.emi.emi.api.render.*; +import dev.emi.emi.api.stack.*; +import dev.emi.emi.api.widget.*; +import net.minecraft.item.*; + +public class ShapelessGatedCraftingEMIRecipe extends GatedSpectrumEmiRecipe { + + public ShapelessGatedCraftingEMIRecipe(ShapelessGatedCraftingRecipe recipe) { + super(VanillaEmiRecipeCategories.CRAFTING, recipe, 118, 54); + } + + @Override + public void addUnlockedWidgets(WidgetHolder widgets) { + widgets.addTexture(EmiTexture.EMPTY_ARROW, 60, 18); + widgets.addTexture(EmiTexture.SHAPELESS, 97, 0); + + for (int i = 0; i < 9; i++) { + if (i < inputs.size()) { + widgets.addSlot(inputs.get(i), i % 3 * 18, i / 3 * 18); + } else { + widgets.addSlot(EmiStack.of(ItemStack.EMPTY), i % 3 * 18, i / 3 * 18); + } + } + + widgets.addSlot(outputs.get(0), 92, 14).large(true).recipeContext(this); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookFluidConvertingPageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookFluidConvertingPageRenderer.java index 240a5f0246..62647f498a 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookFluidConvertingPageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookFluidConvertingPageRenderer.java @@ -1,15 +1,15 @@ package de.dafuqs.spectrum.compat.modonomicon.client.pages; -import com.mojang.blaze3d.systems.RenderSystem; -import de.dafuqs.spectrum.api.recipe.GatedRecipe; -import de.dafuqs.spectrum.compat.modonomicon.pages.BookGatedRecipePage; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.recipe.Ingredient; -import net.minecraft.util.Identifier; -import net.minecraft.util.collection.DefaultedList; -import net.minecraft.world.World; - -public abstract class BookFluidConvertingPageRenderer> extends BookGatedRecipePageRenderer { +import com.mojang.blaze3d.systems.*; +import de.dafuqs.spectrum.api.recipe.*; +import de.dafuqs.spectrum.compat.modonomicon.pages.*; +import net.minecraft.client.gui.*; +import net.minecraft.recipe.*; +import net.minecraft.util.*; +import net.minecraft.util.collection.*; +import net.minecraft.world.*; + +public abstract class BookFluidConvertingPageRenderer, T extends BookGatedRecipePage> extends BookGatedRecipePageRenderer { public BookFluidConvertingPageRenderer(T page) { super(page); diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookGatedRecipePageRenderer.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookGatedRecipePageRenderer.java index 8446cda1b3..a6a3ff98c2 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookGatedRecipePageRenderer.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/client/pages/BookGatedRecipePageRenderer.java @@ -1,13 +1,13 @@ package de.dafuqs.spectrum.compat.modonomicon.client.pages; -import com.klikli_dev.modonomicon.book.BookTextHolder; -import com.klikli_dev.modonomicon.book.page.BookRecipePage; -import com.klikli_dev.modonomicon.client.gui.book.BookContentScreen; -import com.klikli_dev.modonomicon.client.render.page.BookRecipePageRenderer; -import de.dafuqs.spectrum.api.recipe.GatedRecipe; -import net.minecraft.client.gui.DrawContext; +import com.klikli_dev.modonomicon.book.*; +import com.klikli_dev.modonomicon.book.page.*; +import com.klikli_dev.modonomicon.client.gui.book.*; +import com.klikli_dev.modonomicon.client.render.page.*; +import de.dafuqs.spectrum.api.recipe.*; +import net.minecraft.client.gui.*; -public abstract class BookGatedRecipePageRenderer> extends BookRecipePageRenderer { +public abstract class BookGatedRecipePageRenderer, T extends BookRecipePage> extends BookRecipePageRenderer { public BookGatedRecipePageRenderer(T page) { super(page); diff --git a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/pages/BookGatedRecipePage.java b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/pages/BookGatedRecipePage.java index 209b47ec1f..8945843d08 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/modonomicon/pages/BookGatedRecipePage.java +++ b/src/main/java/de/dafuqs/spectrum/compat/modonomicon/pages/BookGatedRecipePage.java @@ -14,7 +14,7 @@ import java.util.*; -public class BookGatedRecipePage extends BookRecipePage implements de.dafuqs.spectrum.interfaces.GatedGuidebookPage { +public class BookGatedRecipePage> extends BookRecipePage implements de.dafuqs.spectrum.interfaces.GatedGuidebookPage { private final Identifier pageType; @@ -34,8 +34,8 @@ public static BookCondition getConditionWithRecipes(BookCondition condition, Ide BookCondition[] conditions = {condition, new RecipesLoadedAndUnlockedCondition(null, list)}; return new BookAndCondition(null, conditions); } - - public static BookGatedRecipePage fromJson(Identifier pageType, RecipeType recipeType, JsonObject json) { + + public static > BookGatedRecipePage fromJson(Identifier pageType, RecipeType recipeType, JsonObject json) { var common = BookRecipePage.commonFromJson(json); var anchor = JsonHelper.getString(json, "anchor", ""); var condition = json.has("condition") @@ -43,8 +43,8 @@ public static BookGatedRecipePage fromJson(Identifier : new BookNoneCondition(); return new BookGatedRecipePage<>(recipeType, pageType, common.title1(), common.recipeId1(), common.title2(), common.recipeId2(), common.text(), anchor, condition); } - - public static BookGatedRecipePage fromNetwork(Identifier pageType, RecipeType recipeType, PacketByteBuf buffer) { + + public static > BookGatedRecipePage fromNetwork(Identifier pageType, RecipeType recipeType, PacketByteBuf buffer) { var common = BookRecipePage.commonFromNetwork(buffer); var anchor = buffer.readString(); var condition = BookCondition.fromNetwork(buffer); diff --git a/src/main/java/de/dafuqs/spectrum/mixin/accessors/ShapelessRecipeSerializerAccessor.java b/src/main/java/de/dafuqs/spectrum/mixin/accessors/ShapelessRecipeSerializerAccessor.java new file mode 100644 index 0000000000..c0e1797fba --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/mixin/accessors/ShapelessRecipeSerializerAccessor.java @@ -0,0 +1,17 @@ +package de.dafuqs.spectrum.mixin.accessors; + +import com.google.gson.*; +import net.minecraft.recipe.*; +import net.minecraft.util.collection.*; +import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.gen.*; + +@Mixin(ShapelessRecipe.Serializer.class) +public interface ShapelessRecipeSerializerAccessor { + + @Invoker(value = "getIngredients") + static DefaultedList invokeGetIngredients(JsonArray json) { + throw new AssertionError(); + } + +} \ No newline at end of file diff --git a/src/main/java/de/dafuqs/spectrum/recipe/GatedSpectrumRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/GatedSpectrumRecipe.java index 080953fcf1..7a334b23ff 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/GatedSpectrumRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/GatedSpectrumRecipe.java @@ -1,17 +1,15 @@ package de.dafuqs.spectrum.recipe; -import de.dafuqs.revelationary.api.advancements.*; import de.dafuqs.spectrum.api.recipe.*; import de.dafuqs.spectrum.helpers.NbtHelper; import de.dafuqs.spectrum.helpers.*; -import net.minecraft.entity.player.*; +import net.minecraft.inventory.*; import net.minecraft.item.*; import net.minecraft.nbt.*; -import net.minecraft.text.*; import net.minecraft.util.*; import org.jetbrains.annotations.*; -public abstract class GatedSpectrumRecipe implements GatedRecipe { +public abstract class GatedSpectrumRecipe implements GatedRecipe { public final Identifier id; public final String group; @@ -54,24 +52,6 @@ public Identifier getRequiredAdvancementIdentifier() { @Override public abstract Identifier getRecipeTypeUnlockIdentifier(); - @Override - public boolean canPlayerCraft(PlayerEntity playerEntity) { - return AdvancementHelper.hasAdvancement(playerEntity, getRecipeTypeUnlockIdentifier()) - && AdvancementHelper.hasAdvancement(playerEntity, this.requiredAdvancementIdentifier); - } - - public abstract String getRecipeTypeShortID(); - - @Override - public Text getSingleUnlockToastString() { - return Text.translatable("spectrum.toast." + getRecipeTypeShortID() + "_recipe_unlocked.title"); - } - - @Override - public Text getMultipleUnlockToastString() { - return Text.translatable("spectrum.toast." + getRecipeTypeShortID() + "_recipes_unlocked.title"); - } - @Override public boolean isIgnoredInRecipeBook() { return true; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/GatedStackSpectrumRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/GatedStackSpectrumRecipe.java index 11498e37d8..bc3b60dd85 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/GatedStackSpectrumRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/GatedStackSpectrumRecipe.java @@ -10,7 +10,7 @@ import java.util.*; -public abstract class GatedStackSpectrumRecipe extends GatedSpectrumRecipe { +public abstract class GatedStackSpectrumRecipe extends GatedSpectrumRecipe { protected GatedStackSpectrumRecipe(Identifier id, String group, boolean secret, Identifier requiredAdvancementIdentifier) { super(id, group, secret, requiredAdvancementIdentifier); diff --git a/src/main/java/de/dafuqs/spectrum/recipe/anvil_crushing/AnvilCrushingRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/anvil_crushing/AnvilCrushingRecipe.java index da25839f26..4734083872 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/anvil_crushing/AnvilCrushingRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/anvil_crushing/AnvilCrushingRecipe.java @@ -13,7 +13,7 @@ import net.minecraft.util.collection.*; import net.minecraft.world.*; -public class AnvilCrushingRecipe extends GatedSpectrumRecipe { +public class AnvilCrushingRecipe extends GatedSpectrumRecipe { protected final Ingredient input; protected final ItemStack output; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/cinderhearth/CinderhearthRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/cinderhearth/CinderhearthRecipe.java index fec10d2af9..00d973dea9 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/cinderhearth/CinderhearthRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/cinderhearth/CinderhearthRecipe.java @@ -16,7 +16,7 @@ import java.util.*; -public class CinderhearthRecipe extends GatedStackSpectrumRecipe { +public class CinderhearthRecipe extends GatedStackSpectrumRecipe { public static final Identifier UNLOCK_IDENTIFIER = SpectrumCommon.locate("unlocks/blocks/cinderhearth"); diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapedGatedCraftingRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapedGatedCraftingRecipe.java new file mode 100644 index 0000000000..55f8184746 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapedGatedCraftingRecipe.java @@ -0,0 +1,44 @@ +package de.dafuqs.spectrum.recipe.crafting; + +import de.dafuqs.spectrum.api.recipe.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.inventory.*; +import net.minecraft.item.*; +import net.minecraft.recipe.*; +import net.minecraft.recipe.book.*; +import net.minecraft.util.*; +import net.minecraft.util.collection.*; +import org.jetbrains.annotations.*; + +public class ShapedGatedCraftingRecipe extends ShapedRecipe implements GatedRecipe { + + public final boolean secret; + public final @Nullable Identifier requiredAdvancementIdentifier; + + public ShapedGatedCraftingRecipe(Identifier id, String group, CraftingRecipeCategory category, int width, int height, DefaultedList input, ItemStack output, boolean showNotification, boolean secret, @Nullable Identifier requiredAdvancementIdentifier) { + super(id, group, category, width, height, input, output, showNotification); + this.secret = secret; + this.requiredAdvancementIdentifier = requiredAdvancementIdentifier; + } + + @Override + public boolean isSecret() { + return this.secret; + } + + @Override + public @Nullable Identifier getRequiredAdvancementIdentifier() { + return this.requiredAdvancementIdentifier; + } + + @Override + public Identifier getRecipeTypeUnlockIdentifier() { + return null; + } + + @Override + public String getRecipeTypeShortID() { + return SpectrumRecipeTypes.SHAPED_GATED_CRAFTING_RECIPE_ID; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapedGatedCraftingRecipeSerializer.java b/src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapedGatedCraftingRecipeSerializer.java new file mode 100644 index 0000000000..451b6182cc --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapedGatedCraftingRecipeSerializer.java @@ -0,0 +1,77 @@ +package de.dafuqs.spectrum.recipe.crafting; + +import com.google.gson.*; +import de.dafuqs.spectrum.api.recipe.*; +import de.dafuqs.spectrum.mixin.accessors.*; +import net.minecraft.item.*; +import net.minecraft.network.*; +import net.minecraft.recipe.*; +import net.minecraft.recipe.book.*; +import net.minecraft.registry.*; +import net.minecraft.util.*; +import net.minecraft.util.collection.*; +import org.jetbrains.annotations.*; + +import java.util.*; + +public class ShapedGatedCraftingRecipeSerializer implements GatedRecipeSerializer { + + public final ShapedGatedCraftingRecipeSerializer.RecipeFactory recipeFactory; + + public ShapedGatedCraftingRecipeSerializer(ShapedGatedCraftingRecipeSerializer.RecipeFactory recipeFactory) { + this.recipeFactory = recipeFactory; + } + + public interface RecipeFactory { + ShapedGatedCraftingRecipe create(Identifier id, String group, CraftingRecipeCategory category, int width, int height, DefaultedList input, ItemStack output, boolean notification, boolean secret, @Nullable Identifier requiredAdvancementIdentifier); + } + + @Override + public ShapedGatedCraftingRecipe read(Identifier id, JsonObject jsonObject) { + String group = JsonHelper.getString(jsonObject, "group", ""); + CraftingRecipeCategory category = CraftingRecipeCategory.CODEC.byId(JsonHelper.getString(jsonObject, "category", null), CraftingRecipeCategory.MISC); + Map map = ShapedRecipeAccessor.invokeReadSymbols(JsonHelper.getObject(jsonObject, "key")); + String[] strings = ShapedRecipeAccessor.invokeRemovePadding(ShapedRecipeAccessor.invokeGetPattern(JsonHelper.getArray(jsonObject, "pattern"))); + int width = strings[0].length(); + int height = strings.length; + DefaultedList input = ShapedRecipeAccessor.invokeCreatePatternMatrix(strings, map, width, height); + ItemStack output = ShapedRecipe.outputFromJson(JsonHelper.getObject(jsonObject, "result")); + boolean bl = JsonHelper.getBoolean(jsonObject, "show_notification", true); + boolean secret = readSecret(jsonObject); + @Nullable Identifier requiredAdvancementIdentifier = readRequiredAdvancementIdentifier(jsonObject); + return new ShapedGatedCraftingRecipe(id, group, category, width, height, input, output, bl, secret, requiredAdvancementIdentifier); + } + + + @Override + public void write(PacketByteBuf packetByteBuf, ShapedGatedCraftingRecipe recipe) { + packetByteBuf.writeVarInt(recipe.getWidth()); + packetByteBuf.writeVarInt(recipe.getHeight()); + packetByteBuf.writeString(recipe.getGroup()); + packetByteBuf.writeEnumConstant(recipe.getCategory()); + for (Ingredient ingredient : recipe.getIngredients()) { + ingredient.write(packetByteBuf); + } + packetByteBuf.writeItemStack(recipe.getOutput(DynamicRegistryManager.EMPTY)); + packetByteBuf.writeBoolean(recipe.showNotification()); + packetByteBuf.writeBoolean(recipe.isSecret()); + writeNullableIdentifier(packetByteBuf, recipe.getRecipeTypeUnlockIdentifier()); + } + + + @Override + public ShapedGatedCraftingRecipe read(Identifier identifier, PacketByteBuf packetByteBuf) { + int i = packetByteBuf.readVarInt(); + int j = packetByteBuf.readVarInt(); + String string = packetByteBuf.readString(); + CraftingRecipeCategory craftingRecipeCategory = packetByteBuf.readEnumConstant(CraftingRecipeCategory.class); + DefaultedList defaultedList = DefaultedList.ofSize(i * j, Ingredient.EMPTY); + defaultedList.replaceAll(ignored -> Ingredient.fromPacket(packetByteBuf)); + ItemStack itemStack = packetByteBuf.readItemStack(); + boolean bl = packetByteBuf.readBoolean(); + boolean secret = packetByteBuf.readBoolean(); + @Nullable Identifier requiredAdvancementIdentifier = readNullableIdentifier(packetByteBuf); + return new ShapedGatedCraftingRecipe(identifier, string, craftingRecipeCategory, i, j, defaultedList, itemStack, bl, secret, requiredAdvancementIdentifier); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapelessGatedCraftingRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapelessGatedCraftingRecipe.java new file mode 100644 index 0000000000..eb9320e05f --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapelessGatedCraftingRecipe.java @@ -0,0 +1,44 @@ +package de.dafuqs.spectrum.recipe.crafting; + +import de.dafuqs.spectrum.api.recipe.*; +import de.dafuqs.spectrum.registries.*; +import net.minecraft.inventory.*; +import net.minecraft.item.*; +import net.minecraft.recipe.*; +import net.minecraft.recipe.book.*; +import net.minecraft.util.*; +import net.minecraft.util.collection.*; +import org.jetbrains.annotations.*; + +public class ShapelessGatedCraftingRecipe extends ShapelessRecipe implements GatedRecipe { + + public final boolean secret; + public final @Nullable Identifier requiredAdvancementIdentifier; + + public ShapelessGatedCraftingRecipe(Identifier id, String group, CraftingRecipeCategory category, ItemStack output, DefaultedList input, boolean secret, @Nullable Identifier requiredAdvancementIdentifier) { + super(id, group, category, output, input); + this.secret = secret; + this.requiredAdvancementIdentifier = requiredAdvancementIdentifier; + } + + @Override + public boolean isSecret() { + return this.secret; + } + + @Override + public @Nullable Identifier getRequiredAdvancementIdentifier() { + return this.requiredAdvancementIdentifier; + } + + @Override + public Identifier getRecipeTypeUnlockIdentifier() { + return null; + } + + @Override + public String getRecipeTypeShortID() { + return SpectrumRecipeTypes.SHAPED_GATED_CRAFTING_RECIPE_ID; + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapelessGatedCraftingRecipeSerializer.java b/src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapelessGatedCraftingRecipeSerializer.java new file mode 100644 index 0000000000..f14f8959d6 --- /dev/null +++ b/src/main/java/de/dafuqs/spectrum/recipe/crafting/ShapelessGatedCraftingRecipeSerializer.java @@ -0,0 +1,73 @@ +package de.dafuqs.spectrum.recipe.crafting; + +import com.google.gson.*; +import de.dafuqs.spectrum.api.recipe.*; +import de.dafuqs.spectrum.mixin.accessors.*; +import net.minecraft.item.*; +import net.minecraft.network.*; +import net.minecraft.recipe.*; +import net.minecraft.recipe.book.*; +import net.minecraft.registry.*; +import net.minecraft.util.*; +import net.minecraft.util.collection.*; +import org.jetbrains.annotations.*; + +public class ShapelessGatedCraftingRecipeSerializer implements GatedRecipeSerializer { + + public final ShapelessGatedCraftingRecipeSerializer.RecipeFactory recipeFactory; + + public ShapelessGatedCraftingRecipeSerializer(ShapelessGatedCraftingRecipeSerializer.RecipeFactory recipeFactory) { + this.recipeFactory = recipeFactory; + } + + public interface RecipeFactory { + ShapelessGatedCraftingRecipe create(Identifier id, String group, CraftingRecipeCategory category, ItemStack output, DefaultedList input, boolean secret, @Nullable Identifier requiredAdvancementIdentifier); + } + + @Override + public ShapelessGatedCraftingRecipe read(Identifier identifier, JsonObject jsonObject) { + String string = JsonHelper.getString(jsonObject, "group", ""); + CraftingRecipeCategory craftingRecipeCategory = CraftingRecipeCategory.CODEC.byId(JsonHelper.getString(jsonObject, "category", (String) null), CraftingRecipeCategory.MISC); + DefaultedList defaultedList = ShapelessRecipeSerializerAccessor.invokeGetIngredients(JsonHelper.getArray(jsonObject, "ingredients")); + if (defaultedList.isEmpty()) { + throw new JsonParseException("No ingredients for shapeless recipe"); + } else if (defaultedList.size() > 9) { + throw new JsonParseException("Too many ingredients for shapeless recipe"); + } else { + ItemStack itemStack = ShapedRecipe.outputFromJson(JsonHelper.getObject(jsonObject, "result")); + boolean secret = readSecret(jsonObject); + @Nullable Identifier requiredAdvancementIdentifier = readRequiredAdvancementIdentifier(jsonObject); + return new ShapelessGatedCraftingRecipe(identifier, string, craftingRecipeCategory, itemStack, defaultedList, secret, requiredAdvancementIdentifier); + } + } + + + @Override + public void write(PacketByteBuf packetByteBuf, ShapelessGatedCraftingRecipe recipe) { + packetByteBuf.writeString(recipe.getGroup()); + packetByteBuf.writeEnumConstant(recipe.getCategory()); + packetByteBuf.writeVarInt(recipe.getIngredients().size()); + for (Ingredient ingredient : recipe.getIngredients()) { + ingredient.write(packetByteBuf); + } + packetByteBuf.writeItemStack(recipe.getOutput(DynamicRegistryManager.EMPTY)); + packetByteBuf.writeBoolean(recipe.isSecret()); + writeNullableIdentifier(packetByteBuf, recipe.getRecipeTypeUnlockIdentifier()); + } + + + @Override + public ShapelessGatedCraftingRecipe read(Identifier identifier, PacketByteBuf packetByteBuf) { + String string = packetByteBuf.readString(); + CraftingRecipeCategory craftingRecipeCategory = packetByteBuf.readEnumConstant(CraftingRecipeCategory.class); + int i = packetByteBuf.readVarInt(); + DefaultedList defaultedList = DefaultedList.ofSize(i, Ingredient.EMPTY); + defaultedList.replaceAll(ignored -> Ingredient.fromPacket(packetByteBuf)); + boolean secret = packetByteBuf.readBoolean(); + @Nullable Identifier requiredAdvancementIdentifier = readNullableIdentifier(packetByteBuf); + + ItemStack itemStack = packetByteBuf.readItemStack(); + return new ShapelessGatedCraftingRecipe(identifier, string, craftingRecipeCategory, itemStack, defaultedList, secret, requiredAdvancementIdentifier); + } + +} diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ClearCraftingTabletRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ClearCraftingTabletRecipe.java similarity index 89% rename from src/main/java/de/dafuqs/spectrum/recipe/crafting/ClearCraftingTabletRecipe.java rename to src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ClearCraftingTabletRecipe.java index fc878a1a2b..bf08ddf055 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ClearCraftingTabletRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ClearCraftingTabletRecipe.java @@ -1,7 +1,7 @@ -package de.dafuqs.spectrum.recipe.crafting; +package de.dafuqs.spectrum.recipe.crafting.dynamic; import de.dafuqs.spectrum.items.*; -import de.dafuqs.spectrum.recipe.EmptyRecipeSerializer; +import de.dafuqs.spectrum.recipe.*; import net.minecraft.item.*; import net.minecraft.recipe.*; import net.minecraft.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ClearEnderSpliceRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ClearEnderSpliceRecipe.java similarity index 90% rename from src/main/java/de/dafuqs/spectrum/recipe/crafting/ClearEnderSpliceRecipe.java rename to src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ClearEnderSpliceRecipe.java index 5185d76ccc..8250cc9d11 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ClearEnderSpliceRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ClearEnderSpliceRecipe.java @@ -1,7 +1,7 @@ -package de.dafuqs.spectrum.recipe.crafting; +package de.dafuqs.spectrum.recipe.crafting.dynamic; import de.dafuqs.spectrum.items.magic_items.*; -import de.dafuqs.spectrum.recipe.EmptyRecipeSerializer; +import de.dafuqs.spectrum.recipe.*; import net.minecraft.item.*; import net.minecraft.recipe.*; import net.minecraft.util.*; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ClearInkRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ClearInkRecipe.java similarity index 94% rename from src/main/java/de/dafuqs/spectrum/recipe/crafting/ClearInkRecipe.java rename to src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ClearInkRecipe.java index 3386117a5a..cdad0091f1 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ClearInkRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ClearInkRecipe.java @@ -1,4 +1,4 @@ -package de.dafuqs.spectrum.recipe.crafting; +package de.dafuqs.spectrum.recipe.crafting.dynamic; import de.dafuqs.spectrum.api.energy.*; import net.minecraft.item.*; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ClearPotionFillableRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ClearPotionFillableRecipe.java similarity index 95% rename from src/main/java/de/dafuqs/spectrum/recipe/crafting/ClearPotionFillableRecipe.java rename to src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ClearPotionFillableRecipe.java index e0cb77ed4c..b555432bdb 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ClearPotionFillableRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ClearPotionFillableRecipe.java @@ -1,4 +1,4 @@ -package de.dafuqs.spectrum.recipe.crafting; +package de.dafuqs.spectrum.recipe.crafting.dynamic; import de.dafuqs.spectrum.api.item.*; import net.minecraft.item.*; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ColorEverpromiseRibbonRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ColorEverpromiseRibbonRecipe.java similarity index 98% rename from src/main/java/de/dafuqs/spectrum/recipe/crafting/ColorEverpromiseRibbonRecipe.java rename to src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ColorEverpromiseRibbonRecipe.java index 648b093d4b..61e8a2702e 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/crafting/ColorEverpromiseRibbonRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/ColorEverpromiseRibbonRecipe.java @@ -1,4 +1,4 @@ -package de.dafuqs.spectrum.recipe.crafting; +package de.dafuqs.spectrum.recipe.crafting.dynamic; import de.dafuqs.spectrum.helpers.*; import de.dafuqs.spectrum.items.*; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crafting/RepairAnythingRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/RepairAnythingRecipe.java similarity index 97% rename from src/main/java/de/dafuqs/spectrum/recipe/crafting/RepairAnythingRecipe.java rename to src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/RepairAnythingRecipe.java index cca64221d4..4ae2e7f363 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/crafting/RepairAnythingRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/RepairAnythingRecipe.java @@ -1,4 +1,4 @@ -package de.dafuqs.spectrum.recipe.crafting; +package de.dafuqs.spectrum.recipe.crafting.dynamic; import de.dafuqs.spectrum.registries.*; import net.minecraft.inventory.*; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crafting/SingleItemCraftingRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/SingleItemCraftingRecipe.java similarity index 90% rename from src/main/java/de/dafuqs/spectrum/recipe/crafting/SingleItemCraftingRecipe.java rename to src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/SingleItemCraftingRecipe.java index 798e43373f..bbd2995136 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/crafting/SingleItemCraftingRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/SingleItemCraftingRecipe.java @@ -1,10 +1,10 @@ -package de.dafuqs.spectrum.recipe.crafting; +package de.dafuqs.spectrum.recipe.crafting.dynamic; import net.minecraft.inventory.*; import net.minecraft.item.*; import net.minecraft.recipe.*; -import net.minecraft.recipe.book.CraftingRecipeCategory; -import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.recipe.book.*; +import net.minecraft.registry.*; import net.minecraft.util.*; import net.minecraft.world.*; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crafting/WrapPresentRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/WrapPresentRecipe.java similarity index 98% rename from src/main/java/de/dafuqs/spectrum/recipe/crafting/WrapPresentRecipe.java rename to src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/WrapPresentRecipe.java index 7e00ae56e3..803a2dd1bc 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/crafting/WrapPresentRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/crafting/dynamic/WrapPresentRecipe.java @@ -1,4 +1,4 @@ -package de.dafuqs.spectrum.recipe.crafting; +package de.dafuqs.spectrum.recipe.crafting.dynamic; import de.dafuqs.spectrum.blocks.present.*; import de.dafuqs.spectrum.items.*; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/crystallarieum/CrystallarieumRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/crystallarieum/CrystallarieumRecipe.java index 805cfd8a9a..ee9892050e 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/crystallarieum/CrystallarieumRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/crystallarieum/CrystallarieumRecipe.java @@ -16,7 +16,7 @@ import java.util.*; -public class CrystallarieumRecipe extends GatedSpectrumRecipe { +public class CrystallarieumRecipe extends GatedSpectrumRecipe { public static final Identifier UNLOCK_IDENTIFIER = SpectrumCommon.locate("unlocks/blocks/crystallarieum"); diff --git a/src/main/java/de/dafuqs/spectrum/recipe/enchanter/EnchanterRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/enchanter/EnchanterRecipe.java index afaa954072..4befe5962f 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/enchanter/EnchanterRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/enchanter/EnchanterRecipe.java @@ -12,7 +12,7 @@ import net.minecraft.util.collection.*; import net.minecraft.world.*; -public class EnchanterRecipe extends GatedSpectrumRecipe { +public class EnchanterRecipe extends GatedSpectrumRecipe { public static final Identifier UNLOCK_IDENTIFIER = SpectrumCommon.locate("midgame/build_enchanting_structure"); diff --git a/src/main/java/de/dafuqs/spectrum/recipe/enchantment_upgrade/EnchantmentUpgradeRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/enchantment_upgrade/EnchantmentUpgradeRecipe.java index 0027b8bd5a..0587783ba0 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/enchantment_upgrade/EnchantmentUpgradeRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/enchantment_upgrade/EnchantmentUpgradeRecipe.java @@ -15,7 +15,7 @@ import java.util.*; -public class EnchantmentUpgradeRecipe extends GatedSpectrumRecipe { +public class EnchantmentUpgradeRecipe extends GatedSpectrumRecipe { protected final Enchantment enchantment; protected final int enchantmentDestinationLevel; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/fluid_converting/FluidConvertingRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/fluid_converting/FluidConvertingRecipe.java index c89ab20a39..6dbedc351e 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/fluid_converting/FluidConvertingRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/fluid_converting/FluidConvertingRecipe.java @@ -10,7 +10,7 @@ import net.minecraft.world.*; import org.jetbrains.annotations.*; -public abstract class FluidConvertingRecipe extends GatedSpectrumRecipe { +public abstract class FluidConvertingRecipe extends GatedSpectrumRecipe { protected final Ingredient input; protected final ItemStack output; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/fusion_shrine/FusionShrineRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/fusion_shrine/FusionShrineRecipe.java index 2a276b53d9..57939a2fed 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/fusion_shrine/FusionShrineRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/fusion_shrine/FusionShrineRecipe.java @@ -24,7 +24,7 @@ import java.util.*; -public class FusionShrineRecipe extends GatedStackSpectrumRecipe { +public class FusionShrineRecipe extends GatedStackSpectrumRecipe { public static final Identifier UNLOCK_IDENTIFIER = SpectrumCommon.locate("build_fusion_shrine"); diff --git a/src/main/java/de/dafuqs/spectrum/recipe/ink_converting/InkConvertingRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/ink_converting/InkConvertingRecipe.java index 0d307fe83f..dc57e0b597 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/ink_converting/InkConvertingRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/ink_converting/InkConvertingRecipe.java @@ -14,7 +14,7 @@ import java.util.*; -public class InkConvertingRecipe extends GatedSpectrumRecipe { +public class InkConvertingRecipe extends GatedSpectrumRecipe { public static final Identifier UNLOCK_IDENTIFIER = SpectrumCommon.locate("midgame/place_color_picker"); protected static final List INPUT_ITEMS = new ArrayList<>(); diff --git a/src/main/java/de/dafuqs/spectrum/recipe/pedestal/PedestalRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/pedestal/PedestalRecipe.java index d95f86ddac..23031179ac 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/pedestal/PedestalRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/pedestal/PedestalRecipe.java @@ -24,7 +24,7 @@ import java.util.*; -public abstract class PedestalRecipe extends GatedStackSpectrumRecipe { +public abstract class PedestalRecipe extends GatedStackSpectrumRecipe { public static final Identifier UNLOCK_IDENTIFIER = SpectrumCommon.locate("place_pedestal"); diff --git a/src/main/java/de/dafuqs/spectrum/recipe/potion_workshop/PotionWorkshopReactingRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/potion_workshop/PotionWorkshopReactingRecipe.java index 7a4df97786..5a83573013 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/potion_workshop/PotionWorkshopReactingRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/potion_workshop/PotionWorkshopReactingRecipe.java @@ -16,7 +16,7 @@ import java.util.*; -public class PotionWorkshopReactingRecipe extends GatedSpectrumRecipe implements DescriptiveGatedRecipe { +public class PotionWorkshopReactingRecipe extends GatedSpectrumRecipe implements DescriptiveGatedRecipe { protected static final HashMap> reagents = new HashMap<>(); diff --git a/src/main/java/de/dafuqs/spectrum/recipe/potion_workshop/PotionWorkshopRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/potion_workshop/PotionWorkshopRecipe.java index fca2a06307..843cb2c1e0 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/potion_workshop/PotionWorkshopRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/potion_workshop/PotionWorkshopRecipe.java @@ -15,7 +15,7 @@ import java.util.*; -public abstract class PotionWorkshopRecipe extends GatedStackSpectrumRecipe { +public abstract class PotionWorkshopRecipe extends GatedStackSpectrumRecipe { public static final Identifier UNLOCK_IDENTIFIER = SpectrumCommon.locate("unlocks/blocks/potion_workshop"); public static final int[] INGREDIENT_SLOTS = new int[]{2, 3, 4}; diff --git a/src/main/java/de/dafuqs/spectrum/recipe/primordial_fire_burning/PrimordialFireBurningRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/primordial_fire_burning/PrimordialFireBurningRecipe.java index 6dcef5adea..71b09f67dc 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/primordial_fire_burning/PrimordialFireBurningRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/primordial_fire_burning/PrimordialFireBurningRecipe.java @@ -20,7 +20,7 @@ import java.util.*; -public class PrimordialFireBurningRecipe extends GatedSpectrumRecipe { +public class PrimordialFireBurningRecipe extends GatedSpectrumRecipe { public static final Identifier UNLOCK_IDENTIFIER = SpectrumCommon.locate("lategame/collect_doombloom_seed"); diff --git a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/SpiritInstillerRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/SpiritInstillerRecipe.java index 0e900c4da1..b0cbc4de70 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/SpiritInstillerRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/spirit_instiller/SpiritInstillerRecipe.java @@ -24,7 +24,7 @@ import java.util.*; -public class SpiritInstillerRecipe extends GatedStackSpectrumRecipe { +public class SpiritInstillerRecipe extends GatedStackSpectrumRecipe { public static final Identifier UNLOCK_IDENTIFIER = SpectrumCommon.locate("midgame/build_spirit_instiller_structure"); diff --git a/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/ITitrationBarrelRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/ITitrationBarrelRecipe.java index 78ef84ac7e..c7308a6902 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/ITitrationBarrelRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/ITitrationBarrelRecipe.java @@ -23,7 +23,7 @@ * Making it a non-ticking block entity and also "fermenting" when the game is not running * This also means TitrationBarrelRecipes have to calculate their time using real life seconds, instead of game ticks */ -public interface ITitrationBarrelRecipe extends GatedRecipe { +public interface ITitrationBarrelRecipe extends GatedRecipe { Identifier UNLOCK_ADVANCEMENT_IDENTIFIER = SpectrumCommon.locate("unlocks/blocks/titration_barrel"); diff --git a/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/TitrationBarrelRecipe.java b/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/TitrationBarrelRecipe.java index 9c222f9dff..da84febdc6 100644 --- a/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/TitrationBarrelRecipe.java +++ b/src/main/java/de/dafuqs/spectrum/recipe/titration_barrel/TitrationBarrelRecipe.java @@ -20,7 +20,7 @@ import java.util.*; -public class TitrationBarrelRecipe extends GatedStackSpectrumRecipe implements ITitrationBarrelRecipe { +public class TitrationBarrelRecipe extends GatedStackSpectrumRecipe implements ITitrationBarrelRecipe { public static final List FERMENTATION_DURATION_DISPLAY_TIME_MULTIPLIERS = new ArrayList<>() {{ add(1); diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumCustomRecipeSerializers.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumCustomRecipeSerializers.java index aa9b0ea225..7e7cd963a6 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumCustomRecipeSerializers.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumCustomRecipeSerializers.java @@ -1,7 +1,7 @@ package de.dafuqs.spectrum.registries; import de.dafuqs.spectrum.*; -import de.dafuqs.spectrum.recipe.crafting.*; +import de.dafuqs.spectrum.recipe.crafting.dynamic.*; import de.dafuqs.spectrum.recipe.fluid_converting.dynamic.*; import de.dafuqs.spectrum.recipe.fusion_shrine.dynamic.*; import de.dafuqs.spectrum.recipe.pedestal.dynamic.*; diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumRecipeTypes.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumRecipeTypes.java index 2ea2f96742..8ac9244548 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumRecipeTypes.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumRecipeTypes.java @@ -3,6 +3,7 @@ import de.dafuqs.spectrum.*; import de.dafuqs.spectrum.recipe.anvil_crushing.*; import de.dafuqs.spectrum.recipe.cinderhearth.*; +import de.dafuqs.spectrum.recipe.crafting.*; import de.dafuqs.spectrum.recipe.crystallarieum.*; import de.dafuqs.spectrum.recipe.enchanter.*; import de.dafuqs.spectrum.recipe.enchantment_upgrade.*; @@ -18,6 +19,11 @@ import net.minecraft.registry.*; public class SpectrumRecipeTypes { + + public static final String SHAPED_GATED_CRAFTING_RECIPE_ID = "gated_crafting_shaped"; + public static final String SHAPELESS_GATED_CRAFTING_RECIPE_ID = "gated_crafting_shapeless"; + public static RecipeSerializer SHAPED_GATED_CRAFTING_RECIPE_SERIALIZER; + public static RecipeSerializer SHAPELESS_GATED_CRAFTING_RECIPE_SERIALIZER; public static final String SHAPED_PEDESTAL_RECIPE_ID = "pedestal"; public static final String SHAPELESS_PEDESTAL_RECIPE_ID = "pedestal_shapeless"; @@ -107,10 +113,13 @@ public String toString() { } public static void registerSerializer() { + SHAPED_GATED_CRAFTING_RECIPE_SERIALIZER = registerSerializer(SHAPED_GATED_CRAFTING_RECIPE_ID, new ShapedGatedCraftingRecipeSerializer(ShapedGatedCraftingRecipe::new)); + SHAPELESS_GATED_CRAFTING_RECIPE_SERIALIZER = registerSerializer(SHAPELESS_GATED_CRAFTING_RECIPE_ID, new ShapelessGatedCraftingRecipeSerializer(ShapelessGatedCraftingRecipe::new)); + SHAPED_PEDESTAL_RECIPE_SERIALIZER = registerSerializer(SHAPED_PEDESTAL_RECIPE_ID, new ShapedPedestalRecipeSerializer(ShapedPedestalRecipe::new)); SHAPELESS_PEDESTAL_RECIPE_SERIALIZER = registerSerializer(SHAPELESS_PEDESTAL_RECIPE_ID, new ShapelessPedestalRecipeSerializer(ShapelessPedestalRecipe::new)); PEDESTAL = registerRecipeType(SHAPED_PEDESTAL_RECIPE_ID); - + ANVIL_CRUSHING_RECIPE_SERIALIZER = registerSerializer(ANVIL_CRUSHING_ID, new AnvilCrushingRecipeSerializer(AnvilCrushingRecipe::new)); ANVIL_CRUSHING = registerRecipeType(ANVIL_CRUSHING_ID); diff --git a/src/main/resources/data/spectrum/recipes/crafting_table/glistering_melon.json b/src/main/resources/data/spectrum/recipes/crafting_table/glistering_melon.json index 7de41799e8..3f37df07a2 100644 --- a/src/main/resources/data/spectrum/recipes/crafting_table/glistering_melon.json +++ b/src/main/resources/data/spectrum/recipes/crafting_table/glistering_melon.json @@ -1,5 +1,5 @@ { - "type": "minecraft:crafting_shaped", + "type": "spectrum:gated_crafting_shaped", "pattern": [ "MMM", "MMM", diff --git a/src/main/resources/data/spectrum/recipes/crafting_table/mushroom_stew.json b/src/main/resources/data/spectrum/recipes/crafting_table/mushroom_stew.json index 8ba0d81715..67df285a0d 100644 --- a/src/main/resources/data/spectrum/recipes/crafting_table/mushroom_stew.json +++ b/src/main/resources/data/spectrum/recipes/crafting_table/mushroom_stew.json @@ -1,5 +1,5 @@ { - "type": "minecraft:crafting_shapeless", + "type": "spectrum:gated_crafting_shapeless", "ingredients": [ { "tag": "spectrum:noxshrooms" diff --git a/src/main/resources/spectrum.mixins.json b/src/main/resources/spectrum.mixins.json index 4197a27d96..58dd83c03c 100644 --- a/src/main/resources/spectrum.mixins.json +++ b/src/main/resources/spectrum.mixins.json @@ -91,6 +91,7 @@ "accessors.ProjectileAttackGoalAccessor", "accessors.RecipeManagerAccessor", "accessors.ShapedRecipeAccessor", + "accessors.ShapelessRecipeSerializerAccessor", "accessors.SlimeEntityAccessor", "accessors.StatusEffectInstanceAccessor", "accessors.TridentEntityAccessor", From 494c8419dc121a51ee3bbff6a16c7949ef107f7e Mon Sep 17 00:00:00 2001 From: Shibva <38770780+Shibva@users.noreply.github.com> Date: Fri, 20 Feb 2026 01:35:38 -0500 Subject: [PATCH 2/5] What to clone enchant x? TOO BAD, BLACKLIST-EEGEE TIME! - Added a new Enchantment tag and blacklist check for the Enchanter; Enchantment ids in the `enchanter_blacklisted_enchantments` tag will now be skipped for both enchanting processes. Will still work if the enchantment is on the central item already though. This will enable modpack makers and developers to restrict enchantments that are acquired though other means exclusively to their method. --- .../dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java | 7 ++++++- .../spectrum/registries/SpectrumEnchantmentTags.java | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java index b6c5b1b2be..216054bc0e 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java @@ -148,7 +148,12 @@ public static Map collectHighestEnchantments(List itemStackEnchantments = EnchantmentHelper.get(itemStack); for (Enchantment enchantment : itemStackEnchantments.keySet()) { int level = itemStackEnchantments.get(enchantment); - if (enchantmentLevelMap.containsKey(enchantment)) { + + if (SpectrumEnchantmentTags.isIn(SpectrumEnchantmentTags.ENCHANTER_BLACKLIST, enchantment)) { + continue; + } + + if (enchantmentLevelMap.containsKey(enchantment)) { int storedLevel = enchantmentLevelMap.get(enchantment); if (level > storedLevel) { enchantmentLevelMap.put(enchantment, level); diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumEnchantmentTags.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumEnchantmentTags.java index 7c519830ba..87fb4568e8 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumEnchantmentTags.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumEnchantmentTags.java @@ -12,6 +12,8 @@ public class SpectrumEnchantmentTags { public static final TagKey SPECTRUM_ENCHANTMENT = of("enchantments"); + public static final TagKey ENCHANTER_BLACKLIST = of("enchanter_blacklisted_enchantments"); + private static TagKey of(String id) { return TagKey.of(RegistryKeys.ENCHANTMENT, SpectrumCommon.locate(id)); } From 2cfa5046091f878461e7dac4b69a712c14c60051 Mon Sep 17 00:00:00 2001 From: Shibva <38770780+Shibva@users.noreply.github.com> Date: Fri, 20 Feb 2026 15:35:58 -0500 Subject: [PATCH 3/5] Changes - Duplicated `collectHighestEnchantments` with original functionality and refitted the second one to accept a `blacklist` arg to act as a exclusion filter. - Adjusted Enchanter to use the filterable version of `collectHighestEnchantments` with the `ENCHANTER_BLACKLIST` tag - Renamed the actual data tag from `blacklisted_enchantments` to `enchanter_copying_and_applying_blacklisted` as requested - add in a blank tag under Enchantment `enchanter_copying_and_applying_blacklisted` as requested by Daf, it will be empty but there to suggest its existence to those who crawl through mods looking for ways to configure stuff lol - Made a suggested adjustment by IDEA to simplify a part (see line 27 in SpectrumEnchantmentTags.java) - Client tested the workspace for the desired functionality after changes were made --- .../enchanter/EnchanterBlockEntity.java | 2 +- .../helpers/SpectrumEnchantmentHelper.java | 31 ++++++++++++++++--- .../registries/SpectrumEnchantmentTags.java | 7 ++--- ...nter_copying_and_applying_blacklisted.json | 3 ++ 4 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 src/main/resources/data/spectrum/tags/enchantment/enchanter_copying_and_applying_blacklisted.json diff --git a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java index 3aad25565e..4ee4cd47fd 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java @@ -341,7 +341,7 @@ public static Map getHighestEnchantmentsInItemBowls(@NotNu bowlStacks.add(enchanterBlockEntity.virtualInventoryIncludingBowlStacks.getStack(2 + i)); } - return SpectrumEnchantmentHelper.collectHighestEnchantments(bowlStacks); + return SpectrumEnchantmentHelper.collectHighestEnchantments(bowlStacks, SpectrumEnchantmentTags.ENCHANTER_BLACKLIST); } public static int getRequiredExperienceToEnchantCenterItem(@NotNull EnchanterBlockEntity enchanterBlockEntity) { diff --git a/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java b/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java index 216054bc0e..53ce1c0548 100644 --- a/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java +++ b/src/main/java/de/dafuqs/spectrum/helpers/SpectrumEnchantmentHelper.java @@ -8,6 +8,7 @@ import net.minecraft.item.*; import net.minecraft.nbt.*; import net.minecraft.registry.*; +import net.minecraft.registry.tag.*; import net.minecraft.util.*; import org.jetbrains.annotations.*; @@ -141,19 +142,41 @@ public static boolean hasEnchantmentThatConflictsWith(ItemStack itemStack, Encha return false; } - public static Map collectHighestEnchantments(List itemStacks) { + //This instance of collectHighestEnchantments is to enable the use of an optional filter + public static Map collectHighestEnchantments(List itemStacks, TagKey blacklist) { Map enchantmentLevelMap = new LinkedHashMap<>(); - for (ItemStack itemStack : itemStacks) { Map itemStackEnchantments = EnchantmentHelper.get(itemStack); for (Enchantment enchantment : itemStackEnchantments.keySet()) { int level = itemStackEnchantments.get(enchantment); - if (SpectrumEnchantmentTags.isIn(SpectrumEnchantmentTags.ENCHANTER_BLACKLIST, enchantment)) { + if (SpectrumEnchantmentTags.isIn(blacklist, enchantment)) { continue; } - if (enchantmentLevelMap.containsKey(enchantment)) { + if (enchantmentLevelMap.containsKey(enchantment)) { + int storedLevel = enchantmentLevelMap.get(enchantment); + if (level > storedLevel) { + enchantmentLevelMap.put(enchantment, level); + } + } else { + enchantmentLevelMap.put(enchantment, level); + } + } + } + + return enchantmentLevelMap; + } + + //The filterless version of the method above + public static Map collectHighestEnchantments(List itemStacks) { + Map enchantmentLevelMap = new LinkedHashMap<>(); + for (ItemStack itemStack : itemStacks) { + Map itemStackEnchantments = EnchantmentHelper.get(itemStack); + for (Enchantment enchantment : itemStackEnchantments.keySet()) { + int level = itemStackEnchantments.get(enchantment); + + if (enchantmentLevelMap.containsKey(enchantment)) { int storedLevel = enchantmentLevelMap.get(enchantment); if (level > storedLevel) { enchantmentLevelMap.put(enchantment, level); diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumEnchantmentTags.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumEnchantmentTags.java index 87fb4568e8..2d3abf9216 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumEnchantmentTags.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumEnchantmentTags.java @@ -12,7 +12,7 @@ public class SpectrumEnchantmentTags { public static final TagKey SPECTRUM_ENCHANTMENT = of("enchantments"); - public static final TagKey ENCHANTER_BLACKLIST = of("enchanter_blacklisted_enchantments"); + public static final TagKey ENCHANTER_BLACKLIST = of("enchanter_copying_and_applying_blacklisted"); private static TagKey of(String id) { return TagKey.of(RegistryKeys.ENCHANTMENT, SpectrumCommon.locate(id)); @@ -24,10 +24,7 @@ public static boolean isIn(TagKey tag, Enchantment enchantment) { return false; } Optional> registryEntry = Registries.ENCHANTMENT.getEntry(optionalKey.get()); - if (registryEntry.isEmpty()) { - return false; - } - return Registries.ENCHANTMENT.getOrCreateEntryList(tag).contains(registryEntry.get()); + return registryEntry.filter(enchantmentReference -> Registries.ENCHANTMENT.getOrCreateEntryList(tag).contains(enchantmentReference)).isPresent(); } } diff --git a/src/main/resources/data/spectrum/tags/enchantment/enchanter_copying_and_applying_blacklisted.json b/src/main/resources/data/spectrum/tags/enchantment/enchanter_copying_and_applying_blacklisted.json new file mode 100644 index 0000000000..f72d209df7 --- /dev/null +++ b/src/main/resources/data/spectrum/tags/enchantment/enchanter_copying_and_applying_blacklisted.json @@ -0,0 +1,3 @@ +{ + "values": [] +} \ No newline at end of file From abd1bd5934f5e9ceb9d261f24ede2ed4a5fe799e Mon Sep 17 00:00:00 2001 From: Shibva <38770780+Shibva@users.noreply.github.com> Date: Sun, 22 Feb 2026 01:28:46 -0500 Subject: [PATCH 4/5] Blacklist-egge Time II; Prechanting Boogaloo - Did the same thing but with items now, only difference it only for the copying while the applying still works if its on the central item - The purpose of this is to restrict items that may come pre-enchanted if a modpack developer decides to restrict them (I figured id do this too while I was at it) - Copied and retooled the `isIn()` method in `SpectrumEnchantmentTags` for `SpectrumItemTags` (and it worked!) - Created a new blank tag named `enchanter_copying_and_applying_item_blacklisted`, empty by default - Tested it again EXTRA: Moved `Malum` Compat back under the connector restricted check due to differences throwing NoSuchField errors (thanks Farbicators of Create Porting Lib >:L ) --- .../blocks/enchanter/EnchanterBlockEntity.java | 4 +++- .../compat/SpectrumIntegrationPacks.java | 6 +++++- .../spectrum/registries/SpectrumItemTags.java | 17 ++++++++++++++++- ...r_copying_and_applying_item_blacklisted.json | 3 +++ 4 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/data/spectrum/tags/items/enchanter_copying_and_applying_item_blacklisted.json diff --git a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java index 4ee4cd47fd..cdea142c2d 100644 --- a/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java +++ b/src/main/java/de/dafuqs/spectrum/blocks/enchanter/EnchanterBlockEntity.java @@ -338,7 +338,9 @@ public static void enchantCenterItem(@NotNull EnchanterBlockEntity enchanterBloc public static Map getHighestEnchantmentsInItemBowls(@NotNull EnchanterBlockEntity enchanterBlockEntity) { List bowlStacks = new ArrayList<>(); for (int i = 0; i < 8; i++) { - bowlStacks.add(enchanterBlockEntity.virtualInventoryIncludingBowlStacks.getStack(2 + i)); + if (!SpectrumItemTags.isIn(SpectrumItemTags.ENCHANTER_ITEM_BLACKLIST, enchanterBlockEntity.virtualInventoryIncludingBowlStacks.getStack(2 + i).getItem())) { + bowlStacks.add(enchanterBlockEntity.virtualInventoryIncludingBowlStacks.getStack(2 + i)); + } } return SpectrumEnchantmentHelper.collectHighestEnchantments(bowlStacks, SpectrumEnchantmentTags.ENCHANTER_BLACKLIST); diff --git a/src/main/java/de/dafuqs/spectrum/compat/SpectrumIntegrationPacks.java b/src/main/java/de/dafuqs/spectrum/compat/SpectrumIntegrationPacks.java index ba86f6e61d..8c31193d27 100644 --- a/src/main/java/de/dafuqs/spectrum/compat/SpectrumIntegrationPacks.java +++ b/src/main/java/de/dafuqs/spectrum/compat/SpectrumIntegrationPacks.java @@ -63,14 +63,18 @@ public static void register() { registerIntegrationPack(CREATE_ID, () -> new CreateCompat()); registerIntegrationPack(FARMERSDELIGHT_ID, () -> new FDCompat()); registerIntegrationPack(GOBBER_ID, () -> new GobberCompat()); - registerIntegrationPack(MALUM_ID, () -> new MalumCompat()); registerIntegrationPack(NEEPMEAT_ID, () -> new NEEPMeatCompat()); if (!CONNECTOR_LOADED) { // Traveler's Backpack for Forge crashes due to Fabric lacking Fluid#getFluidType (a Forge method) // This cannot be reasonably worked around AFAIK // ~unilock, 2025 + + //Malum for Fabric uses Create Porter Lib, Atemps to register enchantments though it create NoSuchField errors + // Needs replacement or hacky workaround + // ~Shibva, 2026 registerIntegrationPack(TRAVELERS_BACKPACK_ID, () -> new TravelersBackpackCompat()); + registerIntegrationPack(MALUM_ID, () -> new MalumCompat()); } for (ModIntegrationPack container : INTEGRATION_PACKS.values()) { diff --git a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemTags.java b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemTags.java index 6454fdea33..b330101627 100644 --- a/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemTags.java +++ b/src/main/java/de/dafuqs/spectrum/registries/SpectrumItemTags.java @@ -1,11 +1,15 @@ package de.dafuqs.spectrum.registries; import de.dafuqs.spectrum.*; +import net.minecraft.enchantment.*; import net.minecraft.item.*; import net.minecraft.registry.*; +import net.minecraft.registry.entry.*; import net.minecraft.registry.tag.*; import net.minecraft.util.*; +import java.util.*; + public class SpectrumItemTags { // "c" namespace @@ -32,7 +36,9 @@ public class SpectrumItemTags { public static final TagKey TAG_FILTERING_ITEMS = of("tag_filtering_items"); public static final TagKey WEEPING_GALA_LOGS = of("weeping_gala_logs"); public static final TagKey PLAYER_ATTRIBUTED_PLACEMENT = of("player_attributed_placement"); - + + public static final TagKey ENCHANTER_ITEM_BLACKLIST = of("enchanter_copying_and_applying_item_blacklisted"); + private static TagKey of(String id) { return TagKey.of(RegistryKeys.ITEM, SpectrumCommon.locate(id)); } @@ -41,4 +47,13 @@ private static TagKey common(String id) { return TagKey.of(RegistryKeys.ITEM, new Identifier("c", id)); } + public static boolean isIn(TagKey tag, Item item) { + Optional> optionalKey = Registries.ITEM.getKey(item); + if (optionalKey.isEmpty()) { + return false; + } + Optional> registryEntry = Registries.ITEM.getEntry(optionalKey.get()); + return registryEntry.filter(itemReference -> Registries.ITEM.getOrCreateEntryList(tag).contains(itemReference)).isPresent(); + } + } diff --git a/src/main/resources/data/spectrum/tags/items/enchanter_copying_and_applying_item_blacklisted.json b/src/main/resources/data/spectrum/tags/items/enchanter_copying_and_applying_item_blacklisted.json new file mode 100644 index 0000000000..6bcb7251b6 --- /dev/null +++ b/src/main/resources/data/spectrum/tags/items/enchanter_copying_and_applying_item_blacklisted.json @@ -0,0 +1,3 @@ +{ + "values": [ "minecraft:diamond_sword"] +} \ No newline at end of file From 9e7bf2a6d344b5ac392fced05a8ae1879f3787c3 Mon Sep 17 00:00:00 2001 From: Shibva <38770780+Shibva@users.noreply.github.com> Date: Sun, 22 Feb 2026 01:29:40 -0500 Subject: [PATCH 5/5] forgot to remove the test item from the tag, whoopsie --- .../items/enchanter_copying_and_applying_item_blacklisted.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/data/spectrum/tags/items/enchanter_copying_and_applying_item_blacklisted.json b/src/main/resources/data/spectrum/tags/items/enchanter_copying_and_applying_item_blacklisted.json index 6bcb7251b6..f72d209df7 100644 --- a/src/main/resources/data/spectrum/tags/items/enchanter_copying_and_applying_item_blacklisted.json +++ b/src/main/resources/data/spectrum/tags/items/enchanter_copying_and_applying_item_blacklisted.json @@ -1,3 +1,3 @@ { - "values": [ "minecraft:diamond_sword"] + "values": [] } \ No newline at end of file