From 784f6680c19a708485f49a82b7dffdbdda2607fa Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 22 May 2021 02:49:01 +0800 Subject: Simplify code in DefaultCraftingDisplay and NbtHasherProviderImpl --- .../autocrafting/DefaultRecipeBookHandler.java | 4 +- .../shedaniel/rei/plugin/common/BuiltinPlugin.java | 2 +- .../shedaniel/rei/plugin/common/DefaultPlugin.java | 15 +++---- .../displays/crafting/DefaultCraftingDisplay.java | 51 +++++++++------------- .../displays/crafting/DefaultCustomDisplay.java | 48 ++++++-------------- .../displays/crafting/DefaultShapedDisplay.java | 44 +++++-------------- .../displays/crafting/DefaultShapelessDisplay.java | 44 +++++-------------- 7 files changed, 65 insertions(+), 143 deletions(-) (limited to 'default-plugin/src') diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java index e59c35ce9..78cef89a0 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java @@ -52,7 +52,7 @@ public class DefaultRecipeBookHandler implements TransferHandler { if (container == null) return Result.createNotApplicable(); if (display instanceof DefaultCraftingDisplay) { - DefaultCraftingDisplay craftingDisplay = (DefaultCraftingDisplay) display; + DefaultCraftingDisplay craftingDisplay = (DefaultCraftingDisplay) display; if (craftingDisplay.getOptionalRecipe().isPresent()) { int h = -1, w = -1; if (container instanceof CraftingMenu) { @@ -64,7 +64,7 @@ public class DefaultRecipeBookHandler implements TransferHandler { } if (h == -1 || w == -1) return Result.createNotApplicable(); - Recipe recipe = (craftingDisplay).getOptionalRecipe().get(); + Recipe recipe = craftingDisplay.getOptionalRecipe().get(); if (craftingDisplay.getHeight() > h || craftingDisplay.getWidth() > w) return Result.createFailed(new TranslatableComponent("error.rei.transfer.too_small", h, w)); if (!context.getMinecraft().player.getRecipeBook().contains(recipe)) diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/BuiltinPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/BuiltinPlugin.java index 4f2b467e0..94617a5a9 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/BuiltinPlugin.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/BuiltinPlugin.java @@ -34,7 +34,7 @@ import me.shedaniel.rei.plugin.common.displays.cooking.DefaultSmokingDisplay; import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCraftingDisplay; public interface BuiltinPlugin { - CategoryIdentifier CRAFTING = CategoryIdentifier.of("minecraft", "plugins/crafting"); + CategoryIdentifier> CRAFTING = CategoryIdentifier.of("minecraft", "plugins/crafting"); CategoryIdentifier SMELTING = CategoryIdentifier.of("minecraft", "plugins/smelting"); CategoryIdentifier SMOKING = CategoryIdentifier.of("minecraft", "plugins/smoking"); CategoryIdentifier BLASTING = CategoryIdentifier.of("minecraft", "plugins/blasting"); diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java index a4cf1fd7c..fe7aa4ca8 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java @@ -59,20 +59,19 @@ import net.minecraft.world.level.material.Fluid; import java.util.List; import java.util.function.Function; -import java.util.function.ToLongFunction; import java.util.stream.Stream; public class DefaultPlugin implements BuiltinPlugin, REIServerPlugin { @Override public void registerItemComparators(ItemComparatorRegistry registry) { - ToLongFunction nbtHasher = EntryComparator.nbtHasher(); + EntryComparator nbtHasher = EntryComparator.nbt(); Function enchantmentTag = stack -> { CompoundTag tag = stack.getTag(); if (tag == null) return null; if (!tag.contains("Enchantments", NbtType.LIST)) return null; return tag.getList("Enchantments", NbtType.COMPOUND); }; - registry.register((context, stack) -> nbtHasher.applyAsLong(enchantmentTag.apply(stack)), Items.ENCHANTED_BOOK); + registry.register((context, stack) -> nbtHasher.hash(context, enchantmentTag.apply(stack)), Items.ENCHANTED_BOOK); registry.registerNbt(Items.POTION); registry.registerNbt(Items.SPLASH_POTION); registry.registerNbt(Items.LINGERING_POTION); @@ -104,7 +103,7 @@ public class DefaultPlugin implements BuiltinPlugin, REIServerPlugin { @Override public void registerDisplaySerializer(DisplaySerializerRegistry registry) { - registry.register(CRAFTING, DefaultCraftingDisplay.Serializer.INSTANCE); + registry.register(CRAFTING, DefaultCraftingDisplay.serializer()); registry.register(SMELTING, DefaultCookingDisplay.serializer(DefaultSmeltingDisplay::new)); registry.register(SMOKING, DefaultCookingDisplay.serializer(DefaultSmokingDisplay::new)); registry.register(BLASTING, DefaultCookingDisplay.serializer(DefaultBlastingDisplay::new)); @@ -124,15 +123,15 @@ public class DefaultPlugin implements BuiltinPlugin, REIServerPlugin { @Override public void registerMenuInfo(MenuInfoRegistry registry) { - registry.register(BuiltinPlugin.CRAFTING, CraftingMenu.class, new RecipeBookGridMenuInfo() { + registry.register(BuiltinPlugin.CRAFTING, CraftingMenu.class, new RecipeBookGridMenuInfo>() { @Override - public List> getInputs(MenuInfoContext context) { + public List> getInputs(MenuInfoContext> context) { return context.getDisplay().getOrganisedInputEntries(this, context.getMenu()); } }); - registry.register(BuiltinPlugin.CRAFTING, InventoryMenu.class, new RecipeBookGridMenuInfo() { + registry.register(BuiltinPlugin.CRAFTING, InventoryMenu.class, new RecipeBookGridMenuInfo>() { @Override - public List> getInputs(MenuInfoContext context) { + public List> getInputs(MenuInfoContext> context) { return context.getDisplay().getOrganisedInputEntries(this, context.getMenu()); } }); diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java index 97dc31e2d..979bf82ea 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java @@ -23,18 +23,14 @@ package me.shedaniel.rei.plugin.common.displays.crafting; -import me.shedaniel.architectury.utils.NbtType; import me.shedaniel.rei.api.common.category.CategoryIdentifier; -import me.shedaniel.rei.api.common.display.SimpleDisplaySerializer; import me.shedaniel.rei.api.common.display.SimpleMenuDisplay; +import me.shedaniel.rei.api.common.display.basic.BasicDisplay; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; -import me.shedaniel.rei.api.common.registry.RecipeManagerContext; import me.shedaniel.rei.api.common.transfer.info.simple.SimpleGridMenuInfo; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.api.common.util.EntryIngredients; import me.shedaniel.rei.plugin.common.BuiltinPlugin; -import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; @@ -45,15 +41,29 @@ import java.util.Collections; import java.util.List; import java.util.Optional; -public abstract class DefaultCraftingDisplay implements SimpleMenuDisplay { +public abstract class DefaultCraftingDisplay> extends BasicDisplay implements SimpleMenuDisplay { + protected Optional recipe; + + public DefaultCraftingDisplay(List inputs, List outputs, Optional recipe) { + super(inputs, outputs, Optional.empty()); + this.recipe = recipe; + } + @Override public CategoryIdentifier getCategoryIdentifier() { return BuiltinPlugin.CRAFTING; } - public abstract Optional> getOptionalRecipe(); + public Optional getOptionalRecipe() { + return recipe; + } - public List> getOrganisedInputEntries(SimpleGridMenuInfo menuInfo, T container) { + @Override + public Optional getDisplayLocation() { + return getOptionalRecipe().map(Recipe::getId); + } + + public List> getOrganisedInputEntries(SimpleGridMenuInfo> menuInfo, T container) { List> list = new ArrayList<>(menuInfo.getCraftingWidth(container) * menuInfo.getCraftingHeight(container)); for (int i = 0; i < menuInfo.getCraftingWidth(container) * menuInfo.getCraftingHeight(container); i++) { list.add(Collections.emptyList()); @@ -66,7 +76,7 @@ public abstract class DefaultCraftingDisplay implements SimpleMenuDisplay { return list; } - public static int getSlotWithSize(DefaultCraftingDisplay recipeDisplay, int index, int craftingGridWidth) { + public static int getSlotWithSize(DefaultCraftingDisplay recipeDisplay, int index, int craftingGridWidth) { return getSlotWithSize(recipeDisplay.getWidth(), index, craftingGridWidth); } @@ -76,26 +86,7 @@ public abstract class DefaultCraftingDisplay implements SimpleMenuDisplay { return craftingGridWidth * y + x; } - public enum Serializer implements SimpleDisplaySerializer { - INSTANCE; - - @Override - public DefaultCraftingDisplay read(CompoundTag tag) { - List input = EntryIngredients.read(tag.getList("input", NbtType.LIST)); - List output = EntryIngredients.read(tag.getList("output", NbtType.LIST)); - Recipe optionalRecipe; - if (tag.contains("recipe", NbtType.STRING)) { - optionalRecipe = RecipeManagerContext.getInstance().getRecipeManager().byKey(new ResourceLocation(tag.getString("recipe"))).orElse(null); - } else { - optionalRecipe = null; - } - return new DefaultCustomDisplay(optionalRecipe, input, output); - } - - @Override - public CompoundTag saveExtra(CompoundTag tag, DefaultCraftingDisplay display) { - display.getOptionalRecipe().ifPresent(recipe -> tag.putString("recipe", recipe.getId().toString())); - return tag; - } + public static BasicDisplay.Serializer> serializer() { + return BasicDisplay.Serializer.ofSimple(DefaultCustomDisplay::simple); } } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCustomDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCustomDisplay.java index 9557805fa..243b0e575 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCustomDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCustomDisplay.java @@ -23,31 +23,29 @@ package me.shedaniel.rei.plugin.common.displays.crafting; -import com.google.common.collect.ImmutableList; +import me.shedaniel.architectury.utils.NbtType; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.registry.RecipeManagerContext; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.crafting.Recipe; +import org.jetbrains.annotations.Nullable; import java.util.BitSet; import java.util.List; import java.util.Optional; -public class DefaultCustomDisplay extends DefaultCraftingDisplay { - private List input; - private List output; - private Recipe possibleRecipe; - private int width, height; +public class DefaultCustomDisplay extends DefaultCraftingDisplay> { + private int width; + private int height; - public DefaultCustomDisplay(Recipe possibleRecipe, List input, List output) { - this.input = ImmutableList.copyOf(input); - this.output = output; - this.possibleRecipe = possibleRecipe; + public DefaultCustomDisplay(@Nullable Recipe possibleRecipe, List input, List output) { + super(input, output, Optional.ofNullable(possibleRecipe)); BitSet row = new BitSet(3); BitSet column = new BitSet(3); for (int i = 0; i < 9; i++) - if (i < this.input.size()) { - List> stacks = this.input.get(i); + if (i < input.size()) { + List> stacks = input.get(i); if (stacks.stream().anyMatch(stack -> !stack.isEmpty())) { row.set((i - (i % 3)) / 3); column.set(i % 3); @@ -57,28 +55,10 @@ public class DefaultCustomDisplay extends DefaultCraftingDisplay { this.height = column.cardinality(); } - protected Optional> getRecipe() { - return Optional.ofNullable(possibleRecipe); - } - - @Override - public Optional getDisplayLocation() { - return getRecipe().map(Recipe::getId); - } - - @Override - public List getInputEntries() { - return input; - } - - @Override - public List getOutputEntries() { - return output; - } - - @Override - public Optional> getOptionalRecipe() { - return Optional.ofNullable(possibleRecipe); + public static DefaultCustomDisplay simple(List input, List output, Optional location) { + Recipe optionalRecipe = location.flatMap(resourceLocation -> RecipeManagerContext.getInstance().getRecipeManager().byKey(resourceLocation)) + .orElse(null); + return new DefaultCustomDisplay(optionalRecipe, input, output); } @Override diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapedDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapedDisplay.java index 68a089f69..34c745918 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapedDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapedDisplay.java @@ -23,54 +23,30 @@ package me.shedaniel.rei.plugin.common.displays.crafting; -import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.util.EntryIngredients; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.ShapedRecipe; import java.util.Collections; -import java.util.List; import java.util.Optional; -public class DefaultShapedDisplay extends DefaultCraftingDisplay { - private ShapedRecipe display; - private List input; - private EntryIngredient output; - +public class DefaultShapedDisplay extends DefaultCraftingDisplay { public DefaultShapedDisplay(ShapedRecipe recipe) { - this.display = recipe; - this.input = EntryIngredients.ofIngredients(recipe.getIngredients()); - this.output = EntryIngredients.of(recipe.getResultItem()); - } - - @Override - public Optional getDisplayLocation() { - return Optional.ofNullable(display).map(ShapedRecipe::getId); - } - - @Override - public List getInputEntries() { - return input; - } - - @Override - public List getOutputEntries() { - return Collections.singletonList(output); - } - - @Override - public Optional> getOptionalRecipe() { - return Optional.ofNullable(display); + super( + EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())), + Optional.of(recipe) + ); } + @SuppressWarnings("OptionalGetWithoutIsPresent") @Override public int getWidth() { - return display.getWidth(); + return recipe.get().getWidth(); } + @SuppressWarnings("OptionalGetWithoutIsPresent") @Override public int getHeight() { - return display.getHeight(); + return recipe.get().getHeight(); } } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapelessDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapelessDisplay.java index 99961d9d1..cb17a2696 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapelessDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultShapelessDisplay.java @@ -23,54 +23,30 @@ package me.shedaniel.rei.plugin.common.displays.crafting; -import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.util.EntryIngredients; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.item.crafting.Recipe; import net.minecraft.world.item.crafting.ShapelessRecipe; import java.util.Collections; -import java.util.List; import java.util.Optional; -public class DefaultShapelessDisplay extends DefaultCraftingDisplay { - private ShapelessRecipe display; - private List input; - private EntryIngredient output; - +public class DefaultShapelessDisplay extends DefaultCraftingDisplay { public DefaultShapelessDisplay(ShapelessRecipe recipe) { - this.display = recipe; - this.input = EntryIngredients.ofIngredients(recipe.getIngredients()); - this.output = EntryIngredients.of(recipe.getResultItem()); - } - - @Override - public Optional> getOptionalRecipe() { - return Optional.ofNullable(display); - } - - @Override - public Optional getDisplayLocation() { - return Optional.ofNullable(display).map(ShapelessRecipe::getId); - } - - @Override - public List getInputEntries() { - return input; - } - - @Override - public List getOutputEntries() { - return Collections.singletonList(output); + super( + EntryIngredients.ofIngredients(recipe.getIngredients()), + Collections.singletonList(EntryIngredients.of(recipe.getResultItem())), + Optional.of(recipe) + ); } + @SuppressWarnings("OptionalGetWithoutIsPresent") @Override public int getWidth() { - return display.getIngredients().size() > 4 ? 3 : 2; + return recipe.get().getIngredients().size() > 4 ? 3 : 2; } + @SuppressWarnings("OptionalGetWithoutIsPresent") @Override public int getHeight() { - return display.getIngredients().size() > 4 ? 3 : 2; + return recipe.get().getIngredients().size() > 4 ? 3 : 2; } } -- cgit