diff options
| author | Unknown <shekwancheung0528@gmail.com> | 2019-08-17 17:05:59 +0800 |
|---|---|---|
| committer | Unknown <shekwancheung0528@gmail.com> | 2019-08-17 17:05:59 +0800 |
| commit | 5c91a6654e697fdadde79508f3ef994936e4b952 (patch) | |
| tree | c2d47385603b038dedcba893a7242bc4c04bb5b3 /src/main/java/me/shedaniel/rei/plugin | |
| parent | dab398882cd64f6152078f59ba768e4ffd437ba3 (diff) | |
| download | RoughlyEnoughItems-5c91a6654e697fdadde79508f3ef994936e4b952.tar.gz RoughlyEnoughItems-5c91a6654e697fdadde79508f3ef994936e4b952.tar.bz2 RoughlyEnoughItems-5c91a6654e697fdadde79508f3ef994936e4b952.zip | |
Finishing the auto crafting API
Diffstat (limited to 'src/main/java/me/shedaniel/rei/plugin')
| -rw-r--r-- | src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java | 14 | ||||
| -rw-r--r-- | src/main/java/me/shedaniel/rei/plugin/DefaultServerContainerPlugin.java | 17 | ||||
| -rw-r--r-- | src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java (renamed from src/main/java/me/shedaniel/rei/plugin/autocrafting/AutoCraftingHandler.java) | 76 | ||||
| -rw-r--r-- | src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingDisplay.java | 19 | ||||
| -rw-r--r-- | src/main/java/me/shedaniel/rei/plugin/containers/CraftingContainerInfoWrapper.java | 50 | ||||
| -rw-r--r-- | src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingDisplay.java | 27 | ||||
| -rw-r--r-- | src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingDisplay.java | 21 | ||||
| -rw-r--r-- | src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingDisplay.java | 20 |
8 files changed, 191 insertions, 53 deletions
diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java index 8bcbe5083..ff59c1148 100644 --- a/src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java @@ -8,10 +8,7 @@ package me.shedaniel.rei.plugin; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.plugins.REIPluginV0; -import me.shedaniel.rei.plugin.autocrafting.AutoBlastingBookHandler; -import me.shedaniel.rei.plugin.autocrafting.AutoCraftingHandler; -import me.shedaniel.rei.plugin.autocrafting.AutoFurnaceBookHandler; -import me.shedaniel.rei.plugin.autocrafting.AutoSmokerBookHandler; +import me.shedaniel.rei.plugin.autocrafting.DefaultCategoryHandler; import net.fabricmc.loader.api.SemanticVersion; import net.fabricmc.loader.util.version.VersionParsingException; import net.minecraft.util.Identifier; @@ -37,10 +34,9 @@ public class DefaultAutoCraftingPlugin implements REIPluginV0 { } // recipeHelper.registerAutoCraftingHandler(new AutoCraftingTableBookHandler()); // recipeHelper.registerAutoCraftingHandler(new AutoInventoryBookHandler()); - recipeHelper.registerAutoCraftingHandler(new AutoFurnaceBookHandler()); - recipeHelper.registerAutoCraftingHandler(new AutoSmokerBookHandler()); - recipeHelper.registerAutoCraftingHandler(new AutoBlastingBookHandler()); - recipeHelper.registerAutoCraftingHandler(new AutoCraftingHandler()); + // recipeHelper.registerAutoCraftingHandler(new AutoFurnaceBookHandler()); + // recipeHelper.registerAutoCraftingHandler(new AutoSmokerBookHandler()); + // recipeHelper.registerAutoCraftingHandler(new AutoBlastingBookHandler()); + recipeHelper.registerAutoCraftingHandler(new DefaultCategoryHandler()); } - } diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultServerContainerPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultServerContainerPlugin.java new file mode 100644 index 000000000..d192cf39e --- /dev/null +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultServerContainerPlugin.java @@ -0,0 +1,17 @@ +package me.shedaniel.rei.plugin; + +import me.shedaniel.rei.plugin.containers.CraftingContainerInfoWrapper; +import me.shedaniel.rei.server.ContainerInfoHandler; +import net.minecraft.container.*; +import net.minecraft.util.Identifier; + +public class DefaultServerContainerPlugin implements Runnable { + @Override + public void run() { + ContainerInfoHandler.registerContainerInfo(new Identifier("minecraft", "plugins/crafting"), new CraftingContainerInfoWrapper(CraftingTableContainer.class)); + ContainerInfoHandler.registerContainerInfo(new Identifier("minecraft", "plugins/crafting"), new CraftingContainerInfoWrapper(PlayerContainer.class)); + ContainerInfoHandler.registerContainerInfo(new Identifier("minecraft", "plugins/smelting"), new CraftingContainerInfoWrapper(FurnaceContainer.class)); + ContainerInfoHandler.registerContainerInfo(new Identifier("minecraft", "plugins/smoking"), new CraftingContainerInfoWrapper(SmokerContainer.class)); + ContainerInfoHandler.registerContainerInfo(new Identifier("minecraft", "plugins/blasting"), new CraftingContainerInfoWrapper(BlastFurnaceContainer.class)); + } +} diff --git a/src/main/java/me/shedaniel/rei/plugin/autocrafting/AutoCraftingHandler.java b/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java index f99a8734b..c12d7e809 100644 --- a/src/main/java/me/shedaniel/rei/plugin/autocrafting/AutoCraftingHandler.java +++ b/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java @@ -5,64 +5,60 @@ package me.shedaniel.rei.plugin.autocrafting; -import com.google.common.collect.Lists; import io.netty.buffer.Unpooled; +import it.unimi.dsi.fastutil.ints.IntArrayList; +import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.rei.RoughlyEnoughItemsNetwork; import me.shedaniel.rei.api.AutoTransferHandler; +import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.listeners.RecipeBookGuiHooks; -import me.shedaniel.rei.plugin.crafting.DefaultCraftingCategory; -import me.shedaniel.rei.plugin.crafting.DefaultCraftingDisplay; -import me.shedaniel.rei.plugin.crafting.DefaultShapedDisplay; +import me.shedaniel.rei.server.ContainerInfo; +import me.shedaniel.rei.server.ContainerInfoHandler; import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Screen; -import net.minecraft.client.gui.screen.ingame.CraftingTableScreen; -import net.minecraft.client.gui.screen.ingame.InventoryScreen; +import net.minecraft.client.gui.screen.ingame.AbstractContainerScreen; import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider; -import net.minecraft.container.CraftingContainer; +import net.minecraft.client.resource.language.I18n; +import net.minecraft.container.Container; import net.minecraft.item.ItemStack; import net.minecraft.util.DefaultedList; import net.minecraft.util.PacketByteBuf; import java.util.List; -public class AutoCraftingHandler implements AutoTransferHandler { +public class DefaultCategoryHandler implements AutoTransferHandler { + @Override public Result handle(Context context) { - if (!(context.getRecipe() instanceof DefaultCraftingDisplay)) + if (!(context.getRecipe() instanceof TransferRecipeDisplay)) + return Result.createNotApplicable(); + TransferRecipeDisplay recipe = (TransferRecipeDisplay) context.getRecipe(); + if (!ContainerInfoHandler.isCategoryHandled(recipe.getRecipeCategory())) return Result.createNotApplicable(); - if (!(context.getContainerScreen() instanceof CraftingTableScreen) && !(context.getContainerScreen() instanceof InventoryScreen)) + AbstractContainerScreen<?> containerScreen = context.getContainerScreen(); + Container container = containerScreen.getContainer(); + ContainerInfo containerInfo = ContainerInfoHandler.getContainerInfo(recipe.getRecipeCategory(), container.getClass()); + if (containerInfo == null) return Result.createNotApplicable(); - if (context.getContainerScreen() instanceof InventoryScreen && (((DefaultCraftingDisplay) context.getRecipe()).getWidth() > 2 || ((DefaultCraftingDisplay) context.getRecipe()).getHeight() > 2)) - return Result.createFailed("error.rei.transfer.too_small"); + if (recipe.getHeight() > containerInfo.getCraftingHeight(container) || recipe.getWidth() > containerInfo.getCraftingWidth(container)) + return Result.createFailed(I18n.translate("error.rei.transfer.too_small", containerInfo.getCraftingWidth(container), containerInfo.getCraftingHeight(container))); if (!canUseMovePackets()) return Result.createFailed("error.rei.not.on.server"); - if (!hasItems(context.getRecipe().getInput())) - return Result.createFailed("error.rei.not.enough.materials"); + List<List<ItemStack>> input = recipe.getOrganisedInput(containerInfo, container); + IntList intList = hasItems(input); + if (!intList.isEmpty()) + return Result.createFailed("error.rei.not.enough.materials", intList); if (!context.isActuallyCrafting()) return Result.createSuccessful(); - context.getMinecraft().openScreen(context.getContainerScreen()); - ((RecipeBookGuiHooks) ((RecipeBookProvider) context.getContainerScreen()).getRecipeBookGui()).rei_getGhostSlots().reset(); - DefaultCraftingDisplay display = (DefaultCraftingDisplay) context.getRecipe(); + context.getMinecraft().openScreen(containerScreen); + if (containerScreen instanceof RecipeBookProvider) + ((RecipeBookGuiHooks) ((RecipeBookProvider) containerScreen).getRecipeBookGui()).rei_getGhostSlots().reset(); PacketByteBuf buf = new PacketByteBuf(Unpooled.buffer()); - buf.writeUuid(RoughlyEnoughItemsNetwork.CRAFTING_TABLE_MOVE); + // buf.writeUuid(RoughlyEnoughItemsNetwork.CRAFTING_TABLE_MOVE); + buf.writeIdentifier(recipe.getRecipeCategory()); buf.writeBoolean(Screen.hasShiftDown()); - CraftingContainer craftingContainer = (CraftingContainer) context.getContainer(); - - List<List<ItemStack>> ogInput = display.getInput(); - List<List<ItemStack>> input = Lists.newArrayListWithCapacity(craftingContainer.getCraftingWidth() * craftingContainer.getCraftingHeight()); - for (int i = 0; i < craftingContainer.getCraftingWidth() * craftingContainer.getCraftingHeight(); i++) { - input.add(Lists.newArrayList()); - } - for (int i = 0; i < ogInput.size(); i++) { - List<ItemStack> ogStacks = ogInput.get(i); - if (display instanceof DefaultShapedDisplay) { - if (!ogInput.get(i).isEmpty()) - input.set(DefaultCraftingCategory.getSlotWithSize(display, i), ogInput.get(i)); - } else if (!ogInput.get(i).isEmpty()) - input.set(i, ogInput.get(i)); - } buf.writeInt(input.size()); for (List<ItemStack> stacks : input) { @@ -84,13 +80,15 @@ public class AutoCraftingHandler implements AutoTransferHandler { return ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.MOVE_ITEMS_PACKET); } - public boolean hasItems(List<List<ItemStack>> inputs) { + public IntList hasItems(List<List<ItemStack>> inputs) { // Create a clone of player's inventory, and count DefaultedList<ItemStack> copyMain = DefaultedList.create(); for (ItemStack stack : MinecraftClient.getInstance().player.inventory.main) { copyMain.add(stack.copy()); } - for (List<ItemStack> possibleStacks : inputs) { + IntList intList = new IntArrayList(); + for (int i = 0; i < inputs.size(); i++) { + List<ItemStack> possibleStacks = inputs.get(i); boolean done = possibleStacks.isEmpty(); for (ItemStack possibleStack : possibleStacks) { if (!done) { @@ -105,12 +103,14 @@ public class AutoCraftingHandler implements AutoTransferHandler { } if (invRequiredCount <= 0) { done = true; + break; } } } - if (!done) - return false; + if (!done) { + intList.add(i); + } } - return true; + return intList; } } diff --git a/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingDisplay.java b/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingDisplay.java index cda9d3c6f..d8437887e 100644 --- a/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingDisplay.java +++ b/src/main/java/me/shedaniel/rei/plugin/blasting/DefaultBlastingDisplay.java @@ -6,8 +6,11 @@ package me.shedaniel.rei.plugin.blasting; import me.shedaniel.rei.api.RecipeDisplay; +import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.plugin.DefaultPlugin; +import me.shedaniel.rei.server.ContainerInfo; import net.minecraft.block.entity.FurnaceBlockEntity; +import net.minecraft.container.Container; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.recipe.AbstractCookingRecipe; @@ -20,7 +23,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -public class DefaultBlastingDisplay implements RecipeDisplay { +public class DefaultBlastingDisplay implements TransferRecipeDisplay { private BlastingRecipe display; private List<List<ItemStack>> input; @@ -66,4 +69,18 @@ public class DefaultBlastingDisplay implements RecipeDisplay { return Optional.ofNullable(display); } + @Override + public int getWidth() { + return 1; + } + + @Override + public int getHeight() { + return 1; + } + + @Override + public List<List<ItemStack>> getOrganisedInput(ContainerInfo<Container> containerInfo, Container container) { + return display.getPreviewInputs().stream().map(i -> Arrays.asList(i.getStackArray())).collect(Collectors.toList()); + } } diff --git a/src/main/java/me/shedaniel/rei/plugin/containers/CraftingContainerInfoWrapper.java b/src/main/java/me/shedaniel/rei/plugin/containers/CraftingContainerInfoWrapper.java new file mode 100644 index 000000000..19bd70b38 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/plugin/containers/CraftingContainerInfoWrapper.java @@ -0,0 +1,50 @@ +package me.shedaniel.rei.plugin.containers; + +import me.shedaniel.rei.server.ContainerInfo; +import me.shedaniel.rei.server.RecipeFinder; +import net.minecraft.container.Container; +import net.minecraft.container.CraftingContainer; +import net.minecraft.item.ItemStack; + +public class CraftingContainerInfoWrapper<T extends CraftingContainer<?>> implements ContainerInfo<T> { + private Class<? extends CraftingContainer<?>> containerClass; + + public <T extends CraftingContainer<?>> CraftingContainerInfoWrapper(Class<T> containerClass) { + this.containerClass = containerClass; + } + + @Override + public Class<? extends Container> getContainerClass() { + return containerClass; + } + + @Override + public int getCraftingResultSlotIndex(T container) { + return container.getCraftingResultSlotIndex(); + } + + @Override + public int getCraftingWidth(T container) { + return container.getCraftingWidth(); + } + + @Override + public int getCraftingHeight(T container) { + return container.getCraftingHeight(); + } + + @Override + public void clearCraftingSlots(T container) { + container.clearCraftingSlots(); + } + + @Override + public void populateRecipeFinder(T container, RecipeFinder var1) { + container.populateRecipeFinder(new net.minecraft.recipe.RecipeFinder() { + @Override + public void addNormalItem(ItemStack itemStack_1) { + var1.addNormalItem(itemStack_1); + } + }); + } +} diff --git a/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingDisplay.java b/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingDisplay.java index e0ea0235c..740a7f545 100644 --- a/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingDisplay.java +++ b/src/main/java/me/shedaniel/rei/plugin/crafting/DefaultCraftingDisplay.java @@ -5,28 +5,51 @@ package me.shedaniel.rei.plugin.crafting; -import me.shedaniel.rei.api.RecipeDisplay; +import com.google.common.collect.Lists; +import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.plugin.DefaultPlugin; +import me.shedaniel.rei.server.ContainerInfo; +import net.minecraft.container.Container; +import net.minecraft.item.ItemStack; import net.minecraft.recipe.Recipe; import net.minecraft.util.Identifier; +import java.util.List; import java.util.Optional; -public interface DefaultCraftingDisplay extends RecipeDisplay { +public interface DefaultCraftingDisplay extends TransferRecipeDisplay { @Override default Identifier getRecipeCategory() { return DefaultPlugin.CRAFTING; } + @Override default public int getWidth() { return 2; } + @Override default public int getHeight() { return 2; } Optional<Recipe<?>> getOptionalRecipe(); + @Override + default List<List<ItemStack>> getOrganisedInput(ContainerInfo<Container> containerInfo, Container container) { + List<List<ItemStack>> list = Lists.newArrayListWithCapacity(containerInfo.getCraftingWidth(container) * containerInfo.getCraftingHeight(container)); + for (int i = 0; i < containerInfo.getCraftingWidth(container) * containerInfo.getCraftingHeight(container); i++) { + list.add(Lists.newArrayList()); + } + for (int i = 0; i < getInput().size(); i++) { + List<ItemStack> stacks = getInput().get(i); + if (this instanceof DefaultShapedDisplay) { + if (!stacks.isEmpty()) + list.set(DefaultCraftingCategory.getSlotWithSize(this, i), stacks); + } else if (!stacks.isEmpty()) + list.set(i, stacks); + } + return list; + } } diff --git a/src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingDisplay.java b/src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingDisplay.java index cfe5515d4..81823eedc 100644 --- a/src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingDisplay.java +++ b/src/main/java/me/shedaniel/rei/plugin/smelting/DefaultSmeltingDisplay.java @@ -5,9 +5,11 @@ package me.shedaniel.rei.plugin.smelting; -import me.shedaniel.rei.api.RecipeDisplay; +import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.plugin.DefaultPlugin; +import me.shedaniel.rei.server.ContainerInfo; import net.minecraft.block.entity.FurnaceBlockEntity; +import net.minecraft.container.Container; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.recipe.AbstractCookingRecipe; @@ -20,7 +22,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -public class DefaultSmeltingDisplay implements RecipeDisplay { +public class DefaultSmeltingDisplay implements TransferRecipeDisplay { private SmeltingRecipe display; private List<List<ItemStack>> input; @@ -65,4 +67,19 @@ public class DefaultSmeltingDisplay implements RecipeDisplay { public Optional<SmeltingRecipe> getOptionalRecipe() { return Optional.ofNullable(display); } + + @Override + public int getWidth() { + return 1; + } + + @Override + public int getHeight() { + return 1; + } + + @Override + public List<List<ItemStack>> getOrganisedInput(ContainerInfo<Container> containerInfo, Container container) { + return display.getPreviewInputs().stream().map(i -> Arrays.asList(i.getStackArray())).collect(Collectors.toList()); + } } diff --git a/src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingDisplay.java b/src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingDisplay.java index 7c992751f..0c58b5baa 100644 --- a/src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingDisplay.java +++ b/src/main/java/me/shedaniel/rei/plugin/smoking/DefaultSmokingDisplay.java @@ -6,8 +6,11 @@ package me.shedaniel.rei.plugin.smoking; import me.shedaniel.rei.api.RecipeDisplay; +import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.plugin.DefaultPlugin; +import me.shedaniel.rei.server.ContainerInfo; import net.minecraft.block.entity.FurnaceBlockEntity; +import net.minecraft.container.Container; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.recipe.AbstractCookingRecipe; @@ -20,7 +23,7 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -public class DefaultSmokingDisplay implements RecipeDisplay { +public class DefaultSmokingDisplay implements TransferRecipeDisplay { private SmokingRecipe display; private List<List<ItemStack>> input; @@ -66,4 +69,19 @@ public class DefaultSmokingDisplay implements RecipeDisplay { return Optional.ofNullable(display); } + @Override + public int getWidth() { + return 1; + } + + @Override + public int getHeight() { + return 1; + } + + @Override + public List<List<ItemStack>> getOrganisedInput(ContainerInfo<Container> containerInfo, Container container) { + return display.getPreviewInputs().stream().map(i -> Arrays.asList(i.getStackArray())).collect(Collectors.toList()); + } + } |
