Unknown 6 éve
szülő
commit
c0eaaac17c

+ 5 - 0
CHANGELOG.md

@@ -1,4 +1,9 @@
 View full changelog [here](https://github.com/shedaniel/RoughlyEnoughItems/blob/1.14/CHANGELOG.md).
+## v2.8.1+build.102
+- Fixed: Server incorrect permission check
+- Fixed: Base Bounds not correctly resizing
+- Improved: Search Field
+- Added: Right Click for Item Searching ![image](https://cdn.discordapp.com/attachments/530305137382653952/573838234333741064/unknown.png)
 ## v2.8.1+build.101
 - Updated [#77](https://github.com/shedaniel/RoughlyEnoughItems/pull/77): Updated Simplified Chinese by XuyuEre
 - Updated: Updated Traditional Chinese by XuyuEre & Danielshe

+ 1 - 1
gradle.properties

@@ -1,4 +1,4 @@
-mod_version=2.8.1+build.101
+mod_version=2.8.1+build.102
 minecraft_version=1.14
 yarn_version=1.14+build.5
 fabricloader_version=0.4.6+build.141

+ 6 - 2
src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java

@@ -20,16 +20,20 @@ public class RoughlyEnoughItemsNetwork implements ModInitializer {
     public void onInitialize() {
         ServerSidePacketRegistry.INSTANCE.register(DELETE_ITEMS_PACKET, (packetContext, packetByteBuf) -> {
             ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer();
+            if (player.getServer().getPermissionLevel(player.getGameProfile()) < player.getServer().getOpPermissionLevel()) {
+                player.addChatMessage(new TranslatableTextComponent("text.rei.no_permission_cheat").applyFormat(TextFormat.RED), false);
+                return;
+            }
             if (!player.inventory.getCursorStack().isEmpty())
                 player.inventory.setCursorStack(ItemStack.EMPTY);
         });
         ServerSidePacketRegistry.INSTANCE.register(CREATE_ITEMS_PACKET, (packetContext, packetByteBuf) -> {
             ServerPlayerEntity player = (ServerPlayerEntity) packetContext.getPlayer();
-            ItemStack stack = packetByteBuf.readItemStack();
-            if (!player.getServer().getCommandSource().hasPermissionLevel(1)) {
+            if (player.getServer().getPermissionLevel(player.getGameProfile()) < player.getServer().getOpPermissionLevel()) {
                 player.addChatMessage(new TranslatableTextComponent("text.rei.no_permission_cheat").applyFormat(TextFormat.RED), false);
                 return;
             }
+            ItemStack stack = packetByteBuf.readItemStack();
             if (player.inventory.insertStack(stack.copy()))
                 player.addChatMessage(new StringTextComponent(I18n.translate("text.rei.cheat_items").replaceAll("\\{item_name}", ItemListOverlay.tryGetItemStackName(stack.copy())).replaceAll("\\{item_count}", stack.copy().getAmount() + "").replaceAll("\\{player_name}", player.getEntityName())), false);
             else

+ 6 - 2
src/main/java/me/shedaniel/rei/client/BaseBoundsHandlerImpl.java

@@ -1,7 +1,9 @@
 package me.shedaniel.rei.client;
 
 import com.google.common.collect.Lists;
+import me.shedaniel.rei.RoughlyEnoughItemsCore;
 import me.shedaniel.rei.api.BaseBoundsHandler;
+import me.shedaniel.rei.api.DisplayHelper;
 import net.minecraft.client.MinecraftClient;
 import net.minecraft.client.gui.Screen;
 import net.minecraft.util.ActionResult;
@@ -52,10 +54,12 @@ public class BaseBoundsHandlerImpl implements BaseBoundsHandler {
     @Override
     public boolean shouldRecalculateArea(boolean isOnRightSide, Rectangle rectangle) {
         if (lastArea == null) {
-            lastArea = getStringFromAreas(rectangle, getCurrentExclusionZones(MinecraftClient.getInstance().currentScreen.getClass(), isOnRightSide));
+            DisplayHelper.DisplayBoundsHandler handler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
+            lastArea = getStringFromAreas(isOnRightSide ? handler.getRightBounds(MinecraftClient.getInstance().currentScreen) : handler.getLeftBounds(MinecraftClient.getInstance().currentScreen), getCurrentExclusionZones(MinecraftClient.getInstance().currentScreen.getClass(), isOnRightSide));
             return false;
         }
-        String fromAreas = getStringFromAreas(rectangle, getCurrentExclusionZones(MinecraftClient.getInstance().currentScreen.getClass(), isOnRightSide));
+        DisplayHelper.DisplayBoundsHandler handler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
+        String fromAreas = getStringFromAreas(isOnRightSide ? handler.getRightBounds(MinecraftClient.getInstance().currentScreen) : handler.getLeftBounds(MinecraftClient.getInstance().currentScreen), getCurrentExclusionZones(MinecraftClient.getInstance().currentScreen.getClass(), isOnRightSide));
         if (lastArea.contentEquals(fromAreas))
             return false;
         lastArea = fromAreas;

+ 2 - 1
src/main/java/me/shedaniel/rei/client/ScreenHelper.java

@@ -2,6 +2,7 @@ package me.shedaniel.rei.client;
 
 import com.google.common.collect.Lists;
 import me.shedaniel.rei.gui.ContainerScreenOverlay;
+import me.shedaniel.rei.gui.widget.SearchFieldWidget;
 import me.shedaniel.rei.listeners.ContainerScreenHooks;
 import net.fabricmc.api.ClientModInitializer;
 import net.fabricmc.fabric.api.event.client.ClientTickCallback;
@@ -16,7 +17,7 @@ import java.util.List;
 
 public class ScreenHelper implements ClientModInitializer {
     
-    public static ContainerScreenOverlay.SearchFieldWidget searchField;
+    public static SearchFieldWidget searchField;
     public static List<ItemStack> inventoryStacks = Lists.newArrayList();
     private static boolean overlayVisible = true;
     private static ContainerScreenOverlay overlay;

+ 8 - 2
src/main/java/me/shedaniel/rei/client/SearchArgument.java

@@ -1,18 +1,24 @@
 package me.shedaniel.rei.client;
 
 import java.util.function.Function;
+import java.util.regex.Pattern;
 
 public class SearchArgument {
     
     public static final Function<Integer, Boolean> INCLUDE = integer -> integer > -1;
-    public static final Function<Integer, Boolean> NOT_INCLUDE = integer -> !INCLUDE.apply(integer);
+    public static final Function<Integer, Boolean> NOT_INCLUDE = integer -> integer <= -1;
     private ArgumentType argumentType;
     private String text;
     private boolean include;
+    private Pattern pattern;
     
     public SearchArgument(ArgumentType argumentType, String text, boolean include) {
+        this(argumentType, text, include, true);
+    }
+    
+    public SearchArgument(ArgumentType argumentType, String text, boolean include, boolean autoLowerCase) {
         this.argumentType = argumentType;
-        this.text = text;
+        this.text = autoLowerCase ? text.toLowerCase() : text;
         this.include = include;
     }
     

+ 10 - 24
src/main/java/me/shedaniel/rei/gui/ContainerScreenOverlay.java

@@ -17,6 +17,7 @@ import net.minecraft.client.render.GuiLighting;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.client.util.Window;
 import net.minecraft.client.world.ClientWorld;
+import net.minecraft.container.Slot;
 import net.minecraft.item.ItemStack;
 import net.minecraft.sound.SoundEvents;
 import net.minecraft.text.TranslatableTextComponent;
@@ -334,6 +335,15 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
             DisplayHelper.DisplayBoundsHandler boundsHandler = RoughlyEnoughItemsCore.getDisplayHelper().getResponsibleBoundsHandler(MinecraftClient.getInstance().currentScreen.getClass());
             itemListOverlay.updateList(boundsHandler, boundsHandler.getItemListArea(rectangle), page, searchTerm, true);
         }
+        if (SearchFieldWidget.isSearching) {
+            GuiLighting.disable();
+            blitOffset = 400;
+            int left = ScreenHelper.getLastContainerScreenHooks().rei_getContainerLeft(), top = ScreenHelper.getLastContainerScreenHooks().rei_getContainerTop();
+            for(Slot slot : ScreenHelper.getLastContainerScreen().getContainer().slotList)
+                if (!slot.hasStack() || !itemListOverlay.getCurrentDisplayed().stream().anyMatch(stack -> stack.isEqualIgnoreTags(slot.getStack())))
+                    fillGradient(left + slot.xPosition, top + slot.yPosition, left + slot.xPosition + 16, top + slot.yPosition + 16, -601874400, -601874400);
+            blitOffset = 0;
+        }
         GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F);
         GuiLighting.disable();
         this.renderWidgets(mouseX, mouseY, delta);
@@ -505,28 +515,4 @@ public class ContainerScreenOverlay extends AbstractParentElement implements Dra
         return false;
     }
     
-    public static class SearchFieldWidget extends TextFieldWidget {
-        public SearchFieldWidget(int x, int y, int width, int height) {
-            super(x, y, width, height);
-        }
-        
-        public void laterRender(int int_1, int int_2, float float_1) {
-            GuiLighting.disable();
-            GlStateManager.disableDepthTest();
-            super.render(int_1, int_2, float_1);
-            GlStateManager.enableDepthTest();
-        }
-        
-        @Override
-        public boolean mouseClicked(double double_1, double double_2, int int_1) {
-            if (isVisible() && getBounds().contains(double_1, double_2) && int_1 == 1)
-                setText("");
-            return super.mouseClicked(double_1, double_2, int_1);
-        }
-        
-        @Override
-        public void render(int int_1, int int_2, float float_1) {
-        }
-    }
-    
 }

+ 9 - 6
src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java

@@ -32,6 +32,7 @@ import java.util.stream.Collectors;
 
 public class ItemListOverlay extends Widget {
     
+    private static final String SPACE = " ", EMPTY = "";
     private static List<Item> searchBlacklisted = Lists.newArrayList();
     private final List<ItemStack> currentDisplayed;
     private List<Widget> widgets;
@@ -226,7 +227,7 @@ public class ItemListOverlay extends Widget {
         });
         if (splitSearchTerm.length == 0)
             stacks.addAll(os);
-        List<ItemStack> workingItems = RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() && inventoryItems.size() > 0 ? Lists.newArrayList() : Lists.newArrayList(ol);
+        List<ItemStack> workingItems = RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled() && !stacks.isEmpty() && !inventoryItems.isEmpty() ? Lists.newArrayList() : Lists.newArrayList(ol);
         if (RoughlyEnoughItemsCore.getConfigManager().isCraftableOnlyEnabled()) {
             RecipeHelper.getInstance().findCraftableByItems(inventoryItems).forEach(workingItems::add);
             workingItems.addAll(inventoryItems);
@@ -244,18 +245,20 @@ public class ItemListOverlay extends Widget {
     }
     
     private boolean filterItem(ItemStack itemStack, SearchArgument... arguments) {
+        if (arguments.length == 0)
+            return true;
         String mod = ClientHelper.getModFromItem(itemStack.getItem()).toLowerCase();
-        String tooltips = tryGetItemStackToolTip(itemStack, false).stream().skip(1).collect(Collectors.joining("")).replaceAll(" ", "").toLowerCase();
-        String name = tryGetItemStackName(itemStack).replaceAll(" ", "").toLowerCase();
+        String tooltips = tryGetItemStackToolTip(itemStack, false).stream().skip(1).collect(Collectors.joining("")).replace(SPACE, EMPTY).toLowerCase();
+        String name = tryGetItemStackName(itemStack).replace(SPACE, EMPTY).toLowerCase();
         for(SearchArgument argument : arguments) {
             if (argument.getArgumentType().equals(SearchArgument.ArgumentType.MOD))
-                if (SearchArgument.getFunction(!argument.isInclude()).apply(mod.indexOf(argument.getText().toLowerCase())))
+                if (SearchArgument.getFunction(!argument.isInclude()).apply(mod.indexOf(argument.getText())))
                     return false;
             if (argument.getArgumentType().equals(SearchArgument.ArgumentType.TOOLTIP))
-                if (SearchArgument.getFunction(!argument.isInclude()).apply(tooltips.indexOf(argument.getText().toLowerCase())))
+                if (SearchArgument.getFunction(!argument.isInclude()).apply(tooltips.indexOf(argument.getText())))
                     return false;
             if (argument.getArgumentType().equals(SearchArgument.ArgumentType.TEXT))
-                if (SearchArgument.getFunction(!argument.isInclude()).apply(name.indexOf(argument.getText().toLowerCase())))
+                if (SearchArgument.getFunction(!argument.isInclude()).apply(name.indexOf(argument.getText())))
                     return false;
         }
         return true;

+ 57 - 0
src/main/java/me/shedaniel/rei/gui/widget/SearchFieldWidget.java

@@ -0,0 +1,57 @@
+package me.shedaniel.rei.gui.widget;
+
+import com.mojang.blaze3d.platform.GlStateManager;
+import net.minecraft.client.audio.PositionedSoundInstance;
+import net.minecraft.client.render.GuiLighting;
+import net.minecraft.sound.SoundEvents;
+
+public class SearchFieldWidget extends TextFieldWidget {
+    
+    public static boolean isSearching = false;
+    protected long lastClickedTime = -1;
+    
+    public SearchFieldWidget(int x, int y, int width, int height) {
+        super(x, y, width, height);
+    }
+    
+    public void laterRender(int int_1, int int_2, float float_1) {
+        GuiLighting.disable();
+        GlStateManager.disableDepthTest();
+        setEditableColor(isSearching ? -1313241 : 14737632);
+        super.render(int_1, int_2, float_1);
+        GlStateManager.enableDepthTest();
+    }
+    
+    @Override
+    public void renderBorder() {
+        if (!isSearching)
+            super.renderBorder();
+        else {
+            fill(this.getBounds().x - 1, this.getBounds().y - 1, this.getBounds().x + this.getBounds().width + 1, this.getBounds().y + this.getBounds().height + 1, -1313241);
+            fill(this.getBounds().x, this.getBounds().y, this.getBounds().x + this.getBounds().width, this.getBounds().y + this.getBounds().height, -16777216);
+        }
+    }
+    
+    @Override
+    public boolean mouseClicked(double double_1, double double_2, int int_1) {
+        boolean contains = isHighlighted(double_1, double_2);
+        if (isVisible() && contains && int_1 == 1)
+            setText("");
+        if (contains && int_1 == 0)
+            if (lastClickedTime == -1)
+                lastClickedTime = System.currentTimeMillis();
+            else if (System.currentTimeMillis() - lastClickedTime > 1200)
+                lastClickedTime = -1;
+            else {
+                lastClickedTime = -1;
+                isSearching = !isSearching;
+                minecraft.getSoundManager().play(PositionedSoundInstance.master(SoundEvents.UI_BUTTON_CLICK, 1.0F));
+            }
+        return super.mouseClicked(double_1, double_2, int_1);
+    }
+    
+    @Override
+    public void render(int int_1, int int_2, float float_1) {
+    }
+    
+}

+ 8 - 4
src/main/java/me/shedaniel/rei/gui/widget/TextFieldWidget.java

@@ -377,12 +377,16 @@ public class TextFieldWidget extends HighlightableWidget {
         }
     }
     
+    public void renderBorder() {
+        if (this.hasBorder()) {
+            fill(this.bounds.x - 1, this.bounds.y - 1, this.bounds.x + this.bounds.width + 1, this.bounds.y + this.bounds.height + 1, -6250336);
+            fill(this.bounds.x, this.bounds.y, this.bounds.x + this.bounds.width, this.bounds.y + this.bounds.height, -16777216);
+        }
+    }
+    
     public void render(int int_1, int int_2, float float_1) {
         if (this.isVisible()) {
-            if (this.hasBorder()) {
-                fill(this.bounds.x - 1, this.bounds.y - 1, this.bounds.x + this.bounds.width + 1, this.bounds.y + this.bounds.height + 1, -6250336);
-                fill(this.bounds.x, this.bounds.y, this.bounds.x + this.bounds.width, this.bounds.y + this.bounds.height, -16777216);
-            }
+            renderBorder();
             
             int color = this.editable ? this.editableColor : this.notEditableColor;
             int int_4 = this.cursorMax - this.field_2103;