aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2020-07-01 14:24:22 +0800
committershedaniel <daniel@shedaniel.me>2020-07-01 14:24:22 +0800
commit46a119cac30a87844c96533b1a9c16ab921ce1da (patch)
tree9626a4cdfe61f6a6eab093f964720d5f0ade4ecf /src/main/java
parent07432ff14185f98b79ee66d820ab758432c37177 (diff)
downloadRoughlyEnoughItems-46a119cac30a87844c96533b1a9c16ab921ce1da.tar.gz
RoughlyEnoughItems-46a119cac30a87844c96533b1a9c16ab921ce1da.tar.bz2
RoughlyEnoughItems-46a119cac30a87844c96533b1a9c16ab921ce1da.zip
New Cheating Style: Grab
Signed-off-by: shedaniel <daniel@shedaniel.me>
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java6
-rw-r--r--src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java28
-rw-r--r--src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java25
-rw-r--r--src/main/java/me/shedaniel/rei/api/ClientHelper.java3
-rw-r--r--src/main/java/me/shedaniel/rei/api/ConfigObject.java5
-rw-r--r--src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java8
-rw-r--r--src/main/java/me/shedaniel/rei/gui/config/ItemCheatingStyle.java43
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/EntryListEntryWidget.java98
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java83
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java7
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java80
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ClientHelperImpl.java22
-rw-r--r--src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java10
13 files changed, 296 insertions, 122 deletions
diff --git a/src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java b/src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java
index 928b89cd2..203ee28e7 100644
--- a/src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java
+++ b/src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java
@@ -28,12 +28,6 @@ import io.github.prospector.modmenu.api.ModMenuApi;
import me.shedaniel.rei.api.ConfigManager;
public class REIModMenuEntryPoint implements ModMenuApi {
-
- @Override
- public String getModId() {
- return "roughlyenoughitems";
- }
-
@Override
public ConfigScreenFactory<?> getModConfigScreenFactory() {
return parent -> ConfigManager.getInstance().getConfigScreen(parent);
diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
index 85e8bd694..70027707a 100644
--- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
+++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java
@@ -33,6 +33,8 @@ import me.shedaniel.rei.gui.ContainerScreenOverlay;
import me.shedaniel.rei.impl.*;
import me.shedaniel.rei.tests.plugin.REITestPlugin;
import net.fabricmc.api.ClientModInitializer;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
import net.fabricmc.fabric.api.network.ClientSidePacketRegistry;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.ModContainer;
@@ -71,6 +73,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ApiStatus.Internal
+@Environment(EnvType.CLIENT)
public class RoughlyEnoughItemsCore implements ClientModInitializer {
@ApiStatus.Internal public static final Logger LOGGER = LogManager.getFormatterLogger("REI");
@@ -145,7 +148,7 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
}
public static boolean canUsePackets() {
- return ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET);
+ return ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET) && ClientSidePacketRegistry.INSTANCE.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET);
}
@ApiStatus.Internal
@@ -170,6 +173,10 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
return System.getProperty("rei.test", "false").equals("true");
}
+ public static boolean canDeleteItems() {
+ return hasPermissionToUsePackets() || MinecraftClient.getInstance().interactionManager.hasCreativeInventory();
+ }
+
@SuppressWarnings("deprecation")
@Override
public void onInitializeClient() {
@@ -344,17 +351,22 @@ public class RoughlyEnoughItemsCore implements ClientModInitializer {
});
ClothClientHooks.SCREEN_MOUSE_CLICKED.register((minecraftClient, screen, v, v1, i) -> {
isLeftModePressed = true;
- if (screen instanceof CreativeInventoryScreen)
- if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseClicked(v, v1, i)) {
- screen.setFocused(ScreenHelper.getLastOverlay());
- if (i == 0)
- screen.setDragging(true);
- return ActionResult.SUCCESS;
- }
+ if (ScreenHelper.getOptionalOverlay().isPresent())
+ if (screen instanceof CreativeInventoryScreen)
+ if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseClicked(v, v1, i)) {
+ screen.setFocused(ScreenHelper.getLastOverlay());
+ if (i == 0)
+ screen.setDragging(true);
+ return ActionResult.SUCCESS;
+ }
return ActionResult.PASS;
});
ClothClientHooks.SCREEN_MOUSE_RELEASED.register((minecraftClient, screen, v, v1, i) -> {
isLeftModePressed = false;
+ if (ScreenHelper.getOptionalOverlay().isPresent())
+ if (ScreenHelper.isOverlayVisible() && ScreenHelper.getLastOverlay().mouseReleased(v, v1, i)) {
+ return ActionResult.SUCCESS;
+ }
return ActionResult.PASS;
});
ClothClientHooks.SCREEN_MOUSE_SCROLLED.register((minecraftClient, screen, v, v1, v2) -> {
diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java
index 79bbe802e..c71b371ec 100644
--- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java
+++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java
@@ -27,6 +27,7 @@ import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import io.netty.buffer.Unpooled;
import me.shedaniel.math.api.Executor;
+import me.shedaniel.rei.api.EntryStack;
import me.shedaniel.rei.server.InputSlotCrafter;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.network.ServerSidePacketRegistry;
@@ -34,6 +35,7 @@ import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.container.Container;
import net.minecraft.container.CraftingContainer;
import net.minecraft.container.PlayerContainer;
+import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.network.PacketByteBuf;
import net.minecraft.server.network.ServerPlayerEntity;
@@ -41,6 +43,7 @@ import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
import net.minecraft.util.Identifier;
import net.minecraft.util.Util;
+import net.minecraft.util.math.MathHelper;
import java.util.Comparator;
import java.util.List;
@@ -50,6 +53,7 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer {
public static final Identifier DELETE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "delete_item");
public static final Identifier CREATE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "create_item");
+ public static final Identifier CREATE_ITEMS_GRAB_PACKET = new Identifier("roughlyenoughitems", "create_item_grab");
public static final Identifier CREATE_ITEMS_MESSAGE_PACKET = new Identifier("roughlyenoughitems", "ci_msg");
public static final Identifier MOVE_ITEMS_PACKET = new Identifier("roughlyenoughitems", "move_items");
public static final Identifier NOT_ENOUGH_ITEMS_PACKET = new Identifier("roughlyenoughitems", "og_not_enough");
@@ -84,6 +88,27 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer {
} else
player.addMessage(new TranslatableText("text.rei.failed_cheat_items"), false);
});
+ ServerSidePacketRegistry.INSTANCE.register(CREATE_ITEMS_GRAB_PACKET, (packetContext, packetByteBuf) -> {
+ ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer();
+ if (player.getServer().getPermissionLevel(player.getGameProfile()) < player.getServer().getOpPermissionLevel()) {
+ player.addMessage(new TranslatableText("text.rei.no_permission_cheat").formatted(Formatting.RED), false);
+ return;
+ }
+
+ PlayerInventory inventory = player.inventory;
+ ItemStack itemStack = packetByteBuf.readItemStack();
+ EntryStack stack = EntryStack.create(itemStack.copy());
+ if (!inventory.getCursorStack().isEmpty() && EntryStack.create(inventory.getCursorStack()).equalsIgnoreAmount(stack)) {
+ stack.setAmount(MathHelper.clamp(stack.getAmount() + inventory.getCursorStack().getCount(), 1, stack.getItemStack().getMaxCount()));
+ } else if (!inventory.getCursorStack().isEmpty()) {
+ inventory.setCursorStack(ItemStack.EMPTY);
+ player.updateCursorStack();
+ return;
+ }
+ inventory.setCursorStack(stack.getItemStack().copy());
+ player.updateCursorStack();
+ ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new PacketByteBuf(Unpooled.buffer()).writeItemStack(itemStack.copy()).writeString(player.getEntityName(), 32767));
+ });
ServerSidePacketRegistry.INSTANCE.register(MOVE_ITEMS_PACKET, (packetContext, packetByteBuf) -> {
Identifier category = packetByteBuf.readIdentifier();
ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer();
diff --git a/src/main/java/me/shedaniel/rei/api/ClientHelper.java b/src/main/java/me/shedaniel/rei/api/ClientHelper.java
index 67c99be13..6a46f278d 100644
--- a/src/main/java/me/shedaniel/rei/api/ClientHelper.java
+++ b/src/main/java/me/shedaniel/rei/api/ClientHelper.java
@@ -26,6 +26,8 @@ package me.shedaniel.rei.api;
import me.shedaniel.rei.gui.RecipeScreen;
import me.shedaniel.rei.impl.ClientHelperImpl;
import me.shedaniel.rei.utils.CollectionUtils;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.item.Item;
@@ -41,6 +43,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+@Environment(EnvType.CLIENT)
public interface ClientHelper {
/**
diff --git a/src/main/java/me/shedaniel/rei/api/ConfigObject.java b/src/main/java/me/shedaniel/rei/api/ConfigObject.java
index 448c3ccb8..ffa8c4a72 100644
--- a/src/main/java/me/shedaniel/rei/api/ConfigObject.java
+++ b/src/main/java/me/shedaniel/rei/api/ConfigObject.java
@@ -29,10 +29,13 @@ import me.shedaniel.rei.gui.config.RecipeBorderType;
import me.shedaniel.rei.gui.config.RecipeScreenType;
import me.shedaniel.rei.gui.config.SearchFieldLocation;
import me.shedaniel.rei.impl.ConfigManagerImpl;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
import org.jetbrains.annotations.ApiStatus;
import java.util.List;
+@Environment(EnvType.CLIENT)
public interface ConfigObject {
/**
@@ -56,6 +59,8 @@ public interface ConfigObject {
boolean isUsingDarkTheme();
+ boolean isGrabbingItems();
+
boolean isToastDisplayedOnCopyIdentifier();
boolean doesRenderEntryEnchantmentGlint();
diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
index 95532cbbd..6ab41d865 100644
--- a/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
+++ b/src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java
@@ -250,9 +250,11 @@ public class ContainerScreenOverlay extends WidgetWithBounds {
tooltips += "\n ";
if (!ClientHelper.getInstance().isCheating())
tooltips += "\n" + I18n.translate("text.rei.cheating_disabled");
- else if (!RoughlyEnoughItemsCore.hasOperatorPermission())
- tooltips += "\n" + I18n.translate("text.rei.cheating_enabled_no_perms");
- else if (RoughlyEnoughItemsCore.hasPermissionToUsePackets())
+ else if (!RoughlyEnoughItemsCore.hasOperatorPermission()) {
+ if (minecraft.interactionManager.hasCreativeInventory())
+ tooltips += "\n" + I18n.translate("text.rei.cheating_limited_creative_enabled");
+ else tooltips += "\n" + I18n.translate("text.rei.cheating_enabled_no_perms");
+ } else if (RoughlyEnoughItemsCore.hasPermissionToUsePackets())
tooltips += "\n" + I18n.translate("text.rei.cheating_enabled");
else
tooltips += "\n" + I18n.translate("text.rei.cheating_limited_enabled");
diff --git a/src/main/java/me/shedaniel/rei/gui/config/ItemCheatingStyle.java b/src/main/java/me/shedaniel/rei/gui/config/ItemCheatingStyle.java
new file mode 100644
index 000000000..f1ade70df
--- /dev/null
+++ b/src/main/java/me/shedaniel/rei/gui/config/ItemCheatingStyle.java
@@ -0,0 +1,43 @@
+/*
+ * This file is licensed under the MIT License, part of Roughly Enough Items.
+ * Copyright (c) 2018, 2019, 2020 shedaniel
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package me.shedaniel.rei.gui.config;
+
+import me.shedaniel.clothconfig2.gui.entries.SelectionListEntry;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+import net.minecraft.client.resource.language.I18n;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Locale;
+
+@Environment(EnvType.CLIENT)
+public enum ItemCheatingStyle implements SelectionListEntry.Translatable {
+ GRAB,
+ GIVE;
+
+ @Override
+ public @NotNull String getKey() {
+ return I18n.translate("config.roughlyenoughitems.cheatingStyle." + name().toLowerCase(Locale.ROOT));
+ }
+}
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryListEntryWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryListEntryWidget.java
new file mode 100644
index 000000000..8def60f1a
--- /dev/null
+++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListEntryWidget.java
@@ -0,0 +1,98 @@
+/*
+ * This file is licensed under the MIT License, part of Roughly Enough Items.
+ * Copyright (c) 2018, 2019, 2020 shedaniel
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+package me.shedaniel.rei.gui.widget;
+
+import me.shedaniel.math.Point;
+import me.shedaniel.rei.api.ClientHelper;
+import me.shedaniel.rei.api.ConfigObject;
+import me.shedaniel.rei.api.EntryStack;
+import net.minecraft.client.gui.screen.Screen;
+import net.minecraft.client.util.math.MatrixStack;
+import net.minecraft.item.Item;
+
+import static me.shedaniel.rei.gui.widget.EntryListWidget.entrySize;
+
+public class EntryListEntryWidget extends EntryWidget {
+ public int backupY;
+
+ protected EntryListEntryWidget(Point point) {
+ super(point);
+ this.backupY = point.y;
+ getBounds().width = getBounds().height = entrySize();
+ }
+
+ @Override
+ protected void drawHighlighted(MatrixStack matrices, int mouseX, int mouseY, float delta) {
+ if (!getCurrentEntry().isEmpty())
+ super.drawHighlighted(matrices, mouseX, mouseY, delta);
+ }
+
+ @Override
+ public void queueTooltip(MatrixStack matrices, int mouseX, int mouseY, float delta) {
+ if (ClientHelper.getInstance().isCheating() && !minecraft.player.inventory.getCursorStack().isEmpty()) {
+ return;
+ }
+ super.queueTooltip(matrices, mouseX, mouseY, delta);
+ }
+
+ @Override
+ public boolean mouseReleased(double mouseX, double mouseY, int button) {
+ if (!interactable)
+ return super.mouseReleased(mouseX, mouseY, button);
+ if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating()) {
+ EntryStack entry = getCurrentEntry().copy();
+ if (!entry.isEmpty()) {
+ if (entry.getType() == EntryStack.Type.FLUID) {
+ Item bucketItem = entry.getFluid().getBucketItem();
+ if (bucketItem != null) {
+ entry = EntryStack.create(bucketItem);
+ }
+ }
+ if (entry.getType() == EntryStack.Type.ITEM)
+ entry.setAmount(button != 1 && !Screen.hasShiftDown() ? 1 : entry.getItemStack().getMaxCount());
+ return ClientHelper.getInstance().tryCheatingEntry(entry);
+ }
+ }
+ return super.mouseReleased(mouseX, mouseY, button);
+ }
+
+ @Override
+ protected boolean cancelDeleteItems(EntryStack stack) {
+ if (!interactable || !ConfigObject.getInstance().isGrabbingItems())
+ return super.cancelDeleteItems(stack);
+ if (ClientHelper.getInstance().isCheating()) {
+ EntryStack entry = getCurrentEntry().copy();
+ if (!entry.isEmpty()) {
+ if (entry.getType() == EntryStack.Type.FLUID) {
+ Item bucketItem = entry.getFluid().getBucketItem();
+ if (bucketItem != null) {
+ entry = EntryStack.create(bucketItem);
+ }
+ }
+ return entry.equalsIgnoreAmount(stack);
+ }
+ }
+ return super.cancelDeleteItems(stack);
+ }
+}
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
index 6d68a527a..fd58597b8 100644
--- a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
+++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java
@@ -40,7 +40,6 @@ import me.shedaniel.rei.impl.ScreenHelper;
import me.shedaniel.rei.impl.SearchArgument;
import me.shedaniel.rei.utils.CollectionUtils;
import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.VertexConsumerProvider;
@@ -359,8 +358,23 @@ public class EntryListWidget extends WidgetWithBounds {
}
}
}
- if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating() && !minecraft.player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets())
+ if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating() && !minecraft.player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.canDeleteItems()) {
+ EntryStack stack = EntryStack.create(minecraft.player.inventory.getCursorStack().copy());
+ if (stack.getType() == EntryStack.Type.FLUID) {
+ Item bucketItem = stack.getFluid().getBucketItem();
+ if (bucketItem != null) {
+ stack = EntryStack.create(bucketItem);
+ }
+ }
+ for (Widget child : children()) {
+ if (child.containsMouse(mouseX, mouseY) && child instanceof EntryWidget) {
+ if (((EntryWidget) child).cancelDeleteItems(stack)) {
+ return;
+ }
+ }
+ }
Tooltip.create(new TranslatableText("text.rei.delete_items")).queue();
+ }
}
private int getScrollbarMinX() {
@@ -553,74 +567,37 @@ public class EntryListWidget extends WidgetWithBounds {
if (scrolling.updateDraggingState(double_1, double_2, int_1))
return true;
}
-
- if (containsMouse(double_1, double_2)) {
+ for (Widget widget : children())
+ if (widget.mouseClicked(double_1, double_2, int_1))
+ return true;
+ return false;
+ }
+
+ @Override
+ public boolean mouseReleased(double mouseX, double mouseY, int button) {
+ if (containsMouse(mouseX, mouseY)) {
+ for (Widget widget : children())
+ if (widget.mouseReleased(mouseX, mouseY, button))
+ return true;
ClientPlayerEntity player = minecraft.player;
- if (ClientHelper.getInstance().isCheating() && !player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets()) {
+ if (ClientHelper.getInstance().isCheating() && !player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.canDeleteItems()) {
ClientHelper.getInstance().sendDeletePacket();
return true;
}
if (!player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets())
return false;
- for (Widget widget : children())
- if (widget.mouseClicked(double_1, double_2, int_1))
- return true;
}
return false;
}
- private class EntryListEntry extends EntryWidget {
- private int backupY;
-
+ private class EntryListEntry extends EntryListEntryWidget {
private EntryListEntry(int x, int y) {
super(new Point(x, y));
- this.backupY = y;
- getBounds().width = getBounds().height = entrySize();
- }
-
- @Override
- public void drawBackground(MatrixStack matrices, int mouseX, int mouseY, float delta) {
- super.drawBackground(matrices, mouseX, mouseY, delta);
}
@Override
public boolean containsMouse(double mouseX, double mouseY) {
return super.containsMouse(mouseX, mouseY) && bounds.contains(mouseX, mouseY);
}
-
- @Override
- public void drawHighlighted(MatrixStack matrices, int mouseX, int mouseY, float delta) {
- if (getCurrentEntry().getType() != EntryStack.Type.EMPTY)
- super.drawHighlighted(matrices, mouseX, mouseY, delta);
- }
-
- @Override
- public void queueTooltip(MatrixStack matrices, int mouseX, int mouseY, float delta) {
- if (!ClientHelper.getInstance().isCheating() || minecraft.player.inventory.getCursorStack().isEmpty()) {
- super.queueTooltip(matrices, mouseX, mouseY, delta);
- }
- }
-
- @Override
- public boolean mouseClicked(double mouseX, double mouseY, int button) {
- if (!interactable)
- return super.mouseClicked(mouseX, mouseY, button);
- if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating()) {
- EntryStack entry = getCurrentEntry().copy();
- if (!entry.isEmpty()) {
- if (entry.getType() == EntryStack.Type.FLUID) {
- Item bucketItem = entry.getFluid().getBucketItem();
- if (bucketItem != null) {
- entry = EntryStack.create(bucketItem);
- }
- }
- if (entry.getType() == EntryStack.Type.ITEM)
- entry.setAmount(button != 1 && !Screen.hasShiftDown() ? 1 : entry.getItemStack().getMaxCount());
- ClientHelper.getInstance().tryCheatingEntry(entry);
- return true;
- }
- }
- return super.mouseClicked(mouseX, mouseY, button);
- }
}
}
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java
index d862dcce6..2389fbdc6 100644
--- a/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java
+++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryWidget.java
@@ -349,7 +349,7 @@ public class EntryWidget extends Slot {
}
@Override
- public boolean mouseClicked(double mouseX, double mouseY, int button) {
+ public boolean mouseReleased(double mouseX, double mouseY, int button) {
if (!interactable)
return false;
if (containsMouse(mouseX, mouseY)) {
@@ -361,6 +361,11 @@ public class EntryWidget extends Slot {
return false;
}
+ @ApiStatus.Internal
+ protected boolean cancelDeleteItems(EntryStack stack) {
+ return false;
+ }
+
protected boolean reverseFavoritesAction() {
return false;
}
diff --git a/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java
index e11eceeaf..83b6821e4 100644
--- a/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java
+++ b/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java
@@ -37,8 +37,9 @@ import me.shedaniel.rei.api.widgets.Tooltip;
import me.shedaniel.rei.gui.config.EntryPanelOrdering;
import me.shedaniel.rei.impl.ScreenHelper;
import me.shedaniel.rei.utils.CollectionUtils;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
-import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.item.Item;
@@ -134,8 +135,23 @@ public class FavoritesListWidget extends WidgetWithBounds {
updatePosition(delta);
scrolling.renderScrollBar(0, 1, REIHelper.getInstance().isDarkThemeEnabled() ? 0.8f : 1f);
ScissorsHandler.INSTANCE.removeLastScissor();
- if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating() && !minecraft.player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets())
+ if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating() && !minecraft.player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.canDeleteItems()) {
+ EntryStack stack = EntryStack.create(minecraft.player.inventory.getCursorStack().copy());
+ if (stack.getType() == EntryStack.Type.FLUID) {
+ Item bucketItem = stack.getFluid().getBucketItem();
+ if (bucketItem != null) {
+ stack = EntryStack.create(bucketItem);
+ }
+ }
+ for (Widget child : children()) {
+ if (child.containsMouse(mouseX, mouseY) && child instanceof EntryWidget) {
+ if (((EntryWidget) child).cancelDeleteItems(stack)) {
+ return;
+ }
+ }
+ }
Tooltip.create(new TranslatableText("text.rei.delete_items")).queue();
+ }
}
@Override
@@ -243,29 +259,32 @@ public class FavoritesListWidget extends WidgetWithBounds {
public boolean mouseClicked(double double_1, double double_2, int int_1) {
if (scrolling.updateDraggingState(double_1, double_2, int_1))
return true;
-
- if (containsMouse(double_1, double_2)) {
+ for (Widget widget : children())
+ if (widget.mouseClicked(double_1, double_2, int_1))
+ return true;
+ return false;
+ }
+
+ @Override
+ public boolean mouseReleased(double mouseX, double mouseY, int button) {
+ if (containsMouse(mouseX, mouseY)) {
+ for (Widget widget : children())
+ if (widget.mouseReleased(mouseX, mouseY, button))
+ return true;
ClientPlayerEntity player = minecraft.player;
- if (ClientHelper.getInstance().isCheating() && !player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets()) {
+ if (ClientHelper.getInstance().isCheating() && !player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.canDeleteItems()) {
ClientHelper.getInstance().sendDeletePacket();
return true;
}
if (!player.inventory.getCursorStack().isEmpty() && RoughlyEnoughItemsCore.hasPermissionToUsePackets())
return false;
- for (Widget widget : children())
- if (widget.mouseClicked(double_1, double_2, int_1))
- return true;
}
return false;
}
- private class EntryListEntry extends EntryWidget {
- private int backupY;
-
+ private class EntryListEntry extends EntryListEntryWidget {
private EntryListEntry(int x, int y) {
super(new Point(x, y));
- this.backupY = y;
- getBounds().width = getBounds().height = entrySize();
}
@Override
@@ -274,43 +293,8 @@ public class FavoritesListWidget extends WidgetWithBounds {
}
@Override
- protected void drawHighlighted(MatrixStack matrices, int mouseX, int mouseY, float delta) {
- if (!getCurrentEntry().isEmpty())
- super.drawHighlighted(matrices, mouseX, mouseY, delta);
- }
-
- @Override
protected boolean reverseFavoritesAction() {
return true;
}
-
- @Override
- public void queueTooltip(MatrixStack matrices, int mouseX, int mouseY, float delta) {
- if (!ClientHelper.getInstance().isCheating() || minecraft.player.inventory.getCursorStack().isEmpty()) {
- super.queueTooltip(matrices, mouseX, mouseY, delta);
- }
- }
-
- @Override
- public boolean mouseClicked(double mouseX, double mouseY, int button) {
- if (!interactable)
- return super.mouseClicked(mouseX, mouseY, button);
- if (containsMouse(mouseX, mouseY) && ClientHelper.getInstance().isCheating()) {
- EntryStack entry = getCurrentEntry().copy();
- if (!entry.isEmpty()) {
- if (entry.getType() == EntryStack.Type.FLUID) {
- Item bucketItem = entry.getFluid().getBucketItem();
- if (bucketItem != null) {
- entry = EntryStack.create(bucketItem);
- }
- }
- if (entry.getType() == EntryStack.Type.ITEM)
- entry.setAmount(button != 1 && !Screen.hasShiftDown() ? 1 : entry.getItemStack().getMaxCount());
- ClientHelper.getInstance().tryCheatingEntry(entry);
- return true;
- }
- }
- return super.mouseC