From 6bbc58f07c146f47d9714abcd08a7f1c18ef744d Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 1 Apr 2024 22:26:52 +0900 Subject: [PATCH] Add display validator --- .../screen/CompositeDisplayViewingScreen.java | 4 +- .../screen/DefaultDisplayViewingScreen.java | 3 +- .../registry/display/DisplayRegistryImpl.java | 8 ++- .../registry/display/DisplayValidator.java | 54 +++++++++++++++++++ .../assets/roughlyenoughitems/lang/en_us.json | 1 + 5 files changed, 67 insertions(+), 3 deletions(-) create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayValidator.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java index 164682e05..c26331a90 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/CompositeDisplayViewingScreen.java @@ -39,6 +39,7 @@ import me.shedaniel.rei.api.client.registry.category.ButtonArea; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; @@ -47,6 +48,7 @@ import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; import me.shedaniel.rei.impl.display.DisplaySpec; +import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -181,7 +183,7 @@ public void init() { this.widgets.add(Widgets.createClickableLabel(new Point(bounds.x + 4 + scrollListBounds.width / 2, bounds.y + 6), categories.get(selectedCategoryIndex).getTitle(), label -> { ViewSearchBuilder.builder().addAllCategories().open(); - }).tooltip(new TranslatableComponent("text.rei.view_all_categories")).noShadow().color(0xFF404040, 0xFFBBBBBB).hoveredColor(0xFF0041FF, 0xFFFFBD4D)); + }).tooltip(new TranslatableComponent("text.rei.view_all_categories"), new TranslatableComponent("text.rei.view_all_categories.tooltip", CategoryRegistry.getInstance().stream().filter(config -> !DisplayRegistry.getInstance().get(config.getCategoryIdentifier()).isEmpty()).count()).withStyle(ChatFormatting.DARK_GRAY)).noShadow().color(0xFF404040, 0xFFBBBBBB).hoveredColor(0xFF0041FF, 0xFFFFBD4D)); this.widgets.add(new ButtonListWidget(buttonList)); this.children().addAll(widgets); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java index 80ac05371..d2629cd4d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/DefaultDisplayViewingScreen.java @@ -47,6 +47,7 @@ import me.shedaniel.rei.api.client.registry.category.ButtonArea; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; @@ -172,7 +173,7 @@ public void init() { .onClick(button -> previousCategory()).tooltipLine(new TranslatableComponent("text.rei.previous_category"))); this.widgets.add(Widgets.createClickableLabel(new Point(bounds.getCenterX(), bounds.getY() + 7), getCurrentCategory().getTitle(), clickableLabelWidget -> { ViewSearchBuilder.builder().addAllCategories().open(); - }).tooltip(new TranslatableComponent("text.rei.view_all_categories"))); + }).tooltip(new TranslatableComponent("text.rei.view_all_categories"), new TranslatableComponent("text.rei.view_all_categories.tooltip", CategoryRegistry.getInstance().stream().filter(config -> !DisplayRegistry.getInstance().get(config.getCategoryIdentifier()).isEmpty()).count()).withStyle(ChatFormatting.DARK_GRAY))); this.widgets.add(categoryNext = Widgets.createButton(new Rectangle(bounds.getCenterX() + guiWidth / 2 - 17, bounds.getY() + 5, 12, 12), ImmutableTextComponent.EMPTY) .onClick(button -> nextCategory()).tooltipLine(new TranslatableComponent("text.rei.next_category"))); this.categoryBack.setEnabled(categories.size() > 1); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java index 655466211..277ba64d7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java @@ -79,7 +79,9 @@ public void add(Display display, @Nullable Object origin) { lastAddWarning = System.currentTimeMillis(); } - this.displaysHolder.add(display, origin); + if (DisplayValidator.validate(display)) { + this.displaysHolder.add(display, origin); + } } @Override @@ -199,6 +201,10 @@ public void endReload() { } } + for (List displays : getAll().values()) { + displays.removeIf(display -> !DisplayValidator.validate(display)); + } + this.displaysHolder.endReload(); InternalLogger.getInstance().debug("Registered %d displays", displaySize()); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayValidator.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayValidator.java new file mode 100644 index 000000000..6ebd4dbf0 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayValidator.java @@ -0,0 +1,54 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022, 2023 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.impl.client.registry.display; + +import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; +import me.shedaniel.rei.impl.common.InternalLogger; + +public class DisplayValidator { + public static boolean validate(Display display) { + CategoryIdentifier identifier = display.getCategoryIdentifier(); + + try { + CategoryRegistry.CategoryConfiguration configuration = CategoryRegistry.getInstance().get(identifier); + + try { + DisplayCategory category = (DisplayCategory) configuration.getCategory(); + category.getDisplayWidth(display); + return true; + } catch (ClassCastException exception) { + InternalLogger.getInstance().error("Display [%s] %s failed validation check for category [%s] %s", display.getDisplayLocation().orElse(null), display, identifier, configuration.getCategory()); + return false; + } + } catch (NullPointerException exception) { + return true; + } catch (Throwable throwable) { + InternalLogger.getInstance().error("Display [%s] %s failed validation check for category [%s]".formatted(display.getDisplayLocation().orElse(null), display, identifier), throwable); + return false; + } + } +} diff --git a/runtime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json b/runtime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json index 73bcb103a..fa6f3dbd4 100755 --- a/runtime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json +++ b/runtime/src/main/resources/assets/roughlyenoughitems/lang/en_us.json @@ -137,6 +137,7 @@ "text.rei.left_arrow": "<", "text.rei.right_arrow": ">", "text.rei.view_all_categories": "View All Categories", + "text.rei.view_all_categories.tooltip": "%d categories", "text.rei.go_back_first_page": "Back to Page 1", "text.rei.choose_page": "Choose Page", "text.rei.shift_click_to": "Shift-Click to %s",