aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java45
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java2
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java102
-rw-r--r--src/main/java/me/shedaniel/rei/server/InputSlotCrafter.java2
4 files changed, 134 insertions, 17 deletions
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java
index 9c080455a..1600c95e2 100644
--- a/src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java
+++ b/src/main/java/me/shedaniel/rei/gui/widget/AutoCraftingButtonWidget.java
@@ -5,6 +5,7 @@
package me.shedaniel.rei.gui.widget;
+import com.google.common.collect.Lists;
import it.unimi.dsi.fastutil.ints.IntList;
import me.shedaniel.math.api.Point;
import me.shedaniel.math.api.Rectangle;
@@ -20,12 +21,13 @@ import net.minecraft.util.math.MathHelper;
import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;
+import java.util.stream.Collectors;
public class AutoCraftingButtonWidget extends ButtonWidget {
private final Supplier<RecipeDisplay> displaySupplier;
private String extraTooltip;
- private String errorTooltip;
+ private List<String> errorTooltip;
private List<Widget> setupDisplay;
private AbstractContainerScreen<?> containerScreen;
private boolean visible = false;
@@ -61,7 +63,7 @@ public class AutoCraftingButtonWidget extends ButtonWidget {
@Override
public void render(int mouseX, int mouseY, float delta) {
this.enabled = false;
- String error = null;
+ List<String> error = null;
int color = 0;
visible = false;
IntList redSlots = null;
@@ -74,9 +76,14 @@ public class AutoCraftingButtonWidget extends ButtonWidget {
if (result.isSuccessful()) {
enabled = true;
error = null;
+ color = 0;
+ redSlots = null;
break;
- } else if (error == null) {
- error = result.getErrorKey();
+ } else if (result.isApplicable()) {
+ if (error == null) {
+ error = Lists.newArrayList();
+ }
+ error.add(result.getErrorKey());
color = result.getColor();
redSlots = result.getIntegers();
}
@@ -86,12 +93,17 @@ public class AutoCraftingButtonWidget extends ButtonWidget {
}
if (!visible) {
enabled = false;
- error = "error.rei.no.handlers.applicable";
+ if (error == null) {
+ error = Lists.newArrayList();
+ } else {
+ error.clear();
+ }
+ error.add("error.rei.no.handlers.applicable");
}
if (isHovered(mouseX, mouseY) && category instanceof TransferRecipeCategory && redSlots != null) {
((TransferRecipeCategory<RecipeDisplay>) category).renderRedSlots(setupDisplay, displayBounds, displaySupplier.get(), redSlots);
}
- errorTooltip = error;
+ errorTooltip = error == null || error.isEmpty() ? null : error;
int x = getBounds().x, y = getBounds().y, width = getBounds().width, height = getBounds().height;
minecraft.getTextureManager().bindTexture(ScreenHelper.isDarkModeEnabled() ? BUTTON_LOCATION_DARK : BUTTON_LOCATION);
RenderHelper.color4f(1.0F, 1.0F, 1.0F, 1.0F);
@@ -139,14 +151,17 @@ public class AutoCraftingButtonWidget extends ButtonWidget {
@Override
public Optional<String> getTooltips() {
- if (this.minecraft.options.advancedItemTooltips)
- if (errorTooltip == null)
- return Optional.ofNullable(I18n.translate("text.auto_craft.move_items") + extraTooltip);
- else
- return Optional.ofNullable(Formatting.RED.toString() + I18n.translate(errorTooltip) + extraTooltip);
- if (errorTooltip == null)
- return Optional.ofNullable(I18n.translate("text.auto_craft.move_items"));
- else
- return Optional.ofNullable(Formatting.RED.toString() + I18n.translate(errorTooltip));
+ String str = "";
+ if (errorTooltip == null) {
+ str += I18n.translate("text.auto_craft.move_items");
+ } else {
+ if (errorTooltip.size() > 1)
+ str += Formatting.RED.toString() + I18n.translate("error.rei.multi.errors") + "\n";
+ str += errorTooltip.stream().map(s -> Formatting.RED.toString() + (errorTooltip.size() > 1 ? "- " : "") + I18n.translate(s)).collect(Collectors.joining("\n"));
+ }
+ if (this.minecraft.options.advancedItemTooltips) {
+ str += extraTooltip;
+ }
+ return Optional.of(str);
}
}
diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java
index bead236f2..34acd8e03 100644
--- a/src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java
+++ b/src/main/java/me/shedaniel/rei/plugin/DefaultAutoCraftingPlugin.java
@@ -9,6 +9,7 @@ import me.shedaniel.rei.RoughlyEnoughItemsCore;
import me.shedaniel.rei.api.RecipeHelper;
import me.shedaniel.rei.api.plugins.REIPluginV0;
import me.shedaniel.rei.plugin.autocrafting.DefaultCategoryHandler;
+import me.shedaniel.rei.plugin.autocrafting.DefaultRecipeBookHandler;
import net.fabricmc.loader.api.SemanticVersion;
import net.fabricmc.loader.util.version.VersionParsingException;
import net.minecraft.util.Identifier;
@@ -33,5 +34,6 @@ public class DefaultAutoCraftingPlugin implements REIPluginV0 {
return;
}
recipeHelper.registerAutoCraftingHandler(new DefaultCategoryHandler());
+ recipeHelper.registerAutoCraftingHandler(new DefaultRecipeBookHandler());
}
}
diff --git a/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java b/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java
new file mode 100644
index 000000000..e138f99ec
--- /dev/null
+++ b/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultRecipeBookHandler.java
@@ -0,0 +1,102 @@
+package me.shedaniel.rei.plugin.autocrafting;
+
+import me.shedaniel.rei.api.AutoTransferHandler;
+import me.shedaniel.rei.api.RecipeDisplay;
+import me.shedaniel.rei.impl.ScreenHelper;
+import me.shedaniel.rei.listeners.RecipeBookGuiHooks;
+import me.shedaniel.rei.plugin.blasting.DefaultBlastingDisplay;
+import me.shedaniel.rei.plugin.crafting.DefaultCraftingDisplay;
+import me.shedaniel.rei.plugin.smelting.DefaultSmeltingDisplay;
+import me.shedaniel.rei.plugin.smoking.DefaultSmokingDisplay;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.gui.screen.recipebook.RecipeBookProvider;
+import net.minecraft.client.resource.language.I18n;
+import net.minecraft.container.CraftingContainer;
+import net.minecraft.container.CraftingTableContainer;
+import net.minecraft.container.PlayerContainer;
+import net.minecraft.recipe.Recipe;
+
+public class DefaultRecipeBookHandler implements AutoTransferHandler {
+ @Override
+ public Result handle(Context context) {
+ RecipeDisplay display = context.getRecipe();
+ if (!(context.getContainer() instanceof CraftingContainer))
+ return Result.createNotApplicable();
+ CraftingContainer<?> container = (CraftingContainer<?>) context.getContainer();
+ if (display instanceof DefaultCraftingDisplay) {
+ DefaultCraftingDisplay craftingDisplay = (DefaultCraftingDisplay) display;
+ if (craftingDisplay.getOptionalRecipe().isPresent()) {
+ int h = -1, w = -1;
+ if (container instanceof CraftingTableContainer) {
+ h = 3;
+ w = 3;
+ } else if (container instanceof PlayerContainer) {
+ h = 2;
+ w = 2;
+ }
+ if (h == -1 || w == -1)
+ return Result.createNotApplicable();
+ Recipe<?> recipe = (craftingDisplay).getOptionalRecipe().get();
+ if (craftingDisplay.getHeight() > h || craftingDisplay.getWidth() > w)
+ return Result.createFailed(I18n.translate("error.rei.transfer.too_small", h, w));
+ if (!context.getMinecraft().player.getRecipeBook().contains(recipe))
+ return Result.createFailed(I18n.translate("error.rei.recipe.not.unlocked"));
+ if (!context.isActuallyCrafting())
+ return Result.createSuccessful();
+ context.getMinecraft().openScreen(context.getContainerScreen());
+ if (context.getContainerScreen() instanceof RecipeBookProvider)
+ ((RecipeBookGuiHooks) ((RecipeBookProvider) context.getContainerScreen()).getRecipeBookGui()).rei_getGhostSlots().reset();
+ context.getMinecraft().interactionManager.clickRecipe(container.syncId, recipe, Screen.hasShiftDown());
+ ScreenHelper.getLastOverlay().init();
+ }
+ } else if (display instanceof DefaultSmeltingDisplay) {
+ DefaultSmeltingDisplay defaultDisplay = (DefaultSmeltingDisplay) display;
+ if (defaultDisplay.getOptionalRecipe().isPresent()) {
+ Recipe<?> recipe = (defaultDisplay).getOptionalRecipe().get();
+ if (!context.getMinecraft().player.getRecipeBook().contains(recipe))
+ return Result.createFailed(I18n.translate("error.rei.recipe.not.unlocked"));
+ if (!context.isActuallyCrafting())
+ return Result.createSuccessful();
+ context.getMinecraft().openScreen(context.getContainerScreen());
+ if (context.getContainerScreen() instanceof RecipeBookProvider)
+ ((RecipeBookGuiHooks) ((RecipeBookProvider) context.getContainerScreen()).getRecipeBookGui()).rei_getGhostSlots().reset();
+ context.getMinecraft().interactionManager.clickRecipe(container.syncId, recipe, Screen.hasShiftDown());
+ ScreenHelper.getLastOverlay().init();
+ }
+ } else if (display instanceof DefaultSmokingDisplay) {
+ DefaultSmokingDisplay defaultDisplay = (DefaultSmokingDisplay) display;
+ if (defaultDisplay.getOptionalRecipe().isPresent()) {
+ Recipe<?> recipe = (defaultDisplay).getOptionalRecipe().get();
+ if (!context.getMinecraft().player.getRecipeBook().contains(recipe))
+ return Result.createFailed(I18n.translate("error.rei.recipe.not.unlocked"));
+ if (!context.isActuallyCrafting())
+ return Result.createSuccessful();
+ context.getMinecraft().openScreen(context.getContainerScreen());
+ if (context.getContainerScreen() instanceof RecipeBookProvider)
+ ((RecipeBookGuiHooks) ((RecipeBookProvider) context.getContainerScreen()).getRecipeBookGui()).rei_getGhostSlots().reset();
+ context.getMinecraft().interactionManager.clickRecipe(container.syncId, recipe, Screen.hasShiftDown());
+ ScreenHelper.getLastOverlay().init();
+ }
+ } else if (display instanceof DefaultBlastingDisplay) {
+ DefaultBlastingDisplay defaultDisplay = (DefaultBlastingDisplay) display;
+ if (defaultDisplay.getOptionalRecipe().isPresent()) {
+ Recipe<?> recipe = (defaultDisplay).getOptionalRecipe().get();
+ if (!context.getMinecraft().player.getRecipeBook().contains(recipe))
+ return Result.createFailed(I18n.translate("error.rei.recipe.not.unlocked"));
+ if (!context.isActuallyCrafting())
+ return Result.createSuccessful();
+ context.getMinecraft().openScreen(context.getContainerScreen());
+ if (context.getContainerScreen() instanceof RecipeBookProvider)
+ ((RecipeBookGuiHooks) ((RecipeBookProvider) context.getContainerScreen()).getRecipeBookGui()).rei_getGhostSlots().reset();
+ context.getMinecraft().interactionManager.clickRecipe(container.syncId, recipe, Screen.hasShiftDown());
+ ScreenHelper.getLastOverlay().init();
+ }
+ }
+ return Result.createNotApplicable();
+ }
+
+ @Override
+ public double getPriority() {
+ return -20;
+ }
+}
diff --git a/src/main/java/me/shedaniel/rei/server/InputSlotCrafter.java b/src/main/java/me/shedaniel/rei/server/InputSlotCrafter.java
index 206a05319..c049a19d2 100644
--- a/src/main/java/me/shedaniel/rei/server/InputSlotCrafter.java
+++ b/src/main/java/me/shedaniel/rei/server/InputSlotCrafter.java
@@ -61,12 +61,10 @@ public class InputSlotCrafter<C extends Inventory> implements RecipeGridAligner<
} else {
this.returnInputs();
craftingContainer.sendContentUpdates();
- player.inventory.markDirty();
throw new NullPointerException();
}
craftingContainer.sendContentUpdates();
- player.inventory.markDirty();
}
}