From 2cd3f0737b2008e37f8eaadf479312c60d36e7bc Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 20 Mar 2021 16:40:39 +0800 Subject: Allow customizing what part of REI should animate, disable config screen animation by default Signed-off-by: shedaniel --- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 83 +++++++++++----------- .../me/shedaniel/rei/gui/OverlaySearchField.java | 7 +- .../shedaniel/rei/gui/credits/CreditsScreen.java | 2 +- .../rei/gui/widget/FavoritesListWidget.java | 6 +- .../me/shedaniel/rei/impl/ConfigManagerImpl.java | 6 +- .../me/shedaniel/rei/impl/ConfigObjectImpl.java | 23 +++++- .../me/shedaniel/rei/impl/InternalWidgets.java | 1 + 7 files changed, 74 insertions(+), 54 deletions(-) (limited to 'runtime/src/main') diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index 29fa87e01..926e36a91 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -33,6 +33,7 @@ import me.shedaniel.architectury.networking.NetworkManager; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.REIHelper; +import me.shedaniel.rei.api.REIOverlay; import me.shedaniel.rei.api.config.ConfigObject; import me.shedaniel.rei.api.favorites.FavoriteEntry; import me.shedaniel.rei.api.favorites.FavoriteEntryType; @@ -65,12 +66,10 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.EditBox; -import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.components.ImageButton; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.inventory.CraftingScreen; -import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; -import net.minecraft.client.gui.screens.inventory.InventoryScreen; import net.minecraft.client.gui.screens.recipebook.GhostRecipe; import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener; @@ -441,6 +440,7 @@ public class RoughlyEnoughItemsCore { } private boolean shouldReturn(Screen screen) { + if (!REIHelper.getInstance().getOverlay().isPresent()) return true; if (screen == null) return true; if (screen != Minecraft.getInstance().screen) return true; return shouldReturn(screen.getClass()); @@ -466,92 +466,95 @@ public class RoughlyEnoughItemsCore { final ResourceLocation recipeButtonTex = new ResourceLocation("textures/gui/recipe_button.png"); long[] lastSync = {-1}; RecipeUpdateEvent.EVENT.register(recipeManager -> syncRecipes(lastSync)); - // TODO Make Disable Recipe Book work - /*ClothClientHooks.SCREEN_ADD_BUTTON.register((minecraftClient, screen, abstractButtonWidget) -> { - if (ConfigObject.getInstance().doesDisableRecipeBook() && screen instanceof AbstractContainerScreen && abstractButtonWidget instanceof ImageButton) - if (((ImageButton) abstractButtonWidget).resourceLocation.equals(recipeButtonTex)) - return InteractionResult.FAIL; - return InteractionResult.PASS; - });*/ GuiEvent.INIT_POST.register((screen, widgets, children) -> { REIHelperImpl.getInstance().setPreviousScreen(screen); - if (shouldReturn(screen)) - return; - if (screen instanceof InventoryScreen && client.gameMode.hasInfiniteItems()) - return; - boolean alreadyAdded = false; - for (GuiEventListener element : Lists.newArrayList(children)) - if (ContainerScreenOverlay.class.isAssignableFrom(element.getClass())) - if (alreadyAdded) - children.remove(element); - else - alreadyAdded = true; - if (!alreadyAdded) - children.add(REIHelper.getInstance().getOverlay(true).get()); + if (ConfigObject.getInstance().doesDisableRecipeBook() && screen instanceof AbstractContainerScreen) { + widgets.removeIf(widget -> widget instanceof ImageButton && ((ImageButton) widget).resourceLocation.equals(recipeButtonTex)); + } }); ClientScreenInputEvent.MOUSE_CLICKED_PRE.register((minecraftClient, screen, mouseX, mouseY, button) -> { isLeftModePressed = true; - if (REIHelper.getInstance().getOverlay().isPresent()) - if (screen instanceof CreativeModeInventoryScreen) - if (REIHelper.getInstance().isOverlayVisible() && REIHelper.getInstance().getOverlay().get().mouseClicked(mouseX, mouseY, button)) { - screen.setFocused(REIHelper.getInstance().getOverlay().get()); - if (button == 0) - screen.setDragging(true); - return InteractionResult.SUCCESS; - } + if (shouldReturn(screen)) + return InteractionResult.PASS; + resetFocused(screen); + if (REIHelper.getInstance().isOverlayVisible() && REIHelper.getInstance().getOverlay().get().mouseClicked(mouseX, mouseY, button)) { + if (button == 0) { + screen.setDragging(true); + } + resetFocused(screen); + return InteractionResult.SUCCESS; + } return InteractionResult.PASS; }); ClientScreenInputEvent.MOUSE_RELEASED_PRE.register((minecraftClient, screen, mouseX, mouseY, button) -> { isLeftModePressed = false; if (shouldReturn(screen)) return InteractionResult.PASS; - if (REIHelper.getInstance().getOverlay().isPresent()) - if (REIHelper.getInstance().isOverlayVisible() && REIHelper.getInstance().getOverlay().get().mouseReleased(mouseX, mouseY, button)) { - return InteractionResult.SUCCESS; - } + resetFocused(screen); + if (REIHelper.getInstance().isOverlayVisible() && REIHelper.getInstance().getOverlay().get().mouseReleased(mouseX, mouseY, button) + && resetFocused(screen)) { + return InteractionResult.SUCCESS; + } return InteractionResult.PASS; }); ClientScreenInputEvent.MOUSE_SCROLLED_PRE.register((minecraftClient, screen, mouseX, mouseY, amount) -> { if (shouldReturn(screen)) return InteractionResult.PASS; - if (REIHelper.getInstance().isOverlayVisible() && REIHelper.getInstance().getOverlay().get().mouseScrolled(mouseX, mouseY, amount)) + resetFocused(screen); + if (REIHelper.getInstance().isOverlayVisible() && REIHelper.getInstance().getOverlay().get().mouseScrolled(mouseX, mouseY, amount) + && resetFocused(screen)) return InteractionResult.SUCCESS; return InteractionResult.PASS; }); ClientScreenInputEvent.CHAR_TYPED_PRE.register((minecraftClient, screen, character, keyCode) -> { if (shouldReturn(screen)) return InteractionResult.PASS; - if (REIHelper.getInstance().getOverlay().get().charTyped(character, keyCode)) + resetFocused(screen); + if (REIHelper.getInstance().getOverlay().get().charTyped(character, keyCode) + && resetFocused(screen)) return InteractionResult.SUCCESS; return InteractionResult.PASS; }); GuiEvent.RENDER_POST.register((screen, matrices, mouseX, mouseY, delta) -> { if (shouldReturn(screen)) return; + resetFocused(screen); REIHelper.getInstance().getOverlay().get().render(matrices, mouseX, mouseY, delta); ((ContainerScreenOverlay) REIHelper.getInstance().getOverlay().get()).lateRender(matrices, mouseX, mouseY, delta); + resetFocused(screen); }); ClientScreenInputEvent.MOUSE_DRAGGED_PRE.register((minecraftClient, screen, mouseX1, mouseY1, button, mouseX2, mouseY2) -> { if (shouldReturn(screen)) return InteractionResult.PASS; - if (screen instanceof AbstractContainerScreen && REIHelper.getInstance().getOverlay().get().mouseDragged(mouseX1, mouseY1, button, mouseX2, mouseY2)) + resetFocused(screen); + if (REIHelper.getInstance().getOverlay().get().mouseDragged(mouseX1, mouseY1, button, mouseX2, mouseY2) + && resetFocused(screen)) return InteractionResult.SUCCESS; return InteractionResult.PASS; }); ClientScreenInputEvent.KEY_PRESSED_PRE.register((minecraftClient, screen, i, i1, i2) -> { if (shouldReturn(screen)) return InteractionResult.PASS; - if (screen instanceof AbstractContainerScreen && ConfigObject.getInstance().doesDisableRecipeBook() && ConfigObject.getInstance().doesFixTabCloseContainer()) + if (screen instanceof AbstractContainerScreen && ConfigObject.getInstance().doesDisableRecipeBook() && ConfigObject.getInstance().doesFixTabCloseContainer()) { if (i == 258 && minecraftClient.options.keyInventory.matches(i, i1)) { minecraftClient.player.closeContainer(); return InteractionResult.SUCCESS; } + } if (screen.getFocused() != null && screen.getFocused() instanceof EditBox || (screen.getFocused() instanceof RecipeBookComponent && ((RecipeBookComponent) screen.getFocused()).searchBox != null && ((RecipeBookComponent) screen.getFocused()).searchBox.isFocused())) return InteractionResult.PASS; - if (REIHelper.getInstance().getOverlay().get().keyPressed(i, i1, i2)) + resetFocused(screen); + if (REIHelper.getInstance().getOverlay().get().keyPressed(i, i1, i2) + && resetFocused(screen)) return InteractionResult.SUCCESS; return InteractionResult.PASS; }); } + private boolean resetFocused(Screen screen) { + if (screen.getFocused() instanceof REIOverlay || screen.getFocused() == screen) { + screen.setFocused(null); + } + return true; + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java b/runtime/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java index 9eec7c84c..9a06211a2 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/OverlaySearchField.java @@ -80,11 +80,11 @@ public class OverlaySearchField extends TextFieldWidget implements TextFieldWidg return TextTransformations.forwardWithTransformation(text, (s, charIndex, c) -> { byte arg = highlighter.highlighted[charIndex + index]; Style style = Style.EMPTY; + if (isMain && ContainerScreenOverlay.getEntryListWidget().getAllStacks().isEmpty() && !getText().isEmpty()) { + style = ERROR_STYLE; + } if (arg > 0) { Argument argument = ArgumentsRegistry.ARGUMENT_LIST.get((arg - 1) / 2); - if (isMain && ContainerScreenOverlay.getEntryListWidget().getAllStacks().isEmpty() && !getText().isEmpty()) { - style = ERROR_STYLE; - } if (!isPlain) { style = argument.getHighlightedStyle(); } @@ -130,7 +130,6 @@ public class OverlaySearchField extends TextFieldWidget implements TextFieldWidg public void laterRender(PoseStack matrices, int int_1, int int_2, float float_1) { RenderSystem.disableDepthTest(); - setEditableColor(isMain && ContainerScreenOverlay.getEntryListWidget().getAllStacks().isEmpty() && !getText().isEmpty() ? 16733525 : isHighlighting && isMain ? -852212 : (containsMouse(PointHelper.ofMouse()) || isFocused()) ? (REIHelper.getInstance().isDarkThemeEnabled() ? -17587 : -1) : -6250336); setSuggestion(!isFocused() && getText().isEmpty() ? I18n.get("text.rei.search.field.suggestion") : null); super.render(matrices, int_1, int_2, float_1); RenderSystem.enableDepthTest(); diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java b/runtime/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java index ccbfa51b3..798c3ac24 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/credits/CreditsScreen.java @@ -125,7 +125,7 @@ public class CreditsScreen extends Screen { MutableLong current = new MutableLong(0); Minecraft.getInstance().setScreen(new TransformingScreen(true, parent, this, - () -> current.setValue(current.getValue() == 0 ? Util.getMillis() + (ConfigObject.getInstance().isReducedMotion() ? -3000 : 0) : current.getValue()), + () -> current.setValue(current.getValue() == 0 ? Util.getMillis() + (!ConfigObject.getInstance().isCreditsScreenAnimated() ? -3000 : 0) : current.getValue()), () -> EasingMethod.EasingMethodImpl.EXPO.apply(Mth.clamp((Util.getMillis() - current.getValue()) / 750.0, 0, 1)) * Minecraft.getInstance().getWindow().getGuiScaledWidth(), () -> 0, diff --git a/runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java index db383eda7..7a6851619 100644 --- a/runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/gui/widget/FavoritesListWidget.java @@ -322,7 +322,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt entry = new Entry(favorite, entrySize); } - if (ConfigObject.getInstance().isReducedMotion()) entry.size.setAs(entrySize * 100); + if (!ConfigObject.getInstance().isFavoritesAnimated()) entry.size.setAs(entrySize * 100); else entry.size.setTo(entrySize * 100, 300); entries.put(entry.hashIgnoreAmount(), entry); } @@ -530,7 +530,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt public void remove() { if (!hidden) { this.hidden = true; - if (ConfigObject.getInstance().isReducedMotion()) this.size.setAs(0); + if (!ConfigObject.getInstance().isFavoritesAnimated()) this.size.setAs(0); else this.size.setTo(0, 300); } } @@ -562,7 +562,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt } public void moveTo(boolean animated, int xPos, int yPos) { - if (animated && !ConfigObject.getInstance().isReducedMotion()) { + if (animated && ConfigObject.getInstance().isFavoritesAnimated()) { x.setTo(xPos, 200); y.setTo(yPos, 200); } else { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java index b8edc6b5c..e69c5f3aa 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigManagerImpl.java @@ -245,7 +245,7 @@ public class ConfigManagerImpl implements ConfigManager { MutableLong current = new MutableLong(0); parentTranslated = new TransformingScreen(true, parent, null, - () -> current.setValue(current.getValue() == 0 ? Util.getMillis() + (getConfig().isReducedMotion() ? -3000 : 0) : current.getValue()), + () -> current.setValue(current.getValue() == 0 ? Util.getMillis() + (!getConfig().isConfigScreenAnimated() ? -3000 : 0) : current.getValue()), () -> 0, () -> (EasingMethod.EasingMethodImpl.EXPO.apply(Mth.clamp((Util.getMillis() - current.getValue()) / 750.0, 0, 1))) * Minecraft.getInstance().getWindow().getGuiScaledHeight(), () -> Util.getMillis() - current.getValue() > 800); parentTranslated.setInitAfter(true); @@ -266,7 +266,7 @@ public class ConfigManagerImpl implements ConfigManager { CreditsScreen creditsScreen = new CreditsScreen(screen); Minecraft.getInstance().setScreen(new TransformingScreen(false, creditsScreen, screen, - () -> current.setValue(current.getValue() == 0 ? Util.getMillis() + (getConfig().isReducedMotion() ? -3000 : 0) : current.getValue()), + () -> current.setValue(current.getValue() == 0 ? Util.getMillis() + (!getConfig().isCreditsScreenAnimated() ? -3000 : 0) : current.getValue()), () -> (1 - EasingMethod.EasingMethodImpl.EXPO.apply(Mth.clamp((Util.getMillis() - current.getValue()) / 750.0, 0, 1))) * Minecraft.getInstance().getWindow().getGuiScaledWidth() * 1.3, () -> 0, @@ -284,7 +284,7 @@ public class ConfigManagerImpl implements ConfigManager { MutableLong current = new MutableLong(0); return new TransformingScreen(false, configScreen, parent, - () -> current.setValue(current.getValue() == 0 ? Util.getMillis() + (getConfig().isReducedMotion() ? -3000 : 0) : current.getValue()), + () -> current.setValue(current.getValue() == 0 ? Util.getMillis() + (!getConfig().isConfigScreenAnimated() ? -3000 : 0) : current.getValue()), () -> 0, () -> (1 - EasingMethod.EasingMethodImpl.EXPO.apply(Mth.clamp((Util.getMillis() - current.getValue()) / 750.0, 0, 1))) * Minecraft.getInstance().getWindow().getGuiScaledHeight() * 1.3, () -> Util.getMillis() - current.getValue() > 800); } catch (Exception e) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java index ad1ea29b3..9c019f19a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/ConfigObjectImpl.java @@ -101,8 +101,18 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { } @Override - public boolean isReducedMotion() { - return basics.reducedMotion; + public boolean isConfigScreenAnimated() { + return basics.motion.configScreenAnimation; + } + + @Override + public boolean isCreditsScreenAnimated() { + return basics.motion.creditsScreenAnimation; + } + + @Override + public boolean isFavoritesAnimated() { + return basics.motion.favoritesAnimation; } @Override @@ -400,7 +410,14 @@ public class ConfigObjectImpl implements ConfigObject, ConfigData { @Comment("Declares whether REI is visible.") @ConfigEntry.Gui.Excluded private boolean overlayVisible = true; @ConfigEntry.Gui.EnumHandler(option = ConfigEntry.Gui.EnumHandler.EnumDisplayOption.BUTTON) private ItemCheatingStyle cheatingStyle = ItemCheatingStyle.GRAB; - private boolean reducedMotion = false; + @ConfigEntry.Gui.CollapsibleObject + private Motion motion = new Motion(); + } + + public static class Motion { + private boolean configScreenAnimation = false; + private boolean creditsScreenAnimation = true; + private boolean favoritesAnimation = true; } public static class KeyBindings { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java b/runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java index dea02b9c2..9e7831d23 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/InternalWidgets.java @@ -48,6 +48,7 @@ import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Objects; -- cgit