From 05069aa62b09f02a8cd6e526ec58a30347a56500 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Wed, 27 Jul 2022 23:25:27 +0800 Subject: [PATCH 01/20] WIP Module --- api/build.gradle | 53 --- .../client/entry/renderer/EntryRenderer.java | 4 +- .../client/favorites/FavoriteEntryType.java | 2 +- .../api/client/overlay/OverlayListWidget.java | 2 + .../registry/entry/CollapsibleEntry.java | 42 +++ .../entry/CollapsibleEntryRegistry.java | 2 +- .../client/registry/entry/EntryRegistry.java | 8 +- .../registry/entry/PreFilteredEntryList.java | 51 +++ .../rei/api/client/search/SearchFilter.java | 20 ++ .../rei/api/client/search/SearchProvider.java | 14 + .../api/common/registry/ParentReloadable.java | 5 + .../shedaniel/rei/impl/ClientInternals.java | 60 ++-- .../java/me/shedaniel/rei/impl/Internals.java | 78 +++-- build.gradle | 102 +++++- default-plugin/build.gradle | 55 ---- fabric/build.gradle | 2 - forge/build.gradle | 2 - .../rei/forge/PluginDetectorImpl.java | 23 +- runtime-engine/build.gradle | 7 + .../categories/.gradle/loom-cache/launch.cfg | 14 + .../categories/.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + .../CategoryRegistryImpl$Configuration.class | Bin 0 -> 7035 bytes .../category/CategoryRegistryImpl.class | Bin 0 -> 10847 bytes .../CategoryIdentifierConstructorImpl.class | Bin 0 -> 1958 bytes .../category/CategoryIdentifierImpl.class | Bin 0 -> 2182 bytes .../categories-transformProductionFabric.jar | Bin 0 -> 166 bytes .../categories-transformProductionForge.jar | Bin 0 -> 166 bytes ....client.registry.category.CategoryRegistry | 1 + ...pl.Internals.CategoryIdentifierConstructor | 1 + .../CategoryIdentifierConstructorImpl.java | 22 ++ .../category/CategoryRegistryImpl.java | 2 +- .../CategoryIdentifierConstructorImpl.java | 45 +++ .../category/CategoryIdentifierImpl.java | 21 +- ....client.registry.category.CategoryRegistry | 1 + ...pl.Internals.CategoryIdentifierConstructor | 1 + .../configs/.gradle/loom-cache/launch.cfg | 14 + .../configs/.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + .../configs-transformProductionFabric.jar | Bin 0 -> 166 bytes .../libs/configs-transformProductionForge.jar | Bin 0 -> 166 bytes .../impl/client/config/ConfigManagerImpl.java | 87 ++++- .../impl/client/config/ConfigObjectImpl.java | 49 --- .../config/addon/ConfigAddonRegistryImpl.java | 0 .../config/addon/ConfigAddonsScreen.java | 0 .../config/entries/ConfigAddonsEntry.java | 0 .../config/entries/RecipeScreenTypeEntry.java | 0 .../SearchFilterSyntaxHighlightingEntry.java | 0 .../client/config/entries/TitleTextEntry.java | 0 ...daniel.rei.api.client.config.ConfigManager | 1 + ...edaniel.rei.api.client.config.ConfigObject | 1 + ...pi.client.config.addon.ConfigAddonRegistry | 1 + .../.gradle/loom-cache/launch.cfg | 14 + .../.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + ...ntime-plugin-transformProductionFabric.jar | Bin 0 -> 166 bytes ...untime-plugin-transformProductionForge.jar | Bin 0 -> 166 bytes .../client/entry/FluidEntryDefinition.java | 0 .../client/entry/ItemEntryDefinition.java | 0 .../common/runtime/DefaultRuntimePlugin.java | 2 - .../rei/plugin/test/REITestPlugin.java | 0 .../displays/.gradle/loom-cache/launch.cfg | 14 + .../displays/.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + .../displays-transformProductionFabric.jar | Bin 0 -> 166 bytes .../displays-transformProductionForge.jar | Bin 0 -> 166 bytes .../registry/display/DisplayRegistryImpl.java | 0 .../registry/RecipeManagerContextImpl.java | 4 + .../DisplaySerializerRegistryImpl.java | 2 +- ...pi.client.registry.display.DisplayRegistry | 1 + ...i.common.display.DisplaySerializerRegistry | 1 + ...i.api.common.registry.RecipeManagerContext | 1 + .../entries/.gradle/loom-cache/launch.cfg | 14 + .../entries/.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + .../entries-transformProductionFabric.jar | Bin 0 -> 166 bytes .../libs/entries-transformProductionForge.jar | Bin 0 -> 166 bytes .../client}/entry/type/EntryRegistryImpl.java | 23 +- .../client}/entry/type/EntryRegistryList.java | 4 +- .../entry/type/EntryRegistryListener.java | 4 +- .../entry/type/EntryTypeRegistryImpl.java | 2 +- .../entry/type/NormalEntryRegistryList.java | 4 +- .../type/ReloadingEntryRegistryList.java | 4 +- .../CollapsibleEntryRegistryImpl.java | 39 ++- ...ei.api.client.registry.entry.EntryRegistry | 1 + .../.gradle/loom-cache/launch.cfg | 14 + .../entry-stacks/.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + ...cks-8.3.9999-transformProductionFabric.jar | Bin 0 -> 166 bytes ...acks-8.3.9999-transformProductionForge.jar | Bin 0 -> 166 bytes ...entry-stacks-transformProductionFabric.jar | Bin 0 -> 166 bytes .../entry-stacks-transformProductionForge.jar | Bin 0 -> 166 bytes .../common/entry/EntryIngredientImpl.java | 6 +- .../EntrySettingsAdapterRegistryImpl.java | 0 .../entry/stack}/AbstractEntryStack.java | 4 +- .../common/entry/stack}/EmptyEntryStack.java | 6 +- .../entry/stack}/EntryStackProviderImpl.java | 8 +- .../common/entry/stack}/TypedEntryStack.java | 6 +- ...ntry.settings.EntrySettingsAdapterRegistry | 1 + ...rei.impl.Internals$EntryIngredientProvider | 1 + ...niel.rei.impl.Internals$EntryStackProvider | 1 + .../entry-types/.gradle/loom-cache/launch.cfg | 14 + .../entry-types/.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + ...pes-8.3.9999-transformProductionFabric.jar | Bin 0 -> 166 bytes ...ypes-8.3.9999-transformProductionForge.jar | Bin 0 -> 166 bytes .../entry-types-transformProductionFabric.jar | Bin 0 -> 166 bytes .../entry-types-transformProductionForge.jar | Bin 0 -> 166 bytes .../renderer/EntryRendererRegistryImpl.java | 0 .../EntryComparatorRegistryImpl.java | 0 .../FluidComparatorRegistryImpl.java | 0 .../ItemComparatorRegistryImpl.java | 0 .../comparison/NbtHasherProviderImpl.java | 3 +- .../type/types/BuiltinEntryDefinition.java | 2 +- .../type/types/DeferredEntryTypeImpl.java | 8 +- .../DeferringEntryTypeProviderImpl.java | 110 +++---- .../type/types/EmptyEntryDefinition.java | 7 +- .../type/types/RenderingEntryDefinition.java | 7 +- .../fluid/FluidSupportProviderImpl.java | 0 ...n.entry.comparison.FluidComparatorRegistry | 1 + ...on.entry.comparison.ItemComparatorRegistry | 1 + ....rei.api.common.fluid.FluidSupportProvider | 1 + ....impl.Internals$DeferringEntryTypeProvider | 1 + ...aniel.rei.impl.Internals$NbtHasherProvider | 1 + .../favorites/.gradle/loom-cache/launch.cfg | 14 + .../favorites/.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + .../favorites-transformProductionFabric.jar | Bin 0 -> 166 bytes .../favorites-transformProductionForge.jar | Bin 0 -> 166 bytes .../DelegatingFavoriteEntryProviderImpl.java | 125 +++++++ .../FavoriteEntryTypeRegistryImpl.java | 16 +- .../favorites/FavoritesEntriesManager.java | 129 ++++---- ...lient.favorites.FavoriteEntryType$Registry | 1 + ...tInternals$DelegatingFavoriteEntryProvider | 1 + .../.gradle/loom-cache/launch.cfg | 14 + .../.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + runtime-engine/filtering-entries/build.gradle | 3 + ...ring-entries-transformProductionFabric.jar | Bin 0 -> 166 bytes ...ering-entries-transformProductionForge.jar | Bin 0 -> 166 bytes .../entries/FilteringAddRuleScreen.java | 0 .../client/config/entries/FilteringEntry.java | 0 .../entries/FilteringRuleOptionsScreen.java | 0 .../config/entries/FilteringRulesScreen.java | 0 .../config/entries/FilteringScreen.java | 12 +- .../config/entries/NoFilteringEntry.java | 0 .../filtering/AbstractFilteringRule.java | 0 .../entry/filtering/FilteringCache.java | 0 .../entry/filtering/FilteringCacheImpl.java | 0 .../entry/filtering/FilteringContext.java | 0 .../entry/filtering/FilteringContextImpl.java | 0 .../entry/filtering/FilteringContextType.java | 0 .../entry/filtering/FilteringResult.java | 0 .../entry/filtering/FilteringResultImpl.java | 0 .../client/entry/filtering/FilteringRule.java | 0 .../filtering/rules/ManualFilteringRule.java | 0 .../filtering/rules/SearchFilteringRule.java | 15 +- .../entry/type/PreFilteredEntryListImpl.java | 22 +- .../FilteredStacksVisibilityHandler.java | 39 ++- ...iel.rei.api.client.plugins.REIClientPlugin | 1 + ...pl.client.entry.type.EntryRegistryListener | 1 + .../screens/.gradle/loom-cache/launch.cfg | 14 + .../screens/.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + .../registry/screen/ExclusionZonesImpl.class | Bin 0 -> 9115 bytes .../screen/ScreenRegistryImpl$1.class | Bin 0 -> 2749 bytes .../screen/ScreenRegistryImpl$2.class | Bin 0 -> 2322 bytes .../screen/ScreenRegistryImpl$3.class | Bin 0 -> 2325 bytes .../registry/screen/ScreenRegistryImpl.class | Bin 0 -> 20609 bytes .../screens-transformProductionFabric.jar | Bin 0 -> 166 bytes .../libs/screens-transformProductionForge.jar | Bin 0 -> 166 bytes .../compileJava/previous-compilation-data.bin | Bin 0 -> 112600 bytes .../registry/screen/ExclusionZonesImpl.java | 0 .../registry/screen/ScreenRegistryImpl.java | 8 +- ....api.client.registry.screen.ScreenRegistry | 1 + .../search/.gradle/loom-cache/launch.cfg | 14 + .../search/.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + .../libs/search-transformProductionFabric.jar | Bin 0 -> 166 bytes .../libs/search-transformProductionForge.jar | Bin 0 -> 166 bytes .../rei/impl/client/search/IntRange.java | 27 ++ .../client/search/SearchProviderImpl.java | 15 + .../search/argument/AlternativeArgument.java | 0 .../impl/client/search/argument/Argument.java | 17 +- .../search/argument/CompoundArgument.java | 0 .../impl/client/search/argument/IndexSet.java | 0 .../search/argument/InputMethodMatcher.java | 0 .../type/AlwaysMatchingArgumentType.java | 0 .../search/argument/type/ArgumentType.java | 0 .../argument/type/ArgumentTypesRegistry.java | 0 .../argument/type/IdentifierArgumentType.java | 0 .../search/argument/type/MatchType.java | 0 .../search/argument/type/ModArgumentType.java | 0 .../argument/type/RegexArgumentType.java | 0 .../search/argument/type/TagArgumentType.java | 0 .../argument/type/TextArgumentType.java | 0 .../argument/type/TooltipArgumentType.java | 0 .../search/method/DefaultInputMethod.java | 2 +- .../method/InputMethodRegistryImpl.java | 7 +- .../result/ArgumentApplicableResult.java | 2 +- .../runtime/SearchFilterPrepareWatcher.java | 0 ...aniel.rei.api.client.search.SearchProvider | 1 + ...iel.rei.impl.client.gui.hints.HintProvider | 1 + .../rei/impl/common/logging/FileLogger.java | 2 + .../impl/common/logging/FilteringLogger.java | 2 + .../rei/impl/common/logging/Log4JLogger.java | 2 + .../rei/impl/common/logging/MultiLogger.java | 2 + .../common/logging/TransformingLogger.java | 2 + .../impl/init/RoughlyEnoughItemsEngine.java | 46 +++ .../subsets/.gradle/loom-cache/launch.cfg | 14 + .../subsets/.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + .../subsets-transformProductionFabric.jar | Bin 0 -> 166 bytes .../libs/subsets-transformProductionForge.jar | Bin 0 -> 166 bytes .../client/subsets/SubsetsRegistryImpl.java | 0 ...iel.rei.api.client.subsets.SubsetsRegistry | 1 + .../.gradle/loom-cache/launch.cfg | 14 + .../.gradle/loom-cache/log4j.xml | 63 ++++ .../.gradle/loom-cache/remapClasspath.txt | 1 + ...fer-handlers-transformProductionFabric.jar | Bin 0 -> 166 bytes ...sfer-handlers-transformProductionForge.jar | Bin 0 -> 166 bytes runtime/build.gradle | 45 --- .../shedaniel/rei/RoughlyEnoughItemsCore.java | 82 ++--- .../rei/RoughlyEnoughItemsCoreClient.java | 86 +++-- ...er.java => AbstractViewSearchBuilder.java} | 46 ++- .../rei/impl/client/ClientHelperImpl.java | 250 +------------- .../LegacyWrapperViewSearchBuilder.java | 145 +++++++++ .../rei/impl/client/REIRuntimeImpl.java | 13 +- .../impl/client/ViewSearchBuilderImpl.java | 144 +++++++++ .../config/entries/ReloadPluginsEntry.java | 6 +- .../DelegatingFavoriteEntryProviderImpl.java | 117 ------- .../screen/UncertainDisplayViewingScreen.java | 6 +- .../gui/widget/CatchingExceptionUtils.java | 9 +- .../client/gui/widget/ConfigButtonWidget.java | 23 +- .../widget/CraftableFilterButtonWidget.java | 18 +- .../client/gui/widget/InternalWidgets.java | 6 +- .../entrylist/CollapsedEntriesTooltip.java | 1 - .../gui/widget/entrylist}/CollapsedStack.java | 9 +- .../entrylist/CollapsingEntryListWidget.java | 1 - .../entrylist/EntryListSearchManager.java | 18 +- .../widget/entrylist/EntryListStackEntry.java | 2 - .../gui/widget/entrylist/EntryListWidget.java | 20 +- .../entrylist/PaginatedEntryListWidget.java | 1 - .../entrylist/ScrolledEntryListWidget.java | 1 - .../widget/favorites/FavoritesListWidget.java | 103 +----- .../history/DisplayHistoryManager.java | 17 +- .../listeners/FavoritesRegionListener.java | 8 +- .../gui/widget/search/OverlaySearchField.java | 21 +- .../OverlaySearchFieldSyntaxHighlighter.java | 45 ++- .../common/plugins/PluginManagerImpl.java | 305 +++--------------- .../common/plugins/PluginReloaderImpl.java | 289 +++++++++++++++++ .../init/RoughlyEnoughItemsInitializer.java | 1 + .../impl/init/ServiceBasedPluginDetector.java | 61 ++++ .../runtime/DefaultClientRuntimePlugin.java | 39 +-- .../client/runtime/InputMethodWatcher.java | 13 +- .../runtime/PluginStageExecutionWatcher.java | 98 +++--- ...l.rei.impl.ClientInternals$WidgetsProvider | 1 + ...iel.rei.impl.client.gui.hints.HintProvider | 3 + .../me.shedaniel.rei.impl.init.PluginDetector | 1 + settings.gradle | 15 + .../client/config/ConfigManagerInternal.java | 41 +++ .../favorites/MutableFavoritesList.java | 9 + .../impl/client/gui/hints/HintProvider.java | 0 .../client/search/AsyncSearchManager.java | 2 +- .../rei/impl/client/search/SearchManager.java | 43 +-- .../impl/client/util/CrashReportUtils.java | 4 +- .../common/util/HashedEntryStackWrapper.java | 3 - 267 files changed, 3087 insertions(+), 1633 deletions(-) delete mode 100644 api/build.gradle create mode 100644 api/src/main/java/me/shedaniel/rei/api/client/registry/entry/CollapsibleEntry.java create mode 100644 api/src/main/java/me/shedaniel/rei/api/client/registry/entry/PreFilteredEntryList.java delete mode 100644 default-plugin/build.gradle create mode 100644 runtime-engine/build.gradle create mode 100644 runtime-engine/categories/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/categories/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/categories/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl$Configuration.class create mode 100644 runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.class create mode 100644 runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.class create mode 100644 runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.class create mode 100644 runtime-engine/categories/build/libs/categories-transformProductionFabric.jar create mode 100644 runtime-engine/categories/build/libs/categories-transformProductionForge.jar create mode 100644 runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.api.client.registry.category.CategoryRegistry create mode 100644 runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor create mode 100644 runtime-engine/categories/build/tmp/updateLicenseMain/original/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java rename {runtime => runtime-engine/categories}/src/main/java/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.java (98%) create mode 100644 runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java rename {runtime => runtime-engine/categories}/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.java (73%) create mode 100644 runtime-engine/categories/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.category.CategoryRegistry create mode 100644 runtime-engine/categories/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor create mode 100644 runtime-engine/configs/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/configs/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/configs/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/configs/build/libs/configs-transformProductionFabric.jar create mode 100644 runtime-engine/configs/build/libs/configs-transformProductionForge.jar rename {runtime => runtime-engine/configs}/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java (87%) rename {runtime => runtime-engine/configs}/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java (93%) rename {runtime => runtime-engine/configs}/src/main/java/me/shedaniel/rei/impl/client/config/addon/ConfigAddonRegistryImpl.java (100%) rename {runtime => runtime-engine/configs}/src/main/java/me/shedaniel/rei/impl/client/config/addon/ConfigAddonsScreen.java (100%) rename {runtime => runtime-engine/configs}/src/main/java/me/shedaniel/rei/impl/client/config/entries/ConfigAddonsEntry.java (100%) rename {runtime => runtime-engine/configs}/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java (100%) rename {runtime => runtime-engine/configs}/src/main/java/me/shedaniel/rei/impl/client/config/entries/SearchFilterSyntaxHighlightingEntry.java (100%) rename {runtime => runtime-engine/configs}/src/main/java/me/shedaniel/rei/impl/client/config/entries/TitleTextEntry.java (100%) create mode 100644 runtime-engine/configs/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.config.ConfigManager create mode 100644 runtime-engine/configs/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.config.ConfigObject create mode 100644 runtime-engine/configs/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry create mode 100644 runtime-engine/default-runtime-plugin/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/default-runtime-plugin/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/default-runtime-plugin/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/default-runtime-plugin/build/libs/default-runtime-plugin-transformProductionFabric.jar create mode 100644 runtime-engine/default-runtime-plugin/build/libs/default-runtime-plugin-transformProductionForge.jar rename {runtime => runtime-engine/default-runtime-plugin}/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java (100%) rename {runtime => runtime-engine/default-runtime-plugin}/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java (100%) rename {runtime => runtime-engine/default-runtime-plugin}/src/main/java/me/shedaniel/rei/plugin/common/runtime/DefaultRuntimePlugin.java (95%) rename {runtime => runtime-engine/default-runtime-plugin}/src/main/java/me/shedaniel/rei/plugin/test/REITestPlugin.java (100%) create mode 100644 runtime-engine/displays/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/displays/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/displays/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/displays/build/libs/displays-transformProductionFabric.jar create mode 100644 runtime-engine/displays/build/libs/displays-transformProductionForge.jar rename {runtime => runtime-engine/displays}/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java (100%) rename {runtime => runtime-engine/displays}/src/main/java/me/shedaniel/rei/impl/common/registry/RecipeManagerContextImpl.java (97%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common => runtime-engine/displays/src/main/java/me/shedaniel/rei/impl/common/registry}/display/DisplaySerializerRegistryImpl.java (98%) create mode 100644 runtime-engine/displays/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.display.DisplayRegistry create mode 100644 runtime-engine/displays/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.display.DisplaySerializerRegistry create mode 100644 runtime-engine/displays/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.registry.RecipeManagerContext create mode 100644 runtime-engine/entries/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/entries/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/entries/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/entries/build/libs/entries-transformProductionFabric.jar create mode 100644 runtime-engine/entries/build/libs/entries-transformProductionForge.jar rename {runtime/src/main/java/me/shedaniel/rei/impl/common => runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client}/entry/type/EntryRegistryImpl.java (92%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common => runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client}/entry/type/EntryRegistryList.java (95%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common => runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client}/entry/type/EntryRegistryListener.java (94%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common => runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client}/entry/type/EntryTypeRegistryImpl.java (98%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common => runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client}/entry/type/NormalEntryRegistryList.java (96%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common => runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client}/entry/type/ReloadingEntryRegistryList.java (97%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common => runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client}/entry/type/collapsed/CollapsibleEntryRegistryImpl.java (78%) create mode 100644 runtime-engine/entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.entry.EntryRegistry create mode 100644 runtime-engine/entry-stacks/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/entry-stacks/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/entry-stacks/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/entry-stacks/build/libs/RoughlyEnoughItems-entry-stacks-8.3.9999-transformProductionFabric.jar create mode 100644 runtime-engine/entry-stacks/build/libs/RoughlyEnoughItems-entry-stacks-8.3.9999-transformProductionForge.jar create mode 100644 runtime-engine/entry-stacks/build/libs/entry-stacks-transformProductionFabric.jar create mode 100644 runtime-engine/entry-stacks/build/libs/entry-stacks-transformProductionForge.jar rename {runtime => runtime-engine/entry-stacks}/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java (99%) rename {runtime => runtime-engine/entry-stacks}/src/main/java/me/shedaniel/rei/impl/common/entry/settings/EntrySettingsAdapterRegistryImpl.java (100%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common/entry => runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack}/AbstractEntryStack.java (98%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common/entry => runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack}/EmptyEntryStack.java (90%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common/entry => runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack}/EntryStackProviderImpl.java (90%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common/entry => runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack}/TypedEntryStack.java (91%) create mode 100644 runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.settings.EntrySettingsAdapterRegistry create mode 100644 runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$EntryIngredientProvider create mode 100644 runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$EntryStackProvider create mode 100644 runtime-engine/entry-types/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/entry-types/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/entry-types/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/entry-types/build/libs/RoughlyEnoughItems-entry-types-8.3.9999-transformProductionFabric.jar create mode 100644 runtime-engine/entry-types/build/libs/RoughlyEnoughItems-entry-types-8.3.9999-transformProductionForge.jar create mode 100644 runtime-engine/entry-types/build/libs/entry-types-transformProductionFabric.jar create mode 100644 runtime-engine/entry-types/build/libs/entry-types-transformProductionForge.jar rename {runtime => runtime-engine/entry-types}/src/main/java/me/shedaniel/rei/impl/client/entry/renderer/EntryRendererRegistryImpl.java (100%) rename {runtime => runtime-engine/entry-types}/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java (100%) rename {runtime => runtime-engine/entry-types}/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/FluidComparatorRegistryImpl.java (100%) rename {runtime => runtime-engine/entry-types}/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java (100%) rename {runtime => runtime-engine/entry-types}/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/NbtHasherProviderImpl.java (97%) rename {runtime => runtime-engine/entry-types}/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java (98%) rename runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryTypeDeferred.java => runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/DeferredEntryTypeImpl.java (91%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common/entry => runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types}/DeferringEntryTypeProviderImpl.java (50%) rename {runtime => runtime-engine/entry-types}/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java (93%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client => runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common}/entry/type/types/RenderingEntryDefinition.java (95%) rename {runtime => runtime-engine/entry-types}/src/main/java/me/shedaniel/rei/impl/common/fluid/FluidSupportProviderImpl.java (100%) create mode 100644 runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.comparison.FluidComparatorRegistry create mode 100644 runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry create mode 100644 runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.fluid.FluidSupportProvider create mode 100644 runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$DeferringEntryTypeProvider create mode 100644 runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$NbtHasherProvider create mode 100644 runtime-engine/favorites/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/favorites/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/favorites/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/favorites/build/libs/favorites-transformProductionFabric.jar create mode 100644 runtime-engine/favorites/build/libs/favorites-transformProductionForge.jar create mode 100644 runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/DelegatingFavoriteEntryProviderImpl.java rename {runtime => runtime-engine/favorites}/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java (85%) rename {runtime => runtime-engine/favorites}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java (53%) create mode 100644 runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.favorites.FavoriteEntryType$Registry create mode 100644 runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$DelegatingFavoriteEntryProvider create mode 100644 runtime-engine/filtering-entries/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/filtering-entries/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/filtering-entries/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/filtering-entries/build.gradle create mode 100644 runtime-engine/filtering-entries/build/libs/filtering-entries-transformProductionFabric.jar create mode 100644 runtime-engine/filtering-entries/build/libs/filtering-entries-transformProductionForge.jar rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java (98%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/config/entries/NoFilteringEntry.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/AbstractFilteringRule.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCacheImpl.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextImpl.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextType.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResult.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResultImpl.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java (100%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java (94%) rename runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/PreFilteredEntryList.java => runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java (92%) rename {runtime => runtime-engine/filtering-entries}/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java (78%) create mode 100644 runtime-engine/filtering-entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.plugins.REIClientPlugin create mode 100644 runtime-engine/filtering-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.entry.type.EntryRegistryListener create mode 100644 runtime-engine/screens/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/screens/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/screens/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ExclusionZonesImpl.class create mode 100644 runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$1.class create mode 100644 runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$2.class create mode 100644 runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$3.class create mode 100644 runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl.class create mode 100644 runtime-engine/screens/build/libs/screens-transformProductionFabric.jar create mode 100644 runtime-engine/screens/build/libs/screens-transformProductionForge.jar create mode 100644 runtime-engine/screens/build/tmp/compileJava/previous-compilation-data.bin rename {runtime => runtime-engine/screens}/src/main/java/me/shedaniel/rei/impl/client/registry/screen/ExclusionZonesImpl.java (100%) rename {runtime => runtime-engine/screens}/src/main/java/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl.java (97%) create mode 100644 runtime-engine/screens/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.screen.ScreenRegistry create mode 100644 runtime-engine/search/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/search/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/search/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/search/build/libs/search-transformProductionFabric.jar create mode 100644 runtime-engine/search/build/libs/search-transformProductionForge.jar create mode 100644 runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/IntRange.java rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/SearchProviderImpl.java (93%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java (97%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/CompoundArgument.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/IndexSet.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/InputMethodMatcher.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentTypesRegistry.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/MatchType.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ModArgumentType.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TagArgumentType.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java (100%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/method/DefaultInputMethod.java (97%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/method/InputMethodRegistryImpl.java (92%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/impl/client/search/result/ArgumentApplicableResult.java (98%) rename {runtime => runtime-engine/search}/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchFilterPrepareWatcher.java (100%) create mode 100644 runtime-engine/search/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.search.SearchProvider create mode 100644 runtime-engine/search/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider rename {runtime => runtime-engine}/src/main/java/me/shedaniel/rei/impl/common/logging/FileLogger.java (97%) rename {runtime => runtime-engine}/src/main/java/me/shedaniel/rei/impl/common/logging/FilteringLogger.java (97%) rename {runtime => runtime-engine}/src/main/java/me/shedaniel/rei/impl/common/logging/Log4JLogger.java (96%) rename {runtime => runtime-engine}/src/main/java/me/shedaniel/rei/impl/common/logging/MultiLogger.java (97%) rename {runtime => runtime-engine}/src/main/java/me/shedaniel/rei/impl/common/logging/TransformingLogger.java (97%) create mode 100644 runtime-engine/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsEngine.java create mode 100644 runtime-engine/subsets/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/subsets/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/subsets/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/subsets/build/libs/subsets-transformProductionFabric.jar create mode 100644 runtime-engine/subsets/build/libs/subsets-transformProductionForge.jar rename {runtime => runtime-engine/subsets}/src/main/java/me/shedaniel/rei/impl/client/subsets/SubsetsRegistryImpl.java (100%) create mode 100644 runtime-engine/subsets/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.subsets.SubsetsRegistry create mode 100644 runtime-engine/transfer-handlers/.gradle/loom-cache/launch.cfg create mode 100644 runtime-engine/transfer-handlers/.gradle/loom-cache/log4j.xml create mode 100644 runtime-engine/transfer-handlers/.gradle/loom-cache/remapClasspath.txt create mode 100644 runtime-engine/transfer-handlers/build/libs/transfer-handlers-transformProductionFabric.jar create mode 100644 runtime-engine/transfer-handlers/build/libs/transfer-handlers-transformProductionForge.jar rename runtime/src/main/java/me/shedaniel/rei/impl/client/{gui/widget/favorites/listeners/FavoritesSystemRegionListener.java => AbstractViewSearchBuilder.java} (55%) create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/LegacyWrapperViewSearchBuilder.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/ViewSearchBuilderImpl.java delete mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/DelegatingFavoriteEntryProviderImpl.java rename runtime/src/main/java/me/shedaniel/rei/impl/{common/entry/type/collapsed => client/gui/widget/entrylist}/CollapsedStack.java (89%) create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/init/ServiceBasedPluginDetector.java create mode 100644 runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$WidgetsProvider create mode 100644 runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider create mode 100644 runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.init.PluginDetector create mode 100644 shared-internals/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerInternal.java create mode 100644 shared-internals/src/main/java/me/shedaniel/rei/impl/client/favorites/MutableFavoritesList.java rename {runtime => shared-internals}/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java (100%) rename {runtime => shared-internals}/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java (98%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/search/IntRange.java => shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/SearchManager.java (63%) rename {runtime => shared-internals}/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java (94%) rename {runtime => shared-internals}/src/main/java/me/shedaniel/rei/impl/common/util/HashedEntryStackWrapper.java (96%) diff --git a/api/build.gradle b/api/build.gradle deleted file mode 100644 index 9cbc69fa1..000000000 --- a/api/build.gradle +++ /dev/null @@ -1,53 +0,0 @@ -archivesBaseName = rootProject.name + "-" + project.name - -dependencies { - modCompileOnly("net.fabricmc:fabric-loader:${project.fabricloader_version}") - modApi("me.shedaniel.cloth:cloth-config:${cloth_config_version}") - modApi("dev.architectury:architectury:${architectury_version}") -} - -architectury { - common(forgeEnabled.toBoolean()) -} - -remapJar { - classifier "raw" -} - -task fakeJar(type: Jar, dependsOn: remapJar) { - from remapJar.archiveFile.map { zipTree(it) } - from(rootProject.file("fake/fabric.mod.json")) { - into "" - } - classifier null -} - -task fakeForgeJar(type: Jar, dependsOn: remapJar) { - from remapJar.archiveFile.map { zipTree(it) } - from(rootProject.file("fake/fabric.mod.json")) { - into "" - } - from(rootProject.file("fake/REIPlugin.class")) { - into "me/shedaniel/rei/forge" - } - classifier "fake-forge" -} - -artifacts { - apiElements(fakeJar) - runtimeElements(fakeJar) -} - -afterEvaluate { - configurations.apiElements.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(tasks.remapJar) } - configurations.runtimeElements.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(tasks.remapJar) } -} - -publishing { - publications { - mavenCommon(MavenPublication) { - artifactId = rootProject.name + "-" + project.name - from components.java - } - } -} diff --git a/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java b/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java index c51309603..2aa203aa9 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/entry/renderer/EntryRenderer.java @@ -29,7 +29,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.api.common.entry.type.BuiltinEntryTypes; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import org.jetbrains.annotations.ApiStatus; @@ -46,7 +46,7 @@ @Environment(EnvType.CLIENT) public interface EntryRenderer extends EntryRendererProvider { static EntryRenderer empty() { - return ClientInternals.getEmptyEntryRenderer(); + return (EntryRenderer) BuiltinEntryTypes.EMPTY.getDefinition().getRenderer(); } @Environment(EnvType.CLIENT) diff --git a/api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntryType.java b/api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntryType.java index 35a5e8f96..d80c567b0 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntryType.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntryType.java @@ -80,7 +80,7 @@ interface Section { default void add(FavoriteEntry... entries) { add(false, entries); } - + @ApiStatus.Experimental void add(boolean defaultFavorited, FavoriteEntry... entries); diff --git a/api/src/main/java/me/shedaniel/rei/api/client/overlay/OverlayListWidget.java b/api/src/main/java/me/shedaniel/rei/api/client/overlay/OverlayListWidget.java index 1fa784806..57e7e8999 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/overlay/OverlayListWidget.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/overlay/OverlayListWidget.java @@ -54,4 +54,6 @@ public interface OverlayListWidget { * @return whether the mouse is within the overlay list widget */ boolean containsMouse(Point point); + + void queueReloadSearch(); } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/CollapsibleEntry.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/CollapsibleEntry.java new file mode 100644 index 000000000..a3623970a --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/CollapsibleEntry.java @@ -0,0 +1,42 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.api.client.registry.entry; + +import me.shedaniel.rei.api.common.entry.EntryStack; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +public interface CollapsibleEntry { + ResourceLocation getId(); + + Component getName(); + + boolean matches(EntryStack stack, long hashExact); + + boolean isExpanded(); + + void setExpanded(boolean expanded); +} diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/CollapsibleEntryRegistry.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/CollapsibleEntryRegistry.java index c24ca5e2a..4de3468eb 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/CollapsibleEntryRegistry.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/CollapsibleEntryRegistry.java @@ -44,7 +44,7 @@ * and collect tags together. */ @ApiStatus.Experimental -public interface CollapsibleEntryRegistry extends Reloadable { +public interface CollapsibleEntryRegistry extends Reloadable, List { /** * @return the {@link CollapsibleEntryRegistry} instance */ diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/EntryRegistry.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/EntryRegistry.java index 63ed14d72..49dec73bb 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/EntryRegistry.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/EntryRegistry.java @@ -83,7 +83,9 @@ static EntryRegistry getInstance() { * @return the unmodifiable list of filtered entry stacks, * only available after plugins reload. */ - List> getPreFilteredList(); + default List> getPreFilteredList() { + return PreFilteredEntryList.getInstance().getList(); + } /** * Applies the filtering rules to the entry list, is rather computational expensive. @@ -154,7 +156,9 @@ default void addEntries(Collection> stacks) { // TODO Re-evaluate the need for this @ApiStatus.Internal - Collection> refilterNew(boolean warn, Collection> entries); + default Collection> refilterNew(boolean warn, Collection> entries) { + return PreFilteredEntryList.getInstance().refilterNew(warn, entries); + } /** * Checks if a stack is already registered. diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/PreFilteredEntryList.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/PreFilteredEntryList.java new file mode 100644 index 000000000..f9bd53422 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/PreFilteredEntryList.java @@ -0,0 +1,51 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.api.client.registry.entry; + +import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.registry.Reloadable; +import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.Internals; +import org.jetbrains.annotations.ApiStatus; + +import java.util.Collection; +import java.util.List; + +@ApiStatus.Experimental +public interface PreFilteredEntryList extends Reloadable { + static PreFilteredEntryList getInstance() { + return ClientInternals.getPreFilteredEntryList(); + } + + // TODO Re-evaluate the need for this + @ApiStatus.Internal + Collection> refilterNew(boolean warn, Collection> entries); + + /** + * @return the unmodifiable list of filtered entry stacks, + * only available after plugins reload. + */ + List> getList(); +} diff --git a/api/src/main/java/me/shedaniel/rei/api/client/search/SearchFilter.java b/api/src/main/java/me/shedaniel/rei/api/client/search/SearchFilter.java index 80b4987df..0bc7f8fff 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/search/SearchFilter.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/search/SearchFilter.java @@ -23,9 +23,12 @@ package me.shedaniel.rei.api.client.search; +import it.unimi.dsi.fastutil.ints.IntIntPair; import me.shedaniel.rei.api.common.entry.EntryStack; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import net.minecraft.network.chat.Style; +import org.jetbrains.annotations.ApiStatus; import java.util.Collection; import java.util.function.Predicate; @@ -80,4 +83,21 @@ public boolean test(EntryStack entryStack) { */ default void prepareFilter(Collection> stacks) { } + + /** + * Processes the decoration of the search filter. + * + * @param sink the decoration sink + */ + @ApiStatus.Experimental + default void processDecoration(ParseDecorationSink sink) { + } + + interface ParseDecorationSink { + void addQuote(int index); + + void addSplitter(int index); + + void addPart(IntIntPair range, Style style, boolean usingGrammar, Collection grammarRanges, int index); + } } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/search/SearchProvider.java b/api/src/main/java/me/shedaniel/rei/api/client/search/SearchProvider.java index a337e5e17..9ec3af0b1 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/search/SearchProvider.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/search/SearchProvider.java @@ -58,4 +58,18 @@ default SearchFilter createFilter(String filter) { */ @ApiStatus.Experimental SearchFilter createFilter(String filter, InputMethod inputMethod); + + /** + * Clears the search cache. + */ + @ApiStatus.Experimental + void clearCache(); + + /** + * Returns whether the search provider has cached. + * + * @return whether the search provider has cached + */ + @ApiStatus.Experimental + boolean hasCache(); } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/registry/ParentReloadable.java b/api/src/main/java/me/shedaniel/rei/api/common/registry/ParentReloadable.java index 44039e240..e91f19245 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/registry/ParentReloadable.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/registry/ParentReloadable.java @@ -24,6 +24,7 @@ package me.shedaniel.rei.api.common.registry; import me.shedaniel.rei.api.common.plugins.REIPlugin; +import me.shedaniel.rei.impl.Internals; import java.util.List; @@ -32,6 +33,10 @@ public interface ParentReloadable

> extends Reloadable

void registerReloadable(Reloadable reloadable); + default > void registerReloadable(Class reloadableClass) { + registerReloadable(Internals.resolveService(reloadableClass)); + } + @Override default void startReload() { for (ReloadStage stage : ReloadStage.values()) { diff --git a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java b/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java index 36456399b..60c6399fd 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java @@ -28,18 +28,17 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.ClientHelper; -import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.DrawableConsumer; import me.shedaniel.rei.api.client.gui.Renderer; import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.client.registry.entry.PreFilteredEntryList; import me.shedaniel.rei.api.client.registry.screen.ClickArea; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.plugins.PluginManager; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; +import net.minecraft.ReportedException; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.nbt.CompoundTag; @@ -55,19 +54,17 @@ import java.lang.reflect.Field; import java.util.Collection; import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.BiFunction; -import java.util.function.Function; -import java.util.function.Supplier; +import java.util.function.*; @ApiStatus.Internal public final class ClientInternals { - private static Supplier clientHelper = ClientInternals::throwNotSetup; - private static Supplier widgetsProvider = ClientInternals::throwNotSetup; - private static Supplier viewSearchBuilder = ClientInternals::throwNotSetup; - private static Supplier> clientPluginManager = ClientInternals::throwNotSetup; - private static Supplier> emptyEntryRenderer = ClientInternals::throwNotSetup; - private static BiFunction>, Supplier, FavoriteEntry> delegateFavoriteEntry = (supplier, toJson) -> throwNotSetup(); + private static final ClientHelper CLIENT_HELPER = resolveService(ClientHelper.class); + private static final WidgetsProvider WIDGETS_PROVIDER = resolveService(WidgetsProvider.class); + private static final ViewSearchBuilder VIEW_SEARCH_BUILDER = resolveService(ViewSearchBuilder.class); + private static final PluginManager CLIENT_PLUGIN_MANAGER = Internals.createPluginManager( + REIClientPlugin.class, + UnaryOperator.identity()); + private static final DelegatingFavoriteEntryProvider DELEGATE_FAVORITE_ENTRY = resolveService(DelegatingFavoriteEntryProvider.class); private static Function> favoriteEntryFromJson = (object) -> throwNotSetup(); private static Function clickAreaHandlerResult = (result) -> throwNotSetup(); private static BiConsumer, TooltipComponent> clientTooltipComponentProvider = (tooltip, result) -> throwNotSetup(); @@ -77,6 +74,16 @@ public final class ClientInternals { private static Supplier> jeiCompatMods = ClientInternals::throwNotSetup; private static Supplier builtinClientPlugin = ClientInternals::throwNotSetup; private static Function, TooltipComponent> missingTooltip = (stacks) -> throwNotSetup(); + private static BiConsumer crashHandler = (exception, component) -> throwNotSetup(); + private static Supplier preFilteredEntryList = ClientInternals::throwNotSetup; + + public static T resolveService(Class serviceClass) { + return Internals.resolveService(serviceClass); + } + + public static List resolveServices(Class serviceClass) { + return Internals.resolveServices(serviceClass); + } private static T throwNotSetup() { throw new AssertionError("REI Internals have not been initialized!"); @@ -108,15 +115,15 @@ public static void attachInstance(T instance, String name) { } public static ClientHelper getClientHelper() { - return clientHelper.get(); + return CLIENT_HELPER; } public static WidgetsProvider getWidgetsProvider() { - return widgetsProvider.get(); + return WIDGETS_PROVIDER; } public static ViewSearchBuilder createViewSearchBuilder() { - return viewSearchBuilder.get(); + return VIEW_SEARCH_BUILDER; } public static Object getBuiltinPlugin() { @@ -144,30 +151,33 @@ public static Tooltip.Entry createTooltipEntry(Object component) { } public static FavoriteEntry delegateFavoriteEntry(Supplier> supplier, Supplier toJoin) { - return delegateFavoriteEntry.apply(supplier, toJoin); + return DELEGATE_FAVORITE_ENTRY.delegate(supplier, toJoin); } public static DataResult favoriteEntryFromJson(CompoundTag tag) { return favoriteEntryFromJson.apply(tag); } - public static EntryRenderer getEmptyEntryRenderer() { - return emptyEntryRenderer.get().cast(); - } - public static List getJeiCompatMods() { return jeiCompatMods.get(); } public static PluginManager getPluginManager() { - return clientPluginManager.get(); + return CLIENT_PLUGIN_MANAGER; } public static TooltipComponent createMissingTooltip(List stacks) { return missingTooltip.apply(stacks); } - @Environment(EnvType.CLIENT) + public static PreFilteredEntryList getPreFilteredEntryList() { + return preFilteredEntryList.get(); + } + + public static void crash(ReportedException exception, String component) { + crashHandler.accept(exception, component); + } + public interface WidgetsProvider { boolean isRenderingPanel(Panel panel); @@ -207,4 +217,8 @@ public interface WidgetsProvider { WidgetWithBounds wrapPadded(int padLeft, int padRight, int padTop, int padBottom, WidgetWithBounds widget); } + + public interface DelegatingFavoriteEntryProvider { + FavoriteEntry delegate(Supplier> result, Supplier tag); + } } diff --git a/api/src/main/java/me/shedaniel/rei/impl/Internals.java b/api/src/main/java/me/shedaniel/rei/impl/Internals.java index 1e64c2c57..dd24614e6 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/Internals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/Internals.java @@ -31,9 +31,9 @@ import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.EntryType; import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.api.common.plugins.PluginView; import me.shedaniel.rei.api.common.plugins.REIPlugin; import me.shedaniel.rei.api.common.plugins.REIServerPlugin; -import me.shedaniel.rei.api.common.transfer.info.MenuInfoRegistry; import me.shedaniel.rei.impl.common.InternalLogger; import net.minecraft.nbt.Tag; import net.minecraft.resources.ResourceLocation; @@ -41,31 +41,51 @@ import org.jetbrains.annotations.ApiStatus; import java.lang.reflect.Field; -import java.util.function.Function; +import java.util.List; +import java.util.ServiceLoader; import java.util.function.Supplier; +import java.util.function.UnaryOperator; +import java.util.stream.Collectors; @ApiStatus.Internal public final class Internals { - private static Supplier entryStackProvider = Internals::throwNotSetup; - private static Supplier entryIngredientProvider = Internals::throwNotSetup; - private static Function> entryTypeDeferred = (object) -> throwNotSetup(); - private static Supplier>> commonPluginManager = Internals::throwNotSetup; - private static Supplier> serverPluginManager = Internals::throwNotSetup; - private static Supplier nbtHasherProvider = Internals::throwNotSetup; - private static Function> categoryIdentifier = (object) -> throwNotSetup(); - private static Supplier stubMenuInfoRegistry = Internals::throwNotSetup; + private static final EntryStackProvider ENTRY_STACK_PROVIDER = resolveService(EntryStackProvider.class); + private static final EntryIngredientProvider ENTRY_INGREDIENT_PROVIDER = resolveService(EntryIngredientProvider.class); + private static final DeferringEntryTypeProvider ENTRY_TYPE_DEFERRED = resolveService(DeferringEntryTypeProvider.class); + private static final PluginManagerConstructor PLUGIN_MANAGER_CONSTRUCTOR = resolveService(PluginManagerConstructor.class); + private static final PluginManager> COMMON_PLUGIN_MANAGER = createPluginManager( + (Class>) (Class) REIPlugin.class, + UnaryOperator.identity()); + private static final PluginManager SERVER_PLUGIN_MANAGER = createPluginManager( + REIServerPlugin.class, + view -> view.then(COMMON_PLUGIN_MANAGER.view())); + private static final NbtHasherProvider NBT_HASHER_PROVIDER = resolveService(NbtHasherProvider.class); + private static final CategoryIdentifierConstructor CATEGORY_IDENTIFIER_CONSTRUCTOR = resolveService(CategoryIdentifierConstructor.class); private static Supplier logger = Internals::throwNotSetup; private static T throwNotSetup() { throw new AssertionError("REI Internals have not been initialized!"); } - @ApiStatus.Internal - public static void attachInstance(T instance, Class clazz) { - attachInstanceSupplier(instance, clazz.getSimpleName()); + public static T resolveService(Class serviceClass) { + ServiceLoader loader = ServiceLoader.load(serviceClass); + List> providers = loader.stream().toList(); + if (providers.isEmpty()) { + throw new IllegalArgumentException("No service providers found for class " + serviceClass.getName()); + } else if (providers.size() > 1) { + throw new IllegalArgumentException("Multiple service providers found for class " + serviceClass.getName() + ": " + + providers.stream().map(provider -> provider.type().getName()) + .collect(Collectors.joining(", "))); + } else { + return providers.get(0).get(); + } + } + + public static List resolveServices(Class serviceClass) { + ServiceLoader loader = ServiceLoader.load(serviceClass); + return loader.stream().map(ServiceLoader.Provider::get).toList(); } - @ApiStatus.Internal public static void attachInstanceSupplier(T instance, String name) { attachInstance((Supplier) () -> instance, name); } @@ -86,31 +106,35 @@ public static void attachInstance(T instance, String name) { } public static EntryStackProvider getEntryStackProvider() { - return entryStackProvider.get(); + return ENTRY_STACK_PROVIDER; } public static EntryIngredientProvider getEntryIngredientProvider() { - return entryIngredientProvider.get(); + return ENTRY_INGREDIENT_PROVIDER; } public static EntryType deferEntryType(ResourceLocation id) { - return entryTypeDeferred.apply(id); + return ENTRY_TYPE_DEFERRED.get(id); + } + + public static

> PluginManager

createPluginManager(Class

clazz, UnaryOperator> constructor) { + return PLUGIN_MANAGER_CONSTRUCTOR.create(clazz, constructor); } public static PluginManager> getPluginManager() { - return commonPluginManager.get(); + return COMMON_PLUGIN_MANAGER; } public static PluginManager getServerPluginManager() { - return serverPluginManager.get(); + return SERVER_PLUGIN_MANAGER; } public static EntryComparator getNbtHasher(String[] ignoredKeys) { - return nbtHasherProvider.get().provide(ignoredKeys); + return NBT_HASHER_PROVIDER.provide(ignoredKeys); } public static CategoryIdentifier getCategoryIdentifier(String location) { - return (CategoryIdentifier) categoryIdentifier.apply(location); + return CATEGORY_IDENTIFIER_CONSTRUCTOR.create(location); } public static InternalLogger getInternalLogger() { @@ -137,7 +161,19 @@ public interface EntryIngredientProvider { EntryIngredient.Builder builder(int initialCapacity); } + public interface PluginManagerConstructor { +

> PluginManager

create(Class

clazz, UnaryOperator> constructor); + } + public interface NbtHasherProvider { EntryComparator provide(String... ignoredKeys); } + + public interface DeferringEntryTypeProvider { + EntryType get(ResourceLocation id); + } + + public interface CategoryIdentifierConstructor { + CategoryIdentifier create(String location); + } } diff --git a/build.gradle b/build.gradle index 3fefac531..f4b3e8caf 100755 --- a/build.gradle +++ b/build.gradle @@ -13,6 +13,33 @@ version = rootProject.base_version + "." + runNumber + (rootProject.unstable.toB group = "me.shedaniel" +allprojects { + ext { + runtimeEngines = [ + ":runtime-engine:entry-types", + ":runtime-engine:entry-stacks", + ":runtime-engine:categories", + ":runtime-engine:configs", + ":runtime-engine:displays", + ":runtime-engine:filtering-entries", + ":runtime-engine:entries", + ":runtime-engine:screens", + ":runtime-engine:favorites", + ":runtime-engine:search", + ":runtime-engine:subsets", + ":runtime-engine:transfer-handlers", + ":runtime-engine:default-runtime-plugin", + ] + depProjects = [ + ":api", + ":shared-internals", + ":runtime", + ":runtime-engine", + ":default-plugin", + ] + runtimeEngines + } +} + subprojects { apply plugin: "me.shedaniel.unified-publishing" apply plugin: "java" @@ -53,7 +80,6 @@ subprojects { mods { main { // to match the default mod generated for Forge sourceSet project.sourceSets.main - def depProjects = [":api", ":runtime", ":default-plugin"] depProjects.each { sourceSet project(it).sourceSets.main } @@ -94,14 +120,84 @@ allprojects { } } -["api", "default-plugin", "runtime"].forEach { +subprojects { + if (project.path in depProjects) { + loom { + if (project.path != ":api") { + accessWidenerPath = gradle.rootProject.project("fabric").file("src/main/resources/roughlyenoughitems.accessWidener") + } + } + + architectury { + common(forgeEnabled.toBoolean() ? ["forge", "fabric"] : ["fabric"]) + } + + dependencies { + modCompileOnly("net.fabricmc:fabric-loader:${project.fabricloader_version}") + modApi("me.shedaniel.cloth:cloth-config:${cloth_config_version}") + modApi("dev.architectury:architectury:${architectury_version}") + + if (project.path != ":api") { + compileClasspath(project(path: ":api", configuration: "namedElements")) + + if (project.path != ":shared-internals") { + compileClasspath(project(path: ":shared-internals", configuration: "namedElements")) + } + } + } + + remapJar { + classifier "raw" + } + + task fakeJar(type: Jar, dependsOn: remapJar) { + from remapJar.archiveFile.map { zipTree(it) } + from(rootProject.file("fake/fabric.mod.json")) { + into "" + } + classifier null + } + + task fakeForgeJar(type: Jar, dependsOn: remapJar) { + from remapJar.archiveFile.map { zipTree(it) } + from(rootProject.file("fake/fabric.mod.json")) { + into "" + } + from(rootProject.file("fake/REIPlugin.class")) { + into "me/shedaniel/rei/forge" + } + classifier "fake-forge" + } + + artifacts { + apiElements(fakeJar) + runtimeElements(fakeJar) + } + + afterEvaluate { + configurations.apiElements.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(tasks.remapJar) } + configurations.runtimeElements.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(tasks.remapJar) } + } + + publishing { + publications { + mavenCommon(MavenPublication) { + artifactId = rootProject.name + "-" + project.name + from components.java + } + } + } + } +} + +depProjects.forEach { project(":fabric").evaluationDependsOn(":$it") } subprojects { group = rootProject.group version = rootProject.version - archivesBaseName = rootProject.name + archivesBaseName = rootProject.name + "-" + project.name publishing { repositories { diff --git a/default-plugin/build.gradle b/default-plugin/build.gradle deleted file mode 100644 index 52b92ba90..000000000 --- a/default-plugin/build.gradle +++ /dev/null @@ -1,55 +0,0 @@ -archivesBaseName = rootProject.name + "-" + project.name - -loom { - accessWidenerPath = gradle.rootProject.project("fabric").file("src/main/resources/roughlyenoughitems.accessWidener") -} - -dependencies { - modCompileOnly("net.fabricmc:fabric-loader:${project.fabricloader_version}") - modApi("me.shedaniel.cloth:cloth-config:${cloth_config_version}") - modApi("dev.architectury:architectury:${architectury_version}") - compileClasspath(project(path: ":api", configuration: "namedElements")) -} - -architectury { - common(forgeEnabled.toBoolean()) -} - -remapJar { - classifier "raw" -} - -task fakeJar(type: Jar, dependsOn: remapJar) { - from remapJar.archiveFile.map { zipTree(it) } - from(rootProject.file("fake/fabric.mod.json")) { - into "" - } - classifier null -} - -task fakeForgeJar(type: Jar, dependsOn: remapJar) { - from remapJar.archiveFile.map { zipTree(it) } - from(rootProject.file("fake/fabric.mod.json")) { - into "" - } - classifier "fake-forge" -} - -artifacts { - apiElements(fakeJar) - runtimeElements(fakeJar) -} - -afterEvaluate { - configurations.apiElements.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(tasks.remapJar) } - configurations.runtimeElements.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(tasks.remapJar) } -} - -publishing { - publications { - mavenCommon(MavenPublication) { - artifactId = rootProject.name + "-" + project.name - from components.java - } - } -} diff --git a/fabric/build.gradle b/fabric/build.gradle index 2525b30d2..1dc8b1523 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -25,8 +25,6 @@ loom { accessWidenerPath = file("src/main/resources/roughlyenoughitems.accessWidener") } -def depProjects = [":api", ":runtime", ":default-plugin"] - dependencies { modApi("net.fabricmc:fabric-loader:${project.fabricloader_version}") modApi("net.fabricmc.fabric-api:fabric-api:${project.fabric_api}") diff --git a/forge/build.gradle b/forge/build.gradle index 2fc76b263..b31fbb684 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -66,8 +66,6 @@ loom { } } -def depProjects = [":api", ":runtime", ":default-plugin"] - dependencies { forge("net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}") modApi("me.shedaniel.cloth:cloth-config-forge:${cloth_config_version}") diff --git a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java index fc0731a88..4f0fa051b 100644 --- a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java +++ b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java @@ -30,11 +30,10 @@ import me.shedaniel.rei.api.common.plugins.REIPluginProvider; import me.shedaniel.rei.api.common.plugins.REIServerPlugin; import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.init.PluginDetector; import me.shedaniel.rei.jeicompat.JEIExtraClientPlugin; import me.shedaniel.rei.jeicompat.JEIExtraPlugin; import me.shedaniel.rei.jeicompat.JEIPluginDetector; -import me.shedaniel.rei.plugin.client.DefaultClientPlugin; -import me.shedaniel.rei.impl.init.PluginDetector; import me.shedaniel.rei.plugin.client.forge.DefaultClientPluginImpl; import me.shedaniel.rei.plugin.client.runtime.DefaultClientRuntimePlugin; import me.shedaniel.rei.plugin.common.forge.DefaultPluginImpl; @@ -96,21 +95,21 @@ public Supplier detectClientPlugins() { return () -> () -> { PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultClientPluginImpl())); PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultClientRuntimePlugin())); - PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new JEIExtraClientPlugin())); + PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new JEIExtraClientPlugin())); AnnotationUtils.scanAnnotation(REIPlugin.class, REIClientPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { ((PluginView) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); }); - ClientInternals.attachInstance((Supplier>) () -> { - List modIds = new ArrayList<>(); - for (REIPluginProvider plugin : PluginManager.getClientInstance().getPluginProviders()) { - if (plugin instanceof JEIPluginDetector.JEIPluginProvider) { - modIds.addAll(((JEIPluginDetector.JEIPluginProvider) plugin).modIds); + ClientInternals.attachInstance((Supplier>) () -> { + List modIds = new ArrayList<>(); + for (REIPluginProvider plugin : PluginManager.getClientInstance().getPluginProviders()) { + if (plugin instanceof JEIPluginDetector.JEIPluginProvider) { + modIds.addAll(((JEIPluginDetector.JEIPluginProvider) plugin).modIds); } } - return modIds; - }, "jeiCompatMods"); - JEIPluginDetector.detect((aClass, consumer) -> AnnotationUtils.scanAnnotation((Class) aClass, c -> true, - (TriConsumer, Supplier, Class>) (TriConsumer) consumer), PluginView.getClientInstance()::registerPlugin); + return modIds; + }, "jeiCompatMods"); + JEIPluginDetector.detect((aClass, consumer) -> AnnotationUtils.scanAnnotation((Class) aClass, c -> true, + (TriConsumer, Supplier, Class>) (TriConsumer) consumer), PluginView.getClientInstance()::registerPlugin); }; } } diff --git a/runtime-engine/build.gradle b/runtime-engine/build.gradle new file mode 100644 index 000000000..4d96de5ac --- /dev/null +++ b/runtime-engine/build.gradle @@ -0,0 +1,7 @@ +dependencies { + depProjects.forEach { + if (it.startsWith(":runtime-engine:")) { + compileClasspath(project(path: it, configuration: "namedElements")) { transitive false } + } + } +} diff --git a/runtime-engine/categories/.gradle/loom-cache/launch.cfg b/runtime-engine/categories/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..983de0279 --- /dev/null +++ b/runtime-engine/categories/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/categories/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/categories/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/categories/.gradle/loom-cache/log4j.xml b/runtime-engine/categories/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/categories/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/categories/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/categories/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/categories/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl$Configuration.class b/runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl$Configuration.class new file mode 100644 index 0000000000000000000000000000000000000000..06ebb4a0da7fcd0ca1daf48509a88cc81379e5b3 GIT binary patch literal 7035 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 literal 0 HcmV?d00001 diff --git a/runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.class b/runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..2107b717e094094d5a041b09749603c5e31514fc GIT binary patch literal 10847 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 Xj4w#)7T+UTp*KnEFHyt&rOAH)-0mMv literal 0 HcmV?d00001 diff --git a/runtime-engine/categories/build/libs/categories-transformProductionFabric.jar b/runtime-engine/categories/build/libs/categories-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime-engine/categories/build/libs/categories-transformProductionForge.jar b/runtime-engine/categories/build/libs/categories-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.api.client.registry.category.CategoryRegistry b/runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.api.client.registry.category.CategoryRegistry new file mode 100644 index 000000000..61b3a5741 --- /dev/null +++ b/runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.api.client.registry.category.CategoryRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.registry.category.CategoryRegistryImpl \ No newline at end of file diff --git a/runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor b/runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor new file mode 100644 index 000000000..6909538ca --- /dev/null +++ b/runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.category.CategoryIdentifierConstructorImpl \ No newline at end of file diff --git a/runtime-engine/categories/build/tmp/updateLicenseMain/original/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java b/runtime-engine/categories/build/tmp/updateLicenseMain/original/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java new file mode 100644 index 000000000..cef00c684 --- /dev/null +++ b/runtime-engine/categories/build/tmp/updateLicenseMain/original/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java @@ -0,0 +1,22 @@ +package me.shedaniel.rei.impl.common.category; + +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; +import me.shedaniel.rei.impl.Internals; +import net.minecraft.resources.ResourceLocation; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class CategoryIdentifierConstructorImpl implements Internals.CategoryIdentifierConstructor { + private static final Map> CACHE = new ConcurrentHashMap<>(); + + @Override + public CategoryIdentifier create(String location) { + CategoryIdentifier identifier = CACHE.get(location); + if (identifier != null) return identifier.cast(); + identifier = new CategoryIdentifierImpl<>(new ResourceLocation(location)); + CACHE.put(location, identifier); + return identifier.cast(); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.java b/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.java rename to runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.java index 5ab3f59a7..b330b368c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.java +++ b/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.java @@ -106,7 +106,7 @@ public void configure(CategoryIdentifier category, Consum @Override public Iterator> iterator() { - return (Iterator) categories.values().iterator(); + return (Iterator>) (Iterator) categories.values().iterator(); } @Override diff --git a/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java b/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java new file mode 100644 index 000000000..a4246ccec --- /dev/null +++ b/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java @@ -0,0 +1,45 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.category; + +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; +import me.shedaniel.rei.impl.Internals; +import net.minecraft.resources.ResourceLocation; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class CategoryIdentifierConstructorImpl implements Internals.CategoryIdentifierConstructor { + private static final Map> CACHE = new ConcurrentHashMap<>(); + + @Override + public CategoryIdentifier create(String location) { + CategoryIdentifier identifier = CACHE.get(location); + if (identifier != null) return identifier.cast(); + identifier = new CategoryIdentifierImpl<>(new ResourceLocation(location)); + CACHE.put(location, identifier); + return identifier.cast(); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.java b/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.java similarity index 73% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.java rename to runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.java index 283a0fd40..8fc1e0a9b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.java +++ b/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.java @@ -25,19 +25,17 @@ import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.impl.Internals; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.ApiStatus; -import java.util.Map; import java.util.Objects; -import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; -public class CategoryIdentifierImpl implements CategoryIdentifier { +@ApiStatus.Internal +class CategoryIdentifierImpl implements CategoryIdentifier { private final ResourceLocation location; private final int hashCode; - public CategoryIdentifierImpl(ResourceLocation location) { + CategoryIdentifierImpl(ResourceLocation location) { this.location = Objects.requireNonNull(location); this.hashCode = location.hashCode(); } @@ -66,15 +64,4 @@ public boolean equals(Object obj) { public String toString() { return location.toString(); } - - public static void attach() { - Map> cache = new ConcurrentHashMap<>(); - Internals.attachInstance((Function>) id -> { - CategoryIdentifier identifier = cache.get(id); - if (identifier != null) return identifier; - identifier = new CategoryIdentifierImpl<>(new ResourceLocation(id)); - cache.put(id, identifier); - return identifier; - }, "categoryIdentifier"); - } } diff --git a/runtime-engine/categories/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.category.CategoryRegistry b/runtime-engine/categories/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.category.CategoryRegistry new file mode 100644 index 000000000..61b3a5741 --- /dev/null +++ b/runtime-engine/categories/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.category.CategoryRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.registry.category.CategoryRegistryImpl \ No newline at end of file diff --git a/runtime-engine/categories/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor b/runtime-engine/categories/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor new file mode 100644 index 000000000..6909538ca --- /dev/null +++ b/runtime-engine/categories/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.category.CategoryIdentifierConstructorImpl \ No newline at end of file diff --git a/runtime-engine/configs/.gradle/loom-cache/launch.cfg b/runtime-engine/configs/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..a0890e04c --- /dev/null +++ b/runtime-engine/configs/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/configs/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/configs/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/configs/.gradle/loom-cache/log4j.xml b/runtime-engine/configs/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/configs/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/configs/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/configs/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/configs/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/configs/build/libs/configs-transformProductionFabric.jar b/runtime-engine/configs/build/libs/configs-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..eabc1eb02ae77c2cc32006f127d568485edcd171 GIT binary patch literal 166 zcmWIWW@Zs#;Nak3uxR-m!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0IzNv`2YX_ literal 0 HcmV?d00001 diff --git a/runtime-engine/configs/build/libs/configs-transformProductionForge.jar b/runtime-engine/configs/build/libs/configs-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..eabc1eb02ae77c2cc32006f127d568485edcd171 GIT binary patch literal 166 zcmWIWW@Zs#;Nak3uxR-m!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0IzNv`2YX_ literal 0 HcmV?d00001 diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java similarity index 87% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java rename to runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java index 2a1e99012..2970c5b62 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java @@ -29,6 +29,7 @@ import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import com.mojang.datafixers.util.Pair; import dev.architectury.hooks.client.screen.ScreenHooks; import me.shedaniel.autoconfig.AutoConfig; import me.shedaniel.autoconfig.annotation.ConfigEntry; @@ -46,7 +47,6 @@ import me.shedaniel.clothconfig2.gui.GlobalizedClothConfigScreen; import me.shedaniel.clothconfig2.gui.entries.KeyCodeEntry; import me.shedaniel.clothconfig2.gui.entries.TextListEntry; -import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry; @@ -86,15 +86,17 @@ import net.minecraft.world.InteractionResult; import org.jetbrains.annotations.ApiStatus; +import java.lang.reflect.Field; import java.util.*; import java.util.function.Consumer; +import java.util.function.Supplier; import static me.shedaniel.autoconfig.util.Utils.getUnsafely; import static me.shedaniel.autoconfig.util.Utils.setUnsafely; @ApiStatus.Internal @Environment(EnvType.CLIENT) -public class ConfigManagerImpl implements ConfigManager { +public class ConfigManagerImpl implements ConfigManagerInternal { private boolean craftableOnly = false; private final Gson gson = new GsonBuilder().create(); private ConfigObjectImpl object; @@ -375,12 +377,12 @@ public List narratables() { if (Minecraft.getInstance().getConnection() != null && Minecraft.getInstance().getConnection().getRecipeManager() != null) { TextListEntry feedbackEntry = ConfigEntryBuilder.create().startTextDescription( new TranslatableComponent("text.rei.feedback", new TranslatableComponent("text.rei.feedback.link") - .withStyle(style -> style - .withColor(TextColor.fromRgb(0xff1fc3ff)) - .withUnderlined(true) - .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://forms.gle/5tdnK5WN1wng78pV8")) + .withStyle(style -> style + .withColor(TextColor.fromRgb(0xff1fc3ff)) + .withUnderlined(true) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://forms.gle/5tdnK5WN1wng78pV8")) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ImmutableTextComponent("https://forms.gle/5tdnK5WN1wng78pV8"))) - )) + )) .withStyle(ChatFormatting.GRAY) ).build(); builder.getOrCreateCategory(new TranslatableComponent("config.roughlyenoughitems.advanced")).getEntries().add(0, feedbackEntry); @@ -399,18 +401,18 @@ public List narratables() { TextListEntry supportText = ConfigEntryBuilder.create().startTextDescription( new TranslatableComponent("text.rei.support.me.desc", new TranslatableComponent("text.rei.support.me.patreon") - .withStyle(style -> style - .withColor(TextColor.fromRgb(0xff1fc3ff)) - .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://patreon.com/shedaniel")) + .withStyle(style -> style + .withColor(TextColor.fromRgb(0xff1fc3ff)) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://patreon.com/shedaniel")) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ImmutableTextComponent("https://patreon.com/shedaniel"))) - ), + ), new TranslatableComponent("text.rei.support.me.bisect") - .withStyle(style -> style - .withColor(TextColor.fromRgb(0xff1fc3ff)) - .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://www.bisecthosting.com/shedaniel")) + .withStyle(style -> style + .withColor(TextColor.fromRgb(0xff1fc3ff)) + .withClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, "https://www.bisecthosting.com/shedaniel")) .withHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ImmutableTextComponent("https://www.bisecthosting.com/shedaniel"))) - ) - ) + ) + ) .withStyle(ChatFormatting.GRAY) ).build(); supportText.setScreen((AbstractConfigScreen) screen); @@ -436,4 +438,57 @@ public List narratables() { } return null; } + + @Override + public Object get(String fieldKey) { + Pair, Field> pair = locateField(fieldKey); + try { + return pair.getSecond().get(pair.getFirst().get()); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + + @Override + public boolean set(String fieldKey, Object value) { + try { + Pair, Field> pair = locateField(fieldKey); + pair.getSecond().set(pair.getFirst().get(), value); + ConfigManager.getInstance().saveConfig(); + REIRuntime.getInstance().getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); + return true; + } catch (Throwable e) { + return false; + } + } + + private static final Map, Field>> FIELD_CACHE = new HashMap<>(); + + private Pair, Field> locateField(String fieldKey) { + return FIELD_CACHE.computeIfAbsent(fieldKey, key -> { + // resolve dot separated field names + String[] fieldNames = key.split("\\."); + try { + Supplier owner = this::getConfig; + Field field = ConfigObjectImpl.class.getDeclaredField(fieldNames[0]); + field.setAccessible(true); + for (int i = 1; i < fieldNames.length; i++) { + Supplier previousOwner = owner; + Field previousField = field; + owner = () -> { + try { + return previousField.get(previousOwner.get()); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + }; + field = field.getType().getDeclaredField(fieldNames[i]); + field.setAccessible(true); + } + return new Pair<>(owner, field); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } + }); + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java similarity index 93% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java rename to runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java index 83964e65c..d0b63a1ff 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java @@ -108,10 +108,6 @@ public boolean isUsingDarkTheme() { return appearance.theme == AppearanceTheme.DARK; } - public void setUsingDarkTheme(boolean dark) { - appearance.theme = dark ? AppearanceTheme.DARK : AppearanceTheme.LIGHT; - } - @Override public boolean isGrabbingItems() { return basics.cheatingStyle == ItemCheatingStyle.GRAB; @@ -132,10 +128,6 @@ public boolean isEntryListWidgetScrolled() { return appearance.scrollingEntryListWidget; } - public void setEntryListWidgetScrolled(boolean scrollingEntryListWidget) { - appearance.scrollingEntryListWidget = scrollingEntryListWidget; - } - @Override public boolean shouldAppendModNames() { return advanced.tooltips.appendModNames; @@ -156,28 +148,16 @@ public SearchFieldLocation getSearchFieldLocation() { return appearance.layout.searchFieldLocation; } - public void setSearchFieldLocation(SearchFieldLocation location) { - appearance.layout.searchFieldLocation = location; - } - @Override public DisplayPanelLocation getDisplayPanelLocation() { return advanced.accessibility.displayPanelLocation; } - public void setDisplayPanelLocation(DisplayPanelLocation location) { - advanced.accessibility.displayPanelLocation = location; - } - @Override public boolean isCraftableFilterEnabled() { return appearance.layout.showCraftableOnlyButton; } - public void setCraftableFilterEnabled(boolean enabled) { - appearance.layout.showCraftableOnlyButton = enabled; - } - @Override public String getGamemodeCommand() { return advanced.commands.gamemodeCommand; @@ -214,19 +194,11 @@ public ResourceLocation getInputMethodId() { return functionality.inputMethod; } - public void setInputMethodId(@Nullable ResourceLocation id) { - functionality.inputMethod = id; - } - @Override public boolean doesDisableRecipeBook() { return functionality.disableRecipeBook; } - public void setDisableRecipeBook(boolean disableRecipeBook) { - functionality.disableRecipeBook = disableRecipeBook; - } - @Override public boolean doesFixTabCloseContainer() { return functionality.disableRecipeBook; @@ -237,10 +209,6 @@ public boolean isLeftSideMobEffects() { return functionality.leftSideMobEffects; } - public void setLeftSideMobEffects(boolean leftSideMobEffects) { - functionality.leftSideMobEffects = leftSideMobEffects; - } - @Override public boolean areClickableRecipeArrowsEnabled() { return advanced.miscellaneous.clickableRecipeArrows; @@ -286,10 +254,6 @@ public boolean doesCacheEntryRendering() { return advanced.miscellaneous.cachingFastEntryRendering; } - public void setDoesCacheEntryRendering(boolean doesCacheEntryRendering) { - advanced.miscellaneous.cachingFastEntryRendering = doesCacheEntryRendering; - } - @Override public boolean doDebugRenderTimeRequired() { return advanced.layout.debugRenderTimeRequired; @@ -360,11 +324,6 @@ public double getEntrySize() { return advanced.accessibility.entrySize; } - public boolean setEntrySize(double entrySize) { - double original = advanced.accessibility.entrySize; - return (advanced.accessibility.entrySize = Mth.clamp(entrySize, 0.25, 4)) != original; - } - @Override public boolean isUsingCompactTabs() { return advanced.accessibility.useCompactTabs; @@ -486,10 +445,6 @@ public SyntaxHighlightingMode getSyntaxHighlightingMode() { return appearance.syntaxHighlightingMode; } - public void setSyntaxHighlightingMode(SyntaxHighlightingMode mode) { - appearance.syntaxHighlightingMode = mode; - } - @Override public boolean isFocusModeZoomed() { return appearance.isFocusModeZoomed; @@ -520,10 +475,6 @@ public boolean isJEICompatibilityLayerEnabled() { return Platform.isForge() && advanced.enableJeiCompatibilityLayer; } - public void setJEICompatibilityLayerEnabled(boolean value) { - advanced.enableJeiCompatibilityLayer = value; - } - @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.FIELD}) @interface DontApplyFieldName {} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/addon/ConfigAddonRegistryImpl.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/addon/ConfigAddonRegistryImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/config/addon/ConfigAddonRegistryImpl.java rename to runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/addon/ConfigAddonRegistryImpl.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/addon/ConfigAddonsScreen.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/addon/ConfigAddonsScreen.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/config/addon/ConfigAddonsScreen.java rename to runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/addon/ConfigAddonsScreen.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ConfigAddonsEntry.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/ConfigAddonsEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ConfigAddonsEntry.java rename to runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/ConfigAddonsEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java rename to runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/SearchFilterSyntaxHighlightingEntry.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/SearchFilterSyntaxHighlightingEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/SearchFilterSyntaxHighlightingEntry.java rename to runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/SearchFilterSyntaxHighlightingEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/TitleTextEntry.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/TitleTextEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/TitleTextEntry.java rename to runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/TitleTextEntry.java diff --git a/runtime-engine/configs/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.config.ConfigManager b/runtime-engine/configs/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.config.ConfigManager new file mode 100644 index 000000000..0ad21ca34 --- /dev/null +++ b/runtime-engine/configs/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.config.ConfigManager @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.config.ConfigManagerImpl \ No newline at end of file diff --git a/runtime-engine/configs/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.config.ConfigObject b/runtime-engine/configs/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.config.ConfigObject new file mode 100644 index 000000000..01599338f --- /dev/null +++ b/runtime-engine/configs/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.config.ConfigObject @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.config.ConfigObjectImpl \ No newline at end of file diff --git a/runtime-engine/configs/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry b/runtime-engine/configs/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry new file mode 100644 index 000000000..02353547f --- /dev/null +++ b/runtime-engine/configs/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.config.addon.ConfigAddonRegistryImpl \ No newline at end of file diff --git a/runtime-engine/default-runtime-plugin/.gradle/loom-cache/launch.cfg b/runtime-engine/default-runtime-plugin/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..78cd94430 --- /dev/null +++ b/runtime-engine/default-runtime-plugin/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/default-runtime-plugin/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/default-runtime-plugin/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/default-runtime-plugin/.gradle/loom-cache/log4j.xml b/runtime-engine/default-runtime-plugin/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/default-runtime-plugin/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/default-runtime-plugin/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/default-runtime-plugin/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/default-runtime-plugin/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/default-runtime-plugin/build/libs/default-runtime-plugin-transformProductionFabric.jar b/runtime-engine/default-runtime-plugin/build/libs/default-runtime-plugin-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..6430324c7b707c52acb9bbf7c3ee3f5b6838d60c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3Fsc6?!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0H-V)=Kufz literal 0 HcmV?d00001 diff --git a/runtime-engine/default-runtime-plugin/build/libs/default-runtime-plugin-transformProductionForge.jar b/runtime-engine/default-runtime-plugin/build/libs/default-runtime-plugin-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..6430324c7b707c52acb9bbf7c3ee3f5b6838d60c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3Fsc6?!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0H-V)=Kufz literal 0 HcmV?d00001 diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java b/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java rename to runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java b/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java rename to runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/common/runtime/DefaultRuntimePlugin.java b/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/common/runtime/DefaultRuntimePlugin.java similarity index 95% rename from runtime/src/main/java/me/shedaniel/rei/plugin/common/runtime/DefaultRuntimePlugin.java rename to runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/common/runtime/DefaultRuntimePlugin.java index 482b0f2ec..533af546a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/common/runtime/DefaultRuntimePlugin.java +++ b/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/common/runtime/DefaultRuntimePlugin.java @@ -40,8 +40,6 @@ @ApiStatus.Internal public class DefaultRuntimePlugin implements REIServerPlugin { - public static final ResourceLocation PLUGIN = new ResourceLocation("roughlyenoughitems", "default_runtime_plugin"); - @Override public void registerEntryTypes(EntryTypeRegistry registry) { registry.register(VanillaEntryTypes.ITEM, new ItemEntryDefinition()); diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/test/REITestPlugin.java b/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/test/REITestPlugin.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/plugin/test/REITestPlugin.java rename to runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/test/REITestPlugin.java diff --git a/runtime-engine/displays/.gradle/loom-cache/launch.cfg b/runtime-engine/displays/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..a9fc564cc --- /dev/null +++ b/runtime-engine/displays/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/displays/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/displays/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/displays/.gradle/loom-cache/log4j.xml b/runtime-engine/displays/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/displays/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/displays/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/displays/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/displays/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/displays/build/libs/displays-transformProductionFabric.jar b/runtime-engine/displays/build/libs/displays-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime-engine/displays/build/libs/displays-transformProductionForge.jar b/runtime-engine/displays/build/libs/displays-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java b/runtime-engine/displays/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java rename to runtime-engine/displays/src/main/java/me/shedaniel/rei/impl/client/registry/display/DisplayRegistryImpl.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/registry/RecipeManagerContextImpl.java b/runtime-engine/displays/src/main/java/me/shedaniel/rei/impl/common/registry/RecipeManagerContextImpl.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/registry/RecipeManagerContextImpl.java rename to runtime-engine/displays/src/main/java/me/shedaniel/rei/impl/common/registry/RecipeManagerContextImpl.java index 0a2167f40..fd6392fcf 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/registry/RecipeManagerContextImpl.java +++ b/runtime-engine/displays/src/main/java/me/shedaniel/rei/impl/common/registry/RecipeManagerContextImpl.java @@ -42,6 +42,10 @@ public class RecipeManagerContextImpl

> implements RecipeM private final Supplier recipeManager; private List> sortedRecipes = null; + public RecipeManagerContextImpl() { + this(supplier()); + } + public RecipeManagerContextImpl(Supplier recipeManager) { this.recipeManager = recipeManager; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/display/DisplaySerializerRegistryImpl.java b/runtime-engine/displays/src/main/java/me/shedaniel/rei/impl/common/registry/display/DisplaySerializerRegistryImpl.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/display/DisplaySerializerRegistryImpl.java rename to runtime-engine/displays/src/main/java/me/shedaniel/rei/impl/common/registry/display/DisplaySerializerRegistryImpl.java index 98b9f6b46..c8a9bcf04 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/display/DisplaySerializerRegistryImpl.java +++ b/runtime-engine/displays/src/main/java/me/shedaniel/rei/impl/common/registry/display/DisplaySerializerRegistryImpl.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.display; +package me.shedaniel.rei.impl.common.registry.display; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; diff --git a/runtime-engine/displays/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.display.DisplayRegistry b/runtime-engine/displays/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.display.DisplayRegistry new file mode 100644 index 000000000..0da433b23 --- /dev/null +++ b/runtime-engine/displays/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.display.DisplayRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.registry.display.DisplayRegistryImpl \ No newline at end of file diff --git a/runtime-engine/displays/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.display.DisplaySerializerRegistry b/runtime-engine/displays/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.display.DisplaySerializerRegistry new file mode 100644 index 000000000..e908432e2 --- /dev/null +++ b/runtime-engine/displays/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.display.DisplaySerializerRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.registry.display.DisplaySerializerRegistryImpl \ No newline at end of file diff --git a/runtime-engine/displays/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.registry.RecipeManagerContext b/runtime-engine/displays/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.registry.RecipeManagerContext new file mode 100644 index 000000000..1989d999c --- /dev/null +++ b/runtime-engine/displays/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.registry.RecipeManagerContext @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.registry.RecipeManagerContextImpl \ No newline at end of file diff --git a/runtime-engine/entries/.gradle/loom-cache/launch.cfg b/runtime-engine/entries/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..37d0ec9e3 --- /dev/null +++ b/runtime-engine/entries/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/entries/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/entries/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/entries/.gradle/loom-cache/log4j.xml b/runtime-engine/entries/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/entries/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/entries/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/entries/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/entries/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/entries/build/libs/entries-transformProductionFabric.jar b/runtime-engine/entries/build/libs/entries-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime-engine/entries/build/libs/entries-transformProductionForge.jar b/runtime-engine/entries/build/libs/entries-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryImpl.java similarity index 92% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java rename to runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryImpl.java index 293f3bc3e..be1ed5225 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryImpl.java +++ b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryImpl.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry.type; +package me.shedaniel.rei.impl.client.entry.type; import com.google.common.collect.Lists; import it.unimi.dsi.fastutil.longs.LongArrayList; @@ -39,6 +39,7 @@ import me.shedaniel.rei.api.common.registry.ReloadStage; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryStacks; +import me.shedaniel.rei.impl.Internals; import me.shedaniel.rei.impl.common.InternalLogger; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -57,8 +58,7 @@ @ApiStatus.Internal @Environment(EnvType.CLIENT) public class EntryRegistryImpl implements EntryRegistry { - public List listeners = Lists.newCopyOnWriteArrayList(); - private PreFilteredEntryList preFilteredList; + private final List listeners = Lists.newCopyOnWriteArrayList(); private EntryRegistryList registryList; private LongSet entriesHash; private boolean reloading; @@ -66,8 +66,7 @@ public class EntryRegistryImpl implements EntryRegistry { public EntryRegistryImpl() { registryList = new NormalEntryRegistryList(); entriesHash = new LongOpenHashSet(); - preFilteredList = new PreFilteredEntryList(this); - listeners.add(preFilteredList); + listeners.addAll(Internals.resolveServices(EntryRegistryListener.class)); } @Override @@ -82,11 +81,8 @@ public ReloadStage getStage() { @Override public void startReload() { - listeners.clear(); registryList = new ReloadingEntryRegistryList(); entriesHash = new LongOpenHashSet(); - preFilteredList = new PreFilteredEntryList(this); - listeners.add(preFilteredList); reloading = true; } @@ -117,11 +113,6 @@ public Stream> getEntryStacks() { return registryList.stream(); } - @Override - public List> getPreFilteredList() { - return Collections.unmodifiableList(preFilteredList.getList()); - } - @Override public void refilter() { List> stacks = registryList.collect(); @@ -158,12 +149,6 @@ public List appendStacksForItem(Item item) { return list; } - @ApiStatus.Internal - @Override - public Collection> refilterNew(boolean warn, Collection> entries) { - return preFilteredList.refilterNew(warn, entries); - } - @Override public boolean alreadyContain(EntryStack stack) { return entriesHash.contains(EntryStacks.hashExact(stack)); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryList.java b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryList.java similarity index 95% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryList.java rename to runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryList.java index 2672b077a..401bf61a9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryList.java +++ b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryList.java @@ -21,16 +21,18 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry.type; +package me.shedaniel.rei.impl.client.entry.type; import it.unimi.dsi.fastutil.longs.LongList; import me.shedaniel.rei.api.common.entry.EntryStack; +import org.jetbrains.annotations.ApiStatus; import java.util.List; import java.util.function.LongPredicate; import java.util.function.Predicate; import java.util.stream.Stream; +@ApiStatus.Internal public interface EntryRegistryList { int size(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryListener.java b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryListener.java similarity index 94% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryListener.java rename to runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryListener.java index e7b99493c..b1c59e0e7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryRegistryListener.java +++ b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryListener.java @@ -21,15 +21,17 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry.type; +package me.shedaniel.rei.impl.client.entry.type; import it.unimi.dsi.fastutil.longs.LongList; import me.shedaniel.rei.api.common.entry.EntryStack; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.function.Predicate; +@ApiStatus.Internal public interface EntryRegistryListener { default void addEntryAfter(@Nullable EntryStack afterEntry, EntryStack stack, long stackHashExact) {} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryTypeRegistryImpl.java b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryTypeRegistryImpl.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryTypeRegistryImpl.java rename to runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryTypeRegistryImpl.java index 90ec141ba..ad5a6261d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryTypeRegistryImpl.java +++ b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryTypeRegistryImpl.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry.type; +package me.shedaniel.rei.impl.client.entry.type; import com.google.common.collect.BiMap; import com.google.common.collect.HashBasedTable; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/NormalEntryRegistryList.java b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/NormalEntryRegistryList.java similarity index 96% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/NormalEntryRegistryList.java rename to runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/NormalEntryRegistryList.java index a6e752c6e..73f378c0f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/NormalEntryRegistryList.java +++ b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/NormalEntryRegistryList.java @@ -21,11 +21,12 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry.type; +package me.shedaniel.rei.impl.client.entry.type; import it.unimi.dsi.fastutil.longs.LongList; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.EntryStacks; +import org.jetbrains.annotations.ApiStatus; import java.util.ArrayList; import java.util.List; @@ -34,6 +35,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +@ApiStatus.Internal public class NormalEntryRegistryList implements EntryRegistryList { private List> list = new ArrayList<>(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/ReloadingEntryRegistryList.java b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/ReloadingEntryRegistryList.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/ReloadingEntryRegistryList.java rename to runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/ReloadingEntryRegistryList.java index 44211ce2c..53f21406b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/ReloadingEntryRegistryList.java +++ b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/ReloadingEntryRegistryList.java @@ -21,13 +21,14 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry.type; +package me.shedaniel.rei.impl.client.entry.type; import it.unimi.dsi.fastutil.longs.LongList; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.common.util.HashedEntryStackWrapper; import net.minecraft.core.Registry; +import org.jetbrains.annotations.ApiStatus; import java.util.ArrayList; import java.util.List; @@ -35,6 +36,7 @@ import java.util.function.Predicate; import java.util.stream.Stream; +@ApiStatus.Internal public class ReloadingEntryRegistryList implements EntryRegistryList { private List list = new ArrayList<>(Registry.ITEM.keySet().size() + 100); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/collapsed/CollapsibleEntryRegistryImpl.java b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/collapsed/CollapsibleEntryRegistryImpl.java similarity index 78% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/collapsed/CollapsibleEntryRegistryImpl.java rename to runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/collapsed/CollapsibleEntryRegistryImpl.java index 69b86f397..f5222f864 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/collapsed/CollapsibleEntryRegistryImpl.java +++ b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/collapsed/CollapsibleEntryRegistryImpl.java @@ -21,38 +21,43 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry.type.collapsed; +package me.shedaniel.rei.impl.client.entry.type.collapsed; +import com.google.common.collect.ForwardingList; import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntry; import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.common.InternalLogger; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.ApiStatus; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Objects; import java.util.function.Predicate; import java.util.stream.Collectors; -public class CollapsibleEntryRegistryImpl implements CollapsibleEntryRegistry { +@ApiStatus.Internal +public class CollapsibleEntryRegistryImpl extends ForwardingList implements CollapsibleEntryRegistry { private final List entries = new ArrayList<>(); @Override public void group(ResourceLocation id, Component name, List> stacks) { Objects.requireNonNull(stacks, "stacks"); - this.entries.add(new Entry(id.getNamespace(), name, new ListMatcher(stacks))); + this.entries.add(new Entry(id, name, new ListMatcher(stacks))); InternalLogger.getInstance().debug("Added collapsible entry group [%s] %s with %d entries", id, name.getString(), stacks.size()); } @Override public void group(ResourceLocation id, Component name, Predicate> predicate) { Objects.requireNonNull(predicate, "predicate"); - this.entries.add(new Entry(id.getNamespace(), name, (stack, hashExact) -> ((Predicate>) predicate).test(stack))); + this.entries.add(new Entry(id, name, (stack, hashExact) -> ((Predicate>) predicate).test(stack))); InternalLogger.getInstance().debug("Added collapsible entry group [%s] %s with dynamic predicate", id, name.getString()); } @@ -72,38 +77,44 @@ public void acceptPlugin(REIClientPlugin plugin) { plugin.registerCollapsibleEntries(this); } - public List getEntries() { - return entries; + @Override + protected List delegate() { + return (List) (List) Collections.unmodifiableList(this.entries); } - public static class Entry { - private final String modId; + public static class Entry implements CollapsibleEntry { + private final ResourceLocation id; private final Component name; private final Matcher matcher; private boolean expanded; - public Entry(String modId, Component name, Matcher matcher) { - this.modId = modId; + public Entry(ResourceLocation id, Component name, Matcher matcher) { + this.id = id; this.name = name; this.matcher = matcher; } - public String getModId() { - return modId; + @Override + public ResourceLocation getId() { + return id; } + @Override public Component getName() { return name; } - public Matcher getMatcher() { - return matcher; + @Override + public boolean matches(EntryStack stack, long hashExact) { + return matcher.matches(stack, hashExact); } + @Override public boolean isExpanded() { return expanded; } + @Override public void setExpanded(boolean expanded) { this.expanded = expanded; } diff --git a/runtime-engine/entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.entry.EntryRegistry b/runtime-engine/entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.entry.EntryRegistry new file mode 100644 index 000000000..e199e1429 --- /dev/null +++ b/runtime-engine/entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.entry.EntryRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.entry.type.EntryRegistryImpl \ No newline at end of file diff --git a/runtime-engine/entry-stacks/.gradle/loom-cache/launch.cfg b/runtime-engine/entry-stacks/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..6c940564d --- /dev/null +++ b/runtime-engine/entry-stacks/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/entry-stacks/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/entry-stacks/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/entry-stacks/.gradle/loom-cache/log4j.xml b/runtime-engine/entry-stacks/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/entry-stacks/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/entry-stacks/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/entry-stacks/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/entry-stacks/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/entry-stacks/build/libs/RoughlyEnoughItems-entry-stacks-8.3.9999-transformProductionFabric.jar b/runtime-engine/entry-stacks/build/libs/RoughlyEnoughItems-entry-stacks-8.3.9999-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..7c15ed0d5c5975298d155b177f90831968004645 GIT binary patch literal 166 zcmWIWW@Zs#;Nak3V5s>W!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0CavEc>n+a literal 0 HcmV?d00001 diff --git a/runtime-engine/entry-stacks/build/libs/RoughlyEnoughItems-entry-stacks-8.3.9999-transformProductionForge.jar b/runtime-engine/entry-stacks/build/libs/RoughlyEnoughItems-entry-stacks-8.3.9999-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..7c15ed0d5c5975298d155b177f90831968004645 GIT binary patch literal 166 zcmWIWW@Zs#;Nak3V5s>W!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0CavEc>n+a literal 0 HcmV?d00001 diff --git a/runtime-engine/entry-stacks/build/libs/entry-stacks-transformProductionFabric.jar b/runtime-engine/entry-stacks/build/libs/entry-stacks-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime-engine/entry-stacks/build/libs/entry-stacks-transformProductionForge.jar b/runtime-engine/entry-stacks/build/libs/entry-stacks-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java similarity index 99% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java rename to runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java index 2a512718d..017fc7cf0 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java +++ b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java @@ -28,6 +28,7 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.Internals; import net.minecraft.nbt.ListTag; +import org.jetbrains.annotations.ApiStatus; import java.util.*; import java.util.function.Consumer; @@ -35,9 +36,8 @@ import java.util.function.UnaryOperator; import java.util.stream.StreamSupport; -public enum EntryIngredientImpl implements Internals.EntryIngredientProvider { - INSTANCE; - +@ApiStatus.Internal +public class EntryIngredientImpl implements Internals.EntryIngredientProvider { @Override public EntryIngredient empty() { return EmptyEntryIngredient.EMPTY; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/settings/EntrySettingsAdapterRegistryImpl.java b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/settings/EntrySettingsAdapterRegistryImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/settings/EntrySettingsAdapterRegistryImpl.java rename to runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/settings/EntrySettingsAdapterRegistryImpl.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/AbstractEntryStack.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java rename to runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/AbstractEntryStack.java index d67beed02..9bfe7bfb5 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/AbstractEntryStack.java +++ b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/AbstractEntryStack.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry; +package me.shedaniel.rei.impl.common.entry.stack; import com.mojang.blaze3d.vertex.PoseStack; import it.unimi.dsi.fastutil.shorts.Short2ObjectMap; @@ -54,7 +54,7 @@ import java.util.stream.Stream; @ApiStatus.Internal -public abstract class AbstractEntryStack implements EntryStack, Renderer { +abstract class AbstractEntryStack implements EntryStack, Renderer { private static final Short2ObjectMap EMPTY_SETTINGS = Short2ObjectMaps.emptyMap(); private Short2ObjectMap settings = null; @Environment(EnvType.CLIENT) diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EmptyEntryStack.java b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/EmptyEntryStack.java similarity index 90% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EmptyEntryStack.java rename to runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/EmptyEntryStack.java index 030a17b09..43030eb92 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EmptyEntryStack.java +++ b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/EmptyEntryStack.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry; +package me.shedaniel.rei.impl.common.entry.stack; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.BuiltinEntryTypes; @@ -30,8 +30,8 @@ import org.jetbrains.annotations.ApiStatus; @ApiStatus.Internal -public class EmptyEntryStack extends AbstractEntryStack { - public static final EntryStack EMPTY = new EmptyEntryStack(); +class EmptyEntryStack extends AbstractEntryStack { + static final EntryStack EMPTY = new EmptyEntryStack(); @Override public EntryDefinition getDefinition() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EntryStackProviderImpl.java b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/EntryStackProviderImpl.java similarity index 90% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EntryStackProviderImpl.java rename to runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/EntryStackProviderImpl.java index b1cd2d932..3de5102f6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/EntryStackProviderImpl.java +++ b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/EntryStackProviderImpl.java @@ -21,19 +21,19 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry; +package me.shedaniel.rei.impl.common.entry.stack; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.BuiltinEntryTypes; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.impl.Internals; import net.minecraft.util.Unit; +import org.jetbrains.annotations.ApiStatus; import java.util.Objects; -public enum EntryStackProviderImpl implements Internals.EntryStackProvider { - INSTANCE; - +@ApiStatus.Internal +public class EntryStackProviderImpl implements Internals.EntryStackProvider { @Override public EntryStack empty() { return EmptyEntryStack.EMPTY; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/TypedEntryStack.java b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/TypedEntryStack.java similarity index 91% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/TypedEntryStack.java rename to runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/TypedEntryStack.java index 5d159d79b..41003fc9d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/TypedEntryStack.java +++ b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/TypedEntryStack.java @@ -21,17 +21,17 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry; +package me.shedaniel.rei.impl.common.entry.stack; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import org.jetbrains.annotations.ApiStatus; @ApiStatus.Internal -public class TypedEntryStack extends AbstractEntryStack { +class TypedEntryStack extends AbstractEntryStack { private final EntryDefinition definition; private T value; - public TypedEntryStack(EntryDefinition definition, T value) { + TypedEntryStack(EntryDefinition definition, T value) { this.definition = definition; this.value = value; if (!definition.acceptsNull()) { diff --git a/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.settings.EntrySettingsAdapterRegistry b/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.settings.EntrySettingsAdapterRegistry new file mode 100644 index 000000000..bc736692e --- /dev/null +++ b/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.settings.EntrySettingsAdapterRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.entry.settings.EntrySettingsAdapterRegistryImpl \ No newline at end of file diff --git a/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$EntryIngredientProvider b/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$EntryIngredientProvider new file mode 100644 index 000000000..9349d031d --- /dev/null +++ b/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$EntryIngredientProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.entry.EntryIngredientImpl \ No newline at end of file diff --git a/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$EntryStackProvider b/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$EntryStackProvider new file mode 100644 index 000000000..2ef298128 --- /dev/null +++ b/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$EntryStackProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.entry.stack.EntryStackProviderImpl \ No newline at end of file diff --git a/runtime-engine/entry-types/.gradle/loom-cache/launch.cfg b/runtime-engine/entry-types/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..8cad64e87 --- /dev/null +++ b/runtime-engine/entry-types/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/entry-types/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/entry-types/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/entry-types/.gradle/loom-cache/log4j.xml b/runtime-engine/entry-types/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/entry-types/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/entry-types/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/entry-types/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/entry-types/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/entry-types/build/libs/RoughlyEnoughItems-entry-types-8.3.9999-transformProductionFabric.jar b/runtime-engine/entry-types/build/libs/RoughlyEnoughItems-entry-types-8.3.9999-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..46ac07fb2c6e5b0fd902996a83b5a49846d58ab8 GIT binary patch literal 166 zcmWIWW@Zs#;Nak3V66Ea!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Cj2`djJ3c literal 0 HcmV?d00001 diff --git a/runtime-engine/entry-types/build/libs/RoughlyEnoughItems-entry-types-8.3.9999-transformProductionForge.jar b/runtime-engine/entry-types/build/libs/RoughlyEnoughItems-entry-types-8.3.9999-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..46ac07fb2c6e5b0fd902996a83b5a49846d58ab8 GIT binary patch literal 166 zcmWIWW@Zs#;Nak3V66Ea!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Cj2`djJ3c literal 0 HcmV?d00001 diff --git a/runtime-engine/entry-types/build/libs/entry-types-transformProductionFabric.jar b/runtime-engine/entry-types/build/libs/entry-types-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime-engine/entry-types/build/libs/entry-types-transformProductionForge.jar b/runtime-engine/entry-types/build/libs/entry-types-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/renderer/EntryRendererRegistryImpl.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/client/entry/renderer/EntryRendererRegistryImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/renderer/EntryRendererRegistryImpl.java rename to runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/client/entry/renderer/EntryRendererRegistryImpl.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java rename to runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/FluidComparatorRegistryImpl.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/FluidComparatorRegistryImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/FluidComparatorRegistryImpl.java rename to runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/FluidComparatorRegistryImpl.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java rename to runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/NbtHasherProviderImpl.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/NbtHasherProviderImpl.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/NbtHasherProviderImpl.java rename to runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/NbtHasherProviderImpl.java index 83b8c171e..2b7dbe68a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/NbtHasherProviderImpl.java +++ b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/NbtHasherProviderImpl.java @@ -35,8 +35,7 @@ import java.util.*; import java.util.function.Predicate; -public enum NbtHasherProviderImpl implements Internals.NbtHasherProvider { - INSTANCE; +public class NbtHasherProviderImpl implements Internals.NbtHasherProvider { private final EntryComparator defaultHasher = _provide(); @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java rename to runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java index d87a94300..1a175cfec 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java +++ b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java @@ -46,7 +46,7 @@ import java.util.stream.Stream; @ApiStatus.Internal -public class BuiltinEntryDefinition implements EntryDefinition, EntrySerializer { +class BuiltinEntryDefinition implements EntryDefinition, EntrySerializer { private final Class clazz; private final EntryType type; private final boolean empty; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryTypeDeferred.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/DeferredEntryTypeImpl.java similarity index 91% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryTypeDeferred.java rename to runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/DeferredEntryTypeImpl.java index cb563f6fa..bc4a8cb32 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/EntryTypeDeferred.java +++ b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/DeferredEntryTypeImpl.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry.type; +package me.shedaniel.rei.impl.common.entry.type.types; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.EntryType; @@ -32,12 +32,12 @@ import java.lang.ref.WeakReference; @ApiStatus.Internal -public class EntryTypeDeferred implements EntryType { +class DeferredEntryTypeImpl implements EntryType { private final ResourceLocation id; private final int hashCode; private WeakReference> reference; - public EntryTypeDeferred(ResourceLocation id) { + DeferredEntryTypeImpl(ResourceLocation id) { this.id = id; this.hashCode = id.hashCode(); } @@ -67,7 +67,7 @@ public EntryDefinition getDefinition() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof EntryTypeDeferred that)) return false; + if (!(o instanceof DeferredEntryTypeImpl that)) return false; return hashCode == that.hashCode && id.equals(that.id); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/DeferringEntryTypeProviderImpl.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/DeferringEntryTypeProviderImpl.java similarity index 50% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/DeferringEntryTypeProviderImpl.java rename to runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/DeferringEntryTypeProviderImpl.java index 84ff3ff7c..f47dd9e94 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/DeferringEntryTypeProviderImpl.java +++ b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/DeferringEntryTypeProviderImpl.java @@ -21,88 +21,88 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry; +package me.shedaniel.rei.impl.common.entry.type.types; +import com.google.common.base.Suppliers; import dev.architectury.platform.Platform; import dev.architectury.utils.Env; import me.shedaniel.rei.api.client.gui.Renderer; import me.shedaniel.rei.api.common.entry.type.BuiltinEntryTypes; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.EntryType; -import me.shedaniel.rei.impl.client.entry.type.types.RenderingEntryDefinition; -import me.shedaniel.rei.impl.common.entry.type.EntryTypeDeferred; -import me.shedaniel.rei.impl.common.entry.type.types.EmptyEntryDefinition; +import me.shedaniel.rei.impl.Internals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Unit; +import org.jetbrains.annotations.ApiStatus; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Function; +import java.util.function.Supplier; -public enum DeferringEntryTypeProviderImpl implements Function> { - INSTANCE; - ResourceLocation RENDERING_ID = new ResourceLocation("rendering"); - private Map> typeCache = new ConcurrentHashMap<>(); - private EntryType empty; +@ApiStatus.Internal +public class DeferringEntryTypeProviderImpl implements Internals.DeferringEntryTypeProvider { + private static final ResourceLocation RENDERING_ID = new ResourceLocation("rendering"); + private final Map> typeCache = new ConcurrentHashMap<>(); + private final Supplier> empty = Suppliers.memoize(() -> emptyType(BuiltinEntryTypes.EMPTY_ID)); @Environment(EnvType.CLIENT) - private EntryType render; + private Supplier> render; + + public DeferringEntryTypeProviderImpl() { + if (Platform.getEnvironment() == Env.CLIENT) { + render = Suppliers.memoize(() -> renderingType(RENDERING_ID)); + } + } @Override - public EntryType apply(ResourceLocation id) { + public EntryType get(ResourceLocation id) { if (id.equals(BuiltinEntryTypes.EMPTY_ID)) { - return typeCache.computeIfAbsent(id, this::emptyType); + return typeCache.computeIfAbsent(id, $ -> empty.get()); } else if (id.equals(RENDERING_ID) && Platform.getEnvironment() == Env.CLIENT) { - return typeCache.computeIfAbsent(id, this::renderingType); + return typeCache.computeIfAbsent(id, $ -> render.get()); } - return typeCache.computeIfAbsent(id, EntryTypeDeferred::new); + return typeCache.computeIfAbsent(id, DeferredEntryTypeImpl::new); } public EntryType emptyType(ResourceLocation id) { - if (empty == null) { - int hashCode = id.hashCode(); - empty = new EntryType<>() { - @Override - public ResourceLocation getId() { - return id; - } - - @Override - public EntryDefinition getDefinition() { - return EmptyEntryDefinition.EMPTY; - } - - @Override - public int hashCode() { - return hashCode; - } - }; - } - return empty; + int hashCode = id.hashCode(); + return new EntryType<>() { + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public EntryDefinition getDefinition() { + return EmptyEntryDefinition.EMPTY; + } + + @Override + public int hashCode() { + return hashCode; + } + }; } @Environment(EnvType.CLIENT) public EntryType renderingType(ResourceLocation id) { - if (render == null) { - int hashCode = id.hashCode(); - render = new EntryType<>() { - @Override - public ResourceLocation getId() { - return id; - } - - @Override - public EntryDefinition getDefinition() { - return RenderingEntryDefinition.RENDERING; - } - - @Override - public int hashCode() { - return hashCode; - } - }; - } - return render; + int hashCode = id.hashCode(); + return new EntryType<>() { + @Override + public ResourceLocation getId() { + return id; + } + + @Override + public EntryDefinition getDefinition() { + return RenderingEntryDefinition.RENDERING; + } + + @Override + public int hashCode() { + return hashCode; + } + }; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java similarity index 93% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java rename to runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java index 249ba04ed..1ea22b720 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java +++ b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java @@ -26,7 +26,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; -import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.BuiltinEntryTypes; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; @@ -34,17 +33,17 @@ import net.fabricmc.api.Environment; import net.minecraft.util.Unit; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; @ApiStatus.Internal public class EmptyEntryDefinition { - public static final EntryDefinition EMPTY = new BuiltinEntryDefinition<>(Unit.class, BuiltinEntryTypes.EMPTY, true, () -> Unit.INSTANCE, () -> () -> new EmptyRenderer()); + public static final EntryDefinition EMPTY = new BuiltinEntryDefinition<>(Unit.class, BuiltinEntryTypes.EMPTY, true, () -> Unit.INSTANCE, () -> () -> EmptyRenderer.INSTANCE); @Environment(EnvType.CLIENT) public static class EmptyRenderer implements EntryRenderer { + private static final EmptyRenderer INSTANCE = new EmptyRenderer(); + @Override public void render(EntryStack entry, PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { - } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/RenderingEntryDefinition.java similarity index 95% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java rename to runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/RenderingEntryDefinition.java index a67cfe78e..d8d934abe 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/type/types/RenderingEntryDefinition.java +++ b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/RenderingEntryDefinition.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.entry.type.types; +package me.shedaniel.rei.impl.common.entry.type.types; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Rectangle; @@ -32,7 +32,6 @@ import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; -import me.shedaniel.rei.impl.common.entry.type.types.BuiltinEntryDefinition; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.network.chat.Component; @@ -41,7 +40,7 @@ @ApiStatus.Internal @Environment(EnvType.CLIENT) -public class RenderingEntryDefinition { +class RenderingEntryDefinition { public static final EntryDefinition RENDERING = new BuiltinEntryDefinition(Renderer.class, BuiltinClientEntryTypes.RENDERING, false, RenderingEntryDefinition::throwRendering, () -> () -> DeferredRenderer.INSTANCE) { @Override public Component asFormattedText(EntryStack entry, Renderer value) { @@ -55,7 +54,7 @@ public Component asFormattedText(EntryStack entry, Renderer value) { } return super.asFormattedText(entry, value); } - + @Override public Component asFormattedText(EntryStack entry, Renderer value, TooltipContext context) { Tooltip tooltip = value.getTooltip(context); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/fluid/FluidSupportProviderImpl.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/fluid/FluidSupportProviderImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/fluid/FluidSupportProviderImpl.java rename to runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/fluid/FluidSupportProviderImpl.java diff --git a/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.comparison.FluidComparatorRegistry b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.comparison.FluidComparatorRegistry new file mode 100644 index 000000000..094bb8aae --- /dev/null +++ b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.comparison.FluidComparatorRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.entry.comparison.FluidComparatorRegistryImpl \ No newline at end of file diff --git a/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry new file mode 100644 index 000000000..a7c730390 --- /dev/null +++ b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.entry.comparison.ItemComparatorRegistryImpl \ No newline at end of file diff --git a/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.fluid.FluidSupportProvider b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.fluid.FluidSupportProvider new file mode 100644 index 000000000..99e36c9f4 --- /dev/null +++ b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.fluid.FluidSupportProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.fluid.FluidSupportProviderImpl \ No newline at end of file diff --git a/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$DeferringEntryTypeProvider b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$DeferringEntryTypeProvider new file mode 100644 index 000000000..95aeea47d --- /dev/null +++ b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$DeferringEntryTypeProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.entry.type.types.DeferringEntryTypeProviderImpl \ No newline at end of file diff --git a/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$NbtHasherProvider b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$NbtHasherProvider new file mode 100644 index 000000000..5f9b83304 --- /dev/null +++ b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$NbtHasherProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.entry.comparison.NbtHasherProviderImpl \ No newline at end of file diff --git a/runtime-engine/favorites/.gradle/loom-cache/launch.cfg b/runtime-engine/favorites/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..56a02b4a3 --- /dev/null +++ b/runtime-engine/favorites/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/favorites/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/favorites/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/favorites/.gradle/loom-cache/log4j.xml b/runtime-engine/favorites/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/favorites/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/favorites/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/favorites/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/favorites/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/favorites/build/libs/favorites-transformProductionFabric.jar b/runtime-engine/favorites/build/libs/favorites-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime-engine/favorites/build/libs/favorites-transformProductionForge.jar b/runtime-engine/favorites/build/libs/favorites-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/DelegatingFavoriteEntryProviderImpl.java b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/DelegatingFavoriteEntryProviderImpl.java new file mode 100644 index 000000000..97ede0acf --- /dev/null +++ b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/DelegatingFavoriteEntryProviderImpl.java @@ -0,0 +1,125 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.favorites; + +import com.mojang.serialization.DataResult; +import me.shedaniel.rei.api.client.favorites.FavoriteEntry; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; +import me.shedaniel.rei.api.client.gui.Renderer; +import me.shedaniel.rei.impl.ClientInternals; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; + +import java.util.Collection; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import java.util.function.Supplier; + +public class DelegatingFavoriteEntryProviderImpl implements ClientInternals.DelegatingFavoriteEntryProvider { + @Override + public FavoriteEntry delegate(Supplier> result, Supplier tag) { + return new DelegatedFavoriteEntry(result, tag); + } + + private static class DelegatedFavoriteEntry extends FavoriteEntry { + private final Supplier> supplier; + private final Supplier toJson; + private FavoriteEntry value = null; + + public DelegatedFavoriteEntry(Supplier> supplier, Supplier toJson) { + this.supplier = supplier; + this.toJson = toJson; + } + + @Override + public FavoriteEntry getUnwrapped() { + synchronized (this) { + if (this.value == null) { + DataResult result = supplier.get(); + this.value = result.getOrThrow(false, error -> {}); + } + } + return Objects.requireNonNull(value).getUnwrapped(); + } + + @Override + public UUID getUuid() { + return getUnwrapped().getUuid(); + } + + @Override + public boolean isInvalid() { + try { + return getUnwrapped().isInvalid(); + } catch (Exception e) { + return true; + } + } + + @Override + public Renderer getRenderer(boolean showcase) { + return getUnwrapped().getRenderer(showcase); + } + + @Override + public boolean doAction(int button) { + return getUnwrapped().doAction(button); + } + + @Override + public Optional>> getMenuEntries() { + return getUnwrapped().getMenuEntries(); + } + + @Override + public long hashIgnoreAmount() { + return getUnwrapped().hashIgnoreAmount(); + } + + @Override + public FavoriteEntry copy() { + return FavoriteEntry.delegateResult(supplier, toJson); + } + + @Override + public ResourceLocation getType() { + return getUnwrapped().getType(); + } + + @Override + public CompoundTag save(CompoundTag tag) { + if (toJson == null) { + return getUnwrapped().save(tag); + } + + return tag.merge(toJson.get()); + } + + @Override + public boolean isSame(FavoriteEntry other) { + return getUnwrapped().isSame(other.getUnwrapped()); + } + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java similarity index 85% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java rename to runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java index fbd5f3330..39de487d9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java +++ b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java @@ -35,12 +35,10 @@ import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.common.registry.ReloadStage; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; +import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesEntriesManager; import me.shedaniel.rei.impl.common.InternalLogger; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import org.apache.commons.lang3.mutable.MutableLong; -import org.apache.commons.lang3.tuple.Triple; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -51,7 +49,6 @@ @ApiStatus.Internal public class FavoriteEntryTypeRegistryImpl implements FavoriteEntryType.Registry { private final BiMap> registry = HashBiMap.create(); - private final List, MutableLong, List>> systemFavorites = Lists.newArrayList(); private final Map sections = Maps.newConcurrentMap(); private final List sectionsList = Lists.newCopyOnWriteArrayList(); @@ -98,18 +95,11 @@ public Iterable sections() { @Override public void registerSystemFavorites(SystemFavoriteEntryProvider provider) { - this.systemFavorites.add(Triple.of(provider, new MutableLong(-1), new ArrayList<>())); - InternalLogger.getInstance().debug("Added system favorites: %s", provider); - } - - public List, MutableLong, List>> getSystemProviders() { - return this.systemFavorites; } @Override public void startReload() { this.registry.clear(); - this.systemFavorites.clear(); this.sections.clear(); this.sectionsList.clear(); } @@ -117,8 +107,8 @@ public void startReload() { @Override public void endReload() { if (ConfigObject.getInstance().isFavoritesEnabled()) { - ConfigManagerImpl.getInstance().getConfig().getConfigFavoriteEntries().removeIf(FavoriteEntry::isInvalid); - ConfigManagerImpl.getInstance().getConfig().getHiddenFavoriteEntries().removeIf(FavoriteEntry::isInvalid); + FavoritesEntriesManager.INSTANCE.getConfigFavoriteEntries().removeIf(FavoriteEntry::isInvalid); + FavoritesEntriesManager.INSTANCE.getConfigHiddenFavoriteEntries().removeIf(FavoriteEntry::isInvalid); ConfigManager.getInstance().saveConfig(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java similarity index 53% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java rename to runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java index 38416b7cf..2f92bc197 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java +++ b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java @@ -23,13 +23,15 @@ package me.shedaniel.rei.impl.client.gui.widget.favorites; +import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; +import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; -import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; +import me.shedaniel.rei.impl.client.favorites.MutableFavoritesList; import java.util.AbstractList; import java.util.ArrayList; @@ -41,17 +43,26 @@ public class FavoritesEntriesManager { public static final FavoritesEntriesManager INSTANCE = new FavoritesEntriesManager(); + public List getConfigFavoriteEntries() { + ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); + return (List) manager.get("basics.favorites"); + } + + public List getConfigHiddenFavoriteEntries() { + ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); + return (List) manager.get("basics.hiddenFavorites"); + } + private Stream getDefaultFavorites() { return StreamSupport.stream(FavoriteEntryType.registry().sections().spliterator(), false) .flatMap(section -> section.getDefaultEntries().stream()); } public List getFavorites() { - ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); List defaultFavorites = getDefaultFavorites().collect(Collectors.toList()); - defaultFavorites.removeAll(config.getHiddenFavoriteEntries()); + defaultFavorites.removeAll(getConfigHiddenFavoriteEntries()); - List favorites = new ArrayList<>(config.getConfigFavoriteEntries()); + List favorites = new ArrayList<>(getConfigFavoriteEntries()); defaultFavorites.removeAll(favorites); favorites.addAll(0, defaultFavorites); favorites.removeIf(FavoriteEntry::isInvalid); @@ -59,91 +70,85 @@ public List getFavorites() { } public void remove(FavoriteEntry entry) { - ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); - - config.getConfigFavoriteEntries().remove(entry); - if (getDefaultFavorites().anyMatch(e -> e.equals(entry)) && !config.getHiddenFavoriteEntries().contains(entry)) { - config.getHiddenFavoriteEntries().add(entry); + getConfigFavoriteEntries().remove(entry); + if (getDefaultFavorites().anyMatch(e -> e.equals(entry)) && !getConfigHiddenFavoriteEntries().contains(entry)) { + getConfigHiddenFavoriteEntries().add(entry); } ConfigManager.getInstance().saveConfig(); - FavoritesListWidget widget = ScreenOverlayImpl.getFavoritesListWidget(); - if (widget != null) { - widget.updateSearch(); - } + REIRuntime.getInstance().getOverlay().flatMap(ScreenOverlay::getFavoritesList).ifPresent(OverlayListWidget::queueReloadSearch); } public void add(FavoriteEntry entry) { - ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); List defaultFavorites = getDefaultFavorites().toList(); - config.getConfigFavoriteEntries().remove(entry); - if (CollectionUtils.anyMatch(defaultFavorites, e -> e.equals(entry)) && !config.getHiddenFavoriteEntries().contains(entry)) { - config.getHiddenFavoriteEntries().add(entry); + getConfigFavoriteEntries().remove(entry); + if (CollectionUtils.anyMatch(defaultFavorites, e -> e.equals(entry)) && !getConfigHiddenFavoriteEntries().contains(entry)) { + getConfigHiddenFavoriteEntries().add(entry); } for (int i = defaultFavorites.size() - 1; i >= 0; i--) { FavoriteEntry e = defaultFavorites.get(i); - if (!config.getConfigFavoriteEntries().contains(e) && !config.getHiddenFavoriteEntries().contains(e)) { - config.getConfigFavoriteEntries().add(0, e); + if (!getConfigFavoriteEntries().contains(e) && !getConfigHiddenFavoriteEntries().contains(e)) { + getConfigFavoriteEntries().add(0, e); } } - config.getHiddenFavoriteEntries().remove(entry); + getConfigHiddenFavoriteEntries().remove(entry); if (!CollectionUtils.anyMatch(defaultFavorites, e -> e.equals(entry))) { - config.getConfigFavoriteEntries().add(entry); + getConfigFavoriteEntries().add(entry); } ConfigManager.getInstance().saveConfig(); - FavoritesListWidget widget = ScreenOverlayImpl.getFavoritesListWidget(); - if (widget != null) { - widget.updateSearch(); - } + REIRuntime.getInstance().getOverlay().flatMap(ScreenOverlay::getFavoritesList).ifPresent(OverlayListWidget::queueReloadSearch); } public void setEntries(List entries) { - List defaultFavorites = getDefaultFavorites().collect(Collectors.toList()); + List defaultFavorites = getDefaultFavorites().toList(); List hiddenDefaultFavorites = new ArrayList<>(defaultFavorites); hiddenDefaultFavorites.removeAll(entries); - ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); - config.getHiddenFavoriteEntries().clear(); - config.getHiddenFavoriteEntries().addAll(hiddenDefaultFavorites); - config.getConfigFavoriteEntries().clear(); - config.getConfigFavoriteEntries().addAll(entries); + getConfigHiddenFavoriteEntries().clear(); + getConfigHiddenFavoriteEntries().addAll(hiddenDefaultFavorites); + getConfigFavoriteEntries().clear(); + getConfigFavoriteEntries().addAll(entries); ConfigManager.getInstance().saveConfig(); - FavoritesListWidget widget = ScreenOverlayImpl.getFavoritesListWidget(); - if (widget != null) { - widget.updateSearch(); - } + REIRuntime.getInstance().getOverlay().flatMap(ScreenOverlay::getFavoritesList).ifPresent(OverlayListWidget::queueReloadSearch); } public List asListView() { - return new AbstractList<>() { - @Override - public FavoriteEntry get(int index) { - return getFavorites().get(index); - } - - @Override - public int size() { - return getFavorites().size(); - } - - @Override - public void add(int index, FavoriteEntry entry) { - FavoritesEntriesManager.this.add(entry); - } - - @Override - public boolean remove(Object o) { - if (o instanceof FavoriteEntry) { - FavoritesEntriesManager.this.remove((FavoriteEntry) o); - return true; - } else { - return false; - } + return new ListView(); + } + + private class ListView extends AbstractList implements MutableFavoritesList { + @Override + public FavoriteEntry get(int index) { + return getFavorites().get(index); + } + + @Override + public int size() { + return getFavorites().size(); + } + + @Override + public void add(int index, FavoriteEntry entry) { + FavoritesEntriesManager.this.add(entry); + } + + @Override + public boolean remove(Object o) { + if (o instanceof FavoriteEntry) { + FavoritesEntriesManager.this.remove((FavoriteEntry) o); + return true; + } else { + return false; } - }; + } + + @Override + public void setAll(List entries) { + FavoritesEntriesManager.this.setEntries(entries); + } } } diff --git a/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.favorites.FavoriteEntryType$Registry b/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.favorites.FavoriteEntryType$Registry new file mode 100644 index 000000000..29074a209 --- /dev/null +++ b/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.favorites.FavoriteEntryType$Registry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.favorites.FavoriteEntryTypeRegistryImpl \ No newline at end of file diff --git a/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$DelegatingFavoriteEntryProvider b/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$DelegatingFavoriteEntryProvider new file mode 100644 index 000000000..8e9e48206 --- /dev/null +++ b/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$DelegatingFavoriteEntryProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.favorites.DelegatingFavoriteEntryProviderImpl \ No newline at end of file diff --git a/runtime-engine/filtering-entries/.gradle/loom-cache/launch.cfg b/runtime-engine/filtering-entries/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..ac0975495 --- /dev/null +++ b/runtime-engine/filtering-entries/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/filtering-entries/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/filtering-entries/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/filtering-entries/.gradle/loom-cache/log4j.xml b/runtime-engine/filtering-entries/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/filtering-entries/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/filtering-entries/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/filtering-entries/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/filtering-entries/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/filtering-entries/build.gradle b/runtime-engine/filtering-entries/build.gradle new file mode 100644 index 000000000..e25abac53 --- /dev/null +++ b/runtime-engine/filtering-entries/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compileClasspath(project(path: ":runtime-engine:entries", configuration: "namedElements")) +} diff --git a/runtime-engine/filtering-entries/build/libs/filtering-entries-transformProductionFabric.jar b/runtime-engine/filtering-entries/build/libs/filtering-entries-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..b713a813d1e265a4166d6e9c79be71f137b7302e GIT binary patch literal 166 zcmWIWW@Zs#;Nak3&}sV}!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0H!h<+#0H!h< stack) { } public void updateEntriesPosition() { - int entrySize = entrySize(); + int entrySize = EntryListWidget.entrySize(); this.innerBounds = updateInnerBounds(getBounds()); int width = innerBounds.width / entrySize; int pageHeight = innerBounds.height / entrySize; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/NoFilteringEntry.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/NoFilteringEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/NoFilteringEntry.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/NoFilteringEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/AbstractFilteringRule.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/AbstractFilteringRule.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/AbstractFilteringRule.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/AbstractFilteringRule.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCacheImpl.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCacheImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCacheImpl.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCacheImpl.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextImpl.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextImpl.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextImpl.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextType.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextType.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextType.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextType.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResult.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResult.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResult.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResult.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResultImpl.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResultImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResultImpl.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResultImpl.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java similarity index 94% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java index 175ac532a..06ff75f53 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java @@ -27,6 +27,8 @@ import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.widgets.Slot; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.client.search.SearchProvider; @@ -39,7 +41,6 @@ import me.shedaniel.rei.impl.client.entry.filtering.FilteringContext; import me.shedaniel.rei.impl.client.entry.filtering.FilteringResult; import me.shedaniel.rei.impl.client.gui.widget.BatchedEntryRendererManager; -import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; @@ -157,7 +158,7 @@ public Optional> createEntryScreen() return Optional.of((entry, screen) -> new FilteringRuleOptionsScreen(entry, this, screen) { TextFieldRuleEntry entry = null; BooleanRuleEntry show = null; - List entryStacks = new ArrayList<>(); + List entryStacks = new ArrayList<>(); @Override public void addEntries(Consumer entryConsumer) { @@ -170,7 +171,7 @@ public void addEntries(Consumer entryConsumer) { entryStacks = EntryRegistry.getInstance().getEntryStacks().parallel() .filter(filter) .map(EntryStack::normalize) - .map(stack -> new EntryWidget(new Rectangle(0, 0, 18,18)).noBackground().entry(stack)) + .map(stack -> Widgets.createSlot(new Rectangle(0, 0, 18,18)).disableBackground().entry(stack)) .collect(Collectors.toList()); }); if (entry != null) widget.setValue(entry.getWidget().getValue()); @@ -196,10 +197,10 @@ public void save() { } public static class EntryStacksRuleEntry extends FilteringRuleOptionsScreen.RuleEntry { - private final Supplier> entryStacks; + private final Supplier> entryStacks; private int totalHeight; - public EntryStacksRuleEntry(SearchFilteringRule rule, Supplier> entryStacks, FilteringRuleOptionsScreen.TextFieldRuleEntry entry, FilteringRuleOptionsScreen.BooleanRuleEntry show) { + public EntryStacksRuleEntry(SearchFilteringRule rule, Supplier> entryStacks, FilteringRuleOptionsScreen.TextFieldRuleEntry entry, FilteringRuleOptionsScreen.BooleanRuleEntry show) { super(rule); this.entryStacks = entryStacks; } @@ -207,10 +208,10 @@ public EntryStacksRuleEntry(SearchFilteringRule rule, Supplier @Override public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta) { BatchedEntryRendererManager manager = new BatchedEntryRendererManager(); - int entrySize = entrySize(); + int entrySize = EntryListWidget.entrySize(); int width = entryWidth / entrySize; int i = 0; - for (EntryWidget stack : entryStacks.get()) { + for (Slot stack : entryStacks.get()) { stack.getBounds().setLocation(x + (i % width) * entrySize, y + (i / width) * entrySize); if (stack.getBounds().getMaxY() >= 0 && stack.getBounds().getY() <= Minecraft.getInstance().getWindow().getGuiScaledHeight()) { manager.add(stack); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/PreFilteredEntryList.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java similarity index 92% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/PreFilteredEntryList.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java index ece25fb3d..109b39dfa 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/PreFilteredEntryList.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry.type; +package me.shedaniel.rei.impl.client.entry.type; import com.google.common.base.Stopwatch; import com.google.common.collect.Lists; @@ -31,8 +31,10 @@ import me.shedaniel.rei.api.client.config.entry.EntryStackProvider; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; +import me.shedaniel.rei.api.client.registry.entry.PreFilteredEntryList; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.ClientInternals; import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; import me.shedaniel.rei.impl.client.entry.filtering.FilteringCacheImpl; import me.shedaniel.rei.impl.client.entry.filtering.FilteringContextImpl; @@ -41,19 +43,21 @@ import me.shedaniel.rei.impl.common.InternalLogger; import me.shedaniel.rei.impl.common.util.HashedEntryStackWrapper; import org.apache.commons.lang3.mutable.MutableLong; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.Predicate; import java.util.stream.Collectors; -public class PreFilteredEntryList implements EntryRegistryListener { - private final EntryRegistry registry; +@ApiStatus.Internal +public class PreFilteredEntryListImpl implements EntryRegistryListener, PreFilteredEntryList { + private final EntryRegistry registry = EntryRegistry.getInstance(); private final MutableLong lastRefilterWarning = new MutableLong(-1); private List> preFilteredList = Lists.newCopyOnWriteArrayList(); - public PreFilteredEntryList(EntryRegistry registry) { - this.registry = registry; + public PreFilteredEntryListImpl() { + ClientInternals.attachInstanceSupplier(this, "preFilteredEntryList"); } private static Predicate not(Predicate target) { @@ -159,6 +163,7 @@ public void onReFilter(List> stacks) { InternalLogger.getInstance().debug("Refiltered %d entries with %d rules in %s.", stacks.size() - preFilteredList.size(), rules.size(), stopwatch.stop().toString()); } + @Override public Collection> refilterNew(boolean warn, Collection> entries) { if (lastRefilterWarning != null && warn) { if (lastRefilterWarning.getValue() > 0 && System.currentTimeMillis() - lastRefilterWarning.getValue() > 5000) { @@ -192,7 +197,12 @@ private void queueSearchUpdate() { REIRuntime.getInstance().getOverlay().ifPresent(ScreenOverlay::queueReloadSearch); } + @Override public List> getList() { - return preFilteredList; + return Collections.unmodifiableList(preFilteredList); + } + + @Override + public void startReload() { } } diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java similarity index 78% rename from runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java rename to runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java index 3bdca8c15..a85e6b6a8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java @@ -29,35 +29,38 @@ import it.unimi.dsi.fastutil.objects.Reference2BooleanMaps; import it.unimi.dsi.fastutil.objects.Reference2BooleanOpenHashMap; import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; import me.shedaniel.rei.api.client.registry.display.visibility.DisplayVisibilityPredicate; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; import me.shedaniel.rei.impl.client.entry.filtering.*; +import me.shedaniel.rei.impl.client.entry.type.EntryRegistryListener; import me.shedaniel.rei.impl.common.InternalLogger; import java.util.List; import java.util.function.Predicate; -public class FilteredStacksVisibilityHandler implements DisplayVisibilityPredicate { - private boolean checkHiddenStacks; - private Reference2BooleanMap visible = Reference2BooleanMaps.synchronize(new Reference2BooleanOpenHashMap<>()); - private List> filteringRules; - private FilteringCacheImpl cache; - private final Predicate displayPredicate = this::checkHiddenStacks; +public class FilteredStacksVisibilityHandler implements REIClientPlugin, EntryRegistryListener, DisplayVisibilityPredicate { + private static boolean checkHiddenStacks; + private static Reference2BooleanMap visible = Reference2BooleanMaps.synchronize(new Reference2BooleanOpenHashMap<>()); + private static List> filteringRules; + private static FilteringCacheImpl cache; + private static final Predicate displayPredicate = FilteredStacksVisibilityHandler::checkHiddenStacks; @Override public EventResult handleDisplay(DisplayCategory category, Display display) { if (checkHiddenStacks) { - return visible.computeBooleanIfAbsent(display, displayPredicate) ? EventResult.pass() : EventResult.interruptFalse(); + return visible.computeIfAbsent(display, displayPredicate) ? EventResult.pass() : EventResult.interruptFalse(); } return EventResult.pass(); } - public void reset() { + public static void reset() { checkHiddenStacks = ConfigObject.getInstance().shouldFilterDisplays(); visible = Reference2BooleanMaps.synchronize(new Reference2BooleanOpenHashMap<>()); @@ -76,7 +79,7 @@ public void reset() { } } - public void cacheExisting() { + public static void cacheExisting() { Stopwatch stopwatch = Stopwatch.createStarted(); DisplayRegistry.getInstance().getAll().values().parallelStream().map(displays -> { Reference2BooleanMap current = new Reference2BooleanOpenHashMap<>(); @@ -90,7 +93,7 @@ public void cacheExisting() { InternalLogger.getInstance().debug("Computed existing filtered displays with %d rules in %s", filteringRules.size(), stopwatch.stop()); } - private boolean checkHiddenStacks(Display display) { + private static boolean checkHiddenStacks(Display display) { for (EntryIngredient ingredient : display.getInputEntries()) { if (!ingredient.isEmpty() && isEntryIngredientAllHidden(ingredient, cache, filteringRules)) { return false; @@ -113,4 +116,20 @@ private static boolean isEntryIngredientAllHidden(EntryIngredient ingredient, Fi } return context.stacks.get(FilteringContextType.SHOWN).isEmpty() && context.stacks.get(FilteringContextType.DEFAULT).isEmpty(); } + + @Override + public void onReFilter(List> stacks) { + reset(); + } + + @Override + public void registerDisplays(DisplayRegistry registry) { + reset(); + registry.registerVisibilityPredicate(this); + } + + @Override + public double getPriority() { + return 0; + } } diff --git a/runtime-engine/filtering-entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.plugins.REIClientPlugin b/runtime-engine/filtering-entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.plugins.REIClientPlugin new file mode 100644 index 000000000..bb2ecffc1 --- /dev/null +++ b/runtime-engine/filtering-entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.plugins.REIClientPlugin @@ -0,0 +1 @@ +me.shedaniel.rei.plugin.client.runtime.FilteredStacksVisibilityHandler \ No newline at end of file diff --git a/runtime-engine/filtering-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.entry.type.EntryRegistryListener b/runtime-engine/filtering-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.entry.type.EntryRegistryListener new file mode 100644 index 000000000..4be342477 --- /dev/null +++ b/runtime-engine/filtering-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.entry.type.EntryRegistryListener @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.entry.type.PreFilteredEntryListImpl \ No newline at end of file diff --git a/runtime-engine/screens/.gradle/loom-cache/launch.cfg b/runtime-engine/screens/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..b68220278 --- /dev/null +++ b/runtime-engine/screens/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/screens/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/screens/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/screens/.gradle/loom-cache/log4j.xml b/runtime-engine/screens/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/screens/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/screens/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/screens/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/screens/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ExclusionZonesImpl.class b/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ExclusionZonesImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..1a1d88b5d939a9cdedc6d5dbfc857cff5b6cdada GIT binary patch literal 9115 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 Zyj^UqtQOnE8^raSs>KcBP2y(6{ttdtDVhKP literal 0 HcmV?d00001 diff --git a/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$1.class b/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$1.class new file mode 100644 index 0000000000000000000000000000000000000000..ce3a2e14da673b0cf1773987f2bb2b61a9c34c0a GIT binary patch literal 2749 zcmb_eZBrXn6n-wGSrV3#AW{@xP-&YGWsCK-iPR9FM8k^-P{A2zmh2_Db+ennb?2fQwctRNgA7Z?UJ*&Pj68K!zjTc&Ip zRZ^u*Hcudhw1zPqFJPQu(c#i)35VA`^FSVZ+31MSLEjM0Avx}n%f)^2+^oxz>qwKf zc!Bc_n#~X7rt34XvcjLxaZQ28rQ0U461}A3WhF|Amf7Ib>;3fA!o{TWp|Qz6K`pl(QzF&7)Jk#LdiCLB2Edv==-AKnEN(g@!S@}c&5^) zme1}bkU>_%td1PsX1Lz#{?Kl=WQqS}ego$^dBgtob^R71q@)|xo zE6>fgI8K26G+z>a+cu8^BR4(wP*~h!SjzPBT)bNH*&T{c$+b8Iqe4lw-f8V~Z%Z8` z!&t?woA!?B3H2TdW2(3qO3zC@GoPmv4eFR&xs0$gO!QiO)IPTQ-X-7{W*5lhL`|i+ z?06KQgUiSk1^fRALuVuWRnxJA(>N~r^r`An-uG2pVXK-~Hm?+_cg_z$0G(erRk#66 zc8?hRrrWWtux9wiA@^)kSPa!?h(w5=?X%=5RZnL3Yo1YyAtrTSa+P7ECe8XcYi2u4 z*4>LaP8j{1Pq%KEn#ZOmTu;cOZuehen2*LTm=Ncl?e~#W3%8uEt&28?LSK;22;I4p zMJ1-no@CAKcy+!aR8P1TL_9ij=Tz2FjxIZO+x00&*SKuDmImrAcY9{x#T%54FV)-~ z4LTzCmiU3$9SKA0+?T7aPt!p!J2VZulZgA6rv5$zh7Z6}DfOR%dcL}c@exTsrqu#z z45&#koBIuH_A#_y=xqRZ=r>L}U{{f+^+ceB0{u-q=Tiirq?c0!>M;BpUzlB}Fi+@sYh${~eCZ;B$F`wOY>ka&ojKOp`P z?#`)=%_| z9?Nu>EC^66AWIeLFgC-zw@F)BotVu%LFy6SRn|rUf^!W35}~zMLNmTVwX0pj7CmFw T#(nH|CEM7eXOc)1I9>k&5(MpQ literal 0 HcmV?d00001 diff --git a/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$2.class b/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$2.class new file mode 100644 index 0000000000000000000000000000000000000000..adfa8d7ef3aeb409503e737639f0a722f6c1bc30 GIT binary patch literal 2322 zcmbtVYje{^6g``mD0bAuq-mg~Ep0Ji$88kCqXn6Ou@eYm9%Dmh$~VPY>}6yrvn!{Q zAJKo(nLcKKX+L!M+#l8HT}e(98>h)2kF}4vd+s^+-o5(g-@pC_a2xltn82igjEPg2 zVyO1GrMld8e8D|Sa$$+yj%T$!!Tpfd9ic+GXQ{U2+_zfM&`fqW$+ED@Fco%%Dy$G# z;{(y`9Hx;qkTWp@lOg}g*>x<>@jKR&?N_`VlCz5NMYzT=SuAbMU>0)*@+MAWp5fYv zduK-sv~>DnAfqnSj_2&fY8bK|9^MQ3zN;9{7fXjl^qjD3HOV!R@Hi1%z$XS4O`O45 zhPeZRHP2B5kQb_|l<4@*w#PSQ&|_FAHipdX(u*uU!#M+=oA?4>GF$>#Y{U<;Jm&*i-KclzDn`l=*K=TtI<%ljK8d znW5YDREj`~a4%|9b%rbHSjElkf9?*$o!Ln)8SVs9ze8lh@P18V^Qb5K&kb&>8 z906H4OZJ-7BN`*1`PuRteEbV-O{N%?#{#Vo&=s;aX(S#5y-KsIG@rmVnq9|@#Kl8e zX&0G4@Tn%6#$QR{XZDF^2<>}1b%3vTe%QyqNwZtfG0+m030-r@Ea3dFG^PV_J;IMU zCiwX(#j%o{y-L=aTXw1Z4zq9Y^>8HPl*9npgy5+}=50!;c6SGNY0RLC8rGwoDmG}$ JkrNG0&wqA_Y}Eh& literal 0 HcmV?d00001 diff --git a/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$3.class b/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$3.class new file mode 100644 index 0000000000000000000000000000000000000000..e7b0fdac7f69e11fd262d04f23ff146f8d2b74a6 GIT binary patch literal 2325 zcmcguTXWk)6#mw6t;Uf_8rqa{X-jH~?X(s+TncuRrnb|DI%%jgdEiZvH}QNHf34kWoDm zwf(MjcjrEL6gjI2U#KO9i9&JPz#9xVeXcA| z_}mHYUG)@tHx@(GktO^-v5~}MWryh4j;c#v*|a4bFq%XTGbT=9mSL(V`#j{Gwkye9 zzBOw7TN%2Y0|vDgp+1c>2Ifqh#aj&XFWtnQdZr86O%bm?)yeQ0nl$Wrt2rD2jMYx?G3Ps!K1B zvEOOx**zY`F2yG&e8s~s4%Ai{bA}s**5RC~7F(}wF#&VM#8s3T(t#Zj^D+hK7#1>* z^Hgf|7^o1S@uxh#zE-6ZN0fRx;G3cBiw+MN8ik|hdAusE7PpB_U3Tb%rdyQv8?m>; z!!3KqCCO|{I<~uQheFSX!n7`GhWhKe&M#Ie4}$?2hTw1l4Li-javjuUb=0$GtDdzf zDcr}4ClPi=i=7ViP!f;9@Y0q+tTKbH$Z)uR$JiTkVmRSR3NgdE=h9=C8x6=_@H8m5 z{sZ8((h_0MB{{Zk2g7hrwnf*ssoDtIkNw&oKau+m zrG>}HZCw2Y(|_T-9vzLAP7NpfxUi289`0k|A?->hK4-NBRwbS_Tx8d&M=mG+ zOC&cjk1A>jgUY{1D)gUYNh3uC%eX;UR_NO#$w2=m>DNgz0aiwXK2m7X;wo;@Tf;7s vL~l=@hV@gj{)~JhajuPNfCKVr+)lLC@KqwcgLT|ZBzLe$W0th_k<#-72z;zK literal 0 HcmV?d00001 diff --git a/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl.class b/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..071c40c21ba725d4bac357c49710790dff168740 GIT binary patch literal 20609 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 literal 0 HcmV?d00001 diff --git a/runtime-engine/screens/build/libs/screens-transformProductionFabric.jar b/runtime-engine/screens/build/libs/screens-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime-engine/screens/build/libs/screens-transformProductionForge.jar b/runtime-engine/screens/build/libs/screens-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime-engine/screens/build/tmp/compileJava/previous-compilation-data.bin b/runtime-engine/screens/build/tmp/compileJava/previous-compilation-data.bin new file mode 100644 index 0000000000000000000000000000000000000000..e87e019889ba42ccd469c209a39b358c6a81865e GIT binary patch literal 112600 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

0^uG;DN9ibSeEdC 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 xlaf() { + registerDecider(new DisplayBoundsProvider() { @Override - public Rectangle getScreenBounds(AbstractDisplayViewingScreen screen) { + public Rectangle getScreenBounds(DisplayScreen screen) { return screen.getBounds(); } @Override public boolean isHandingScreen(Class screen) { - return AbstractDisplayViewingScreen.class.isAssignableFrom(screen); + return DisplayScreen.class.isAssignableFrom(screen); } @Override diff --git a/runtime-engine/screens/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.screen.ScreenRegistry b/runtime-engine/screens/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.screen.ScreenRegistry new file mode 100644 index 000000000..68f879709 --- /dev/null +++ b/runtime-engine/screens/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.screen.ScreenRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.registry.screen.ScreenRegistryImpl \ No newline at end of file diff --git a/runtime-engine/search/.gradle/loom-cache/launch.cfg b/runtime-engine/search/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..30b5dde0a --- /dev/null +++ b/runtime-engine/search/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/search/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/search/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/search/.gradle/loom-cache/log4j.xml b/runtime-engine/search/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/search/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/search/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/search/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/search/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/search/build/libs/search-transformProductionFabric.jar b/runtime-engine/search/build/libs/search-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..298b693b1509d2ac42504110c3e00b299dde6739 GIT binary patch literal 166 zcmWIWW@Zs#;Nak3u+#0JxYO4FCWD literal 0 HcmV?d00001 diff --git a/runtime-engine/search/build/libs/search-transformProductionForge.jar b/runtime-engine/search/build/libs/search-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..298b693b1509d2ac42504110c3e00b299dde6739 GIT binary patch literal 166 zcmWIWW@Zs#;Nak3u+#0JxYO4FCWD literal 0 HcmV?d00001 diff --git a/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/IntRange.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/IntRange.java new file mode 100644 index 000000000..94c259b8c --- /dev/null +++ b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/IntRange.java @@ -0,0 +1,27 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.search; + +public record IntRange(int min, int max) { +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/SearchProviderImpl.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/SearchProviderImpl.java similarity index 93% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/SearchProviderImpl.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/SearchProviderImpl.java index c56d30b26..894153ddc 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/SearchProviderImpl.java +++ b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/SearchProviderImpl.java @@ -53,6 +53,16 @@ public SearchFilter createFilter(String filter, InputMethod inputMethod) { return new SearchFilterImpl(filter, inputMethod); } + @Override + public void clearCache() { + Argument.SEARCH_CACHE.clear(); + } + + @Override + public boolean hasCache() { + return !Argument.SEARCH_CACHE.isEmpty(); + } + public static class SearchFilterImpl implements SearchFilter { private final String filter; private final InputMethod inputMethod; @@ -93,6 +103,11 @@ public void prepareFilter(Collection> stacks) { Argument.prepareFilter(stacks, argumentTypes.get()); } + @Override + public void processDecoration(ParseDecorationSink sink) { + Argument.bakeArguments(filter, sink); + } + @Override public String getFilter() { return filter; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/AlternativeArgument.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java index 8cb22352d..8724af7d1 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java +++ b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/Argument.java @@ -38,12 +38,12 @@ import it.unimi.dsi.fastutil.shorts.Short2ObjectOpenHashMap; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SearchMode; +import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.client.search.method.CharacterUnpackingInputMethod; import me.shedaniel.rei.api.client.search.method.InputMethod; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.client.search.IntRange; import me.shedaniel.rei.impl.client.search.argument.type.ArgumentType; import me.shedaniel.rei.impl.client.search.argument.type.ArgumentTypesRegistry; import me.shedaniel.rei.impl.client.search.result.ArgumentApplicableResult; @@ -99,19 +99,11 @@ public int end() { return end; } - public interface ProcessedSink { - void addQuote(int index); - - void addSplitter(int index); - - void addPart(Argument argument, boolean usingGrammar, Collection grammarRanges, int index); - } - public static List bakeArguments(String filter) { return bakeArguments(filter, null); } - public static List bakeArguments(String filter, @Nullable ProcessedSink sink) { + public static List bakeArguments(String filter, @Nullable SearchFilter.ParseDecorationSink sink) { List compoundArguments = Lists.newArrayList(); int tokenStartIndex = 0; @@ -157,7 +149,7 @@ private static void prepareSearchFilter(List compoundArguments } } - private static void applyArgument(ArgumentType type, String filter, Matcher terms, int tokenStartIndex, AlternativeArgument.Builder alternativeBuilder, boolean forceGrammar, @Nullable ProcessedSink sink) { + private static void applyArgument(ArgumentType type, String filter, Matcher terms, int tokenStartIndex, AlternativeArgument.Builder alternativeBuilder, boolean forceGrammar, @Nullable SearchFilter.ParseDecorationSink sink) { String term = MoreObjects.firstNonNull(terms.group(1), terms.group(2)); if (type.getSearchMode() == SearchMode.NEVER) return; ArgumentApplicableResult result = type.checkApplicable(term, forceGrammar); @@ -174,7 +166,8 @@ private static void applyArgument(ArgumentType type, String filter, Matche sink.addQuote(terms.end() - 1 + tokenStartIndex); } } - sink.addPart(argument, result.isUsingGrammar(), result.grammarRanges(), terms.start() + tokenStartIndex); + sink.addPart(IntIntPair.of(argument.start(), argument.end()), argument.argumentType.getHighlightedStyle(), result.isUsingGrammar(), + CollectionUtils.map(result.grammarRanges(), range -> IntIntPair.of(range.min(), range.max())), terms.start() + tokenStartIndex); } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/CompoundArgument.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/CompoundArgument.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/CompoundArgument.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/CompoundArgument.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/IndexSet.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/IndexSet.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/IndexSet.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/IndexSet.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/InputMethodMatcher.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/InputMethodMatcher.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/InputMethodMatcher.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/InputMethodMatcher.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/AlwaysMatchingArgumentType.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentType.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentTypesRegistry.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentTypesRegistry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentTypesRegistry.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ArgumentTypesRegistry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/IdentifierArgumentType.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/MatchType.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/MatchType.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/MatchType.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/MatchType.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ModArgumentType.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ModArgumentType.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ModArgumentType.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/ModArgumentType.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/RegexArgumentType.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TagArgumentType.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TagArgumentType.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TagArgumentType.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TagArgumentType.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TextArgumentType.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/argument/type/TooltipArgumentType.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/DefaultInputMethod.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/method/DefaultInputMethod.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/DefaultInputMethod.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/method/DefaultInputMethod.java index 944c0b8d6..52c85853c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/DefaultInputMethod.java +++ b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/method/DefaultInputMethod.java @@ -34,7 +34,7 @@ import java.util.concurrent.Executor; @ApiStatus.Internal -public enum DefaultInputMethod implements InputMethod { +enum DefaultInputMethod implements InputMethod { INSTANCE; public static final ResourceLocation ID = new ResourceLocation("rei", "default"); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/InputMethodRegistryImpl.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/method/InputMethodRegistryImpl.java similarity index 92% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/InputMethodRegistryImpl.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/method/InputMethodRegistryImpl.java index 8cac7824a..532792d8e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/InputMethodRegistryImpl.java +++ b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/method/InputMethodRegistryImpl.java @@ -28,7 +28,7 @@ import me.shedaniel.rei.api.client.search.method.InputMethod; import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.common.InternalLogger; import net.minecraft.client.Minecraft; import net.minecraft.resources.ResourceLocation; @@ -70,6 +70,7 @@ public Map> getAll() { @Override public void startReload() { this.inputMethods.clear(); + add(DefaultInputMethod.ID, DefaultInputMethod.INSTANCE); } @Override @@ -78,14 +79,14 @@ public void endReload() { String languageCode = Minecraft.getInstance().options.languageCode; if (!CollectionUtils.anyMatch(active.getMatchingLocales(), locale -> locale.code().equals(languageCode))) { InternalLogger.getInstance().error("Reset active input method because the language code {} is not supported by the active input method.", languageCode); - ConfigManagerImpl.getInstance().getConfig().setInputMethodId(new ResourceLocation("rei:default")); + ConfigManagerInternal.getInstance().set("functionality.inputMethod", new ResourceLocation("rei:default")); return; } ExecutorService service = Executors.newSingleThreadExecutor(); active.prepare(service).whenComplete((unused, throwable) -> { if (throwable != null) { InternalLogger.getInstance().error("Failed to prepare input method", throwable); - ConfigManagerImpl.getInstance().getConfig().setInputMethodId(new ResourceLocation("rei:default")); + ConfigManagerInternal.getInstance().set("functionality.inputMethod", new ResourceLocation("rei:default")); ExecutorService service2 = Executors.newSingleThreadExecutor(); active.dispose(service2).whenComplete((unused2, throwable2) -> { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/result/ArgumentApplicableResult.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/result/ArgumentApplicableResult.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/result/ArgumentApplicableResult.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/result/ArgumentApplicableResult.java index a443f0010..37127e4df 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/result/ArgumentApplicableResult.java +++ b/runtime-engine/search/src/main/java/me/shedaniel/rei/impl/client/search/result/ArgumentApplicableResult.java @@ -78,7 +78,7 @@ public List grammarRanges() { public ArgumentApplicableResult grammar(int start, int end) { if (end - 1 >= start) { - this.grammarRanges.add(IntRange.of(start, end - 1)); + this.grammarRanges.add(new IntRange(start, end - 1)); } return this; } diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchFilterPrepareWatcher.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchFilterPrepareWatcher.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchFilterPrepareWatcher.java rename to runtime-engine/search/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchFilterPrepareWatcher.java diff --git a/runtime-engine/search/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.search.SearchProvider b/runtime-engine/search/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.search.SearchProvider new file mode 100644 index 000000000..cf4392ae4 --- /dev/null +++ b/runtime-engine/search/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.search.SearchProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.search.SearchProviderImpl \ No newline at end of file diff --git a/runtime-engine/search/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider b/runtime-engine/search/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider new file mode 100644 index 000000000..c8655abae --- /dev/null +++ b/runtime-engine/search/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider @@ -0,0 +1 @@ +me.shedaniel.rei.plugin.client.runtime.SearchFilterPrepareWatcher \ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/FileLogger.java b/runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/FileLogger.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/logging/FileLogger.java rename to runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/FileLogger.java index b1eb4fe62..3e7d88eec 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/FileLogger.java +++ b/runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/FileLogger.java @@ -26,6 +26,7 @@ import me.shedaniel.rei.impl.common.InternalLogger; import org.apache.commons.io.output.NullOutputStream; import org.apache.logging.log4j.Level; +import org.jetbrains.annotations.ApiStatus; import java.io.*; import java.nio.charset.StandardCharsets; @@ -34,6 +35,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +@ApiStatus.Internal public class FileLogger implements InternalLogger { private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss"); private final Writer writer; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/FilteringLogger.java b/runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/FilteringLogger.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/logging/FilteringLogger.java rename to runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/FilteringLogger.java index 59effd6ea..2e40beee8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/FilteringLogger.java +++ b/runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/FilteringLogger.java @@ -25,7 +25,9 @@ import me.shedaniel.rei.impl.common.InternalLogger; import org.apache.logging.log4j.Level; +import org.jetbrains.annotations.ApiStatus; +@ApiStatus.Internal public class FilteringLogger implements InternalLogger { private final InternalLogger logger; private final Level minLevel; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/Log4JLogger.java b/runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/Log4JLogger.java similarity index 96% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/logging/Log4JLogger.java rename to runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/Log4JLogger.java index 1db77dfe7..3dfd8d395 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/Log4JLogger.java +++ b/runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/Log4JLogger.java @@ -25,7 +25,9 @@ import me.shedaniel.rei.impl.common.InternalLogger; import org.apache.logging.log4j.Level; +import org.jetbrains.annotations.ApiStatus; +@ApiStatus.Internal public class Log4JLogger implements InternalLogger { private final org.apache.logging.log4j.Logger logger; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/MultiLogger.java b/runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/MultiLogger.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/logging/MultiLogger.java rename to runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/MultiLogger.java index 9f3d6fbda..92a11e3bc 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/MultiLogger.java +++ b/runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/MultiLogger.java @@ -25,7 +25,9 @@ import me.shedaniel.rei.impl.common.InternalLogger; import org.apache.logging.log4j.Level; +import org.jetbrains.annotations.ApiStatus; +@ApiStatus.Internal public class MultiLogger implements InternalLogger { private final Iterable loggers; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/TransformingLogger.java b/runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/TransformingLogger.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/logging/TransformingLogger.java rename to runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/TransformingLogger.java index ed9678c00..0540d8baa 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/TransformingLogger.java +++ b/runtime-engine/src/main/java/me/shedaniel/rei/impl/common/logging/TransformingLogger.java @@ -25,9 +25,11 @@ import me.shedaniel.rei.impl.common.InternalLogger; import org.apache.logging.log4j.Level; +import org.jetbrains.annotations.ApiStatus; import java.util.function.UnaryOperator; +@ApiStatus.Internal public class TransformingLogger implements InternalLogger { private final InternalLogger logger; private final UnaryOperator transformer; diff --git a/runtime-engine/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsEngine.java b/runtime-engine/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsEngine.java new file mode 100644 index 000000000..e66d0b05b --- /dev/null +++ b/runtime-engine/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsEngine.java @@ -0,0 +1,46 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.init; + +import com.google.common.collect.ImmutableList; +import dev.architectury.platform.Platform; +import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.InternalLogger; +import me.shedaniel.rei.impl.common.logging.*; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public class RoughlyEnoughItemsEngine { + private static final InternalLogger LOGGER = new TransformingLogger(new MultiLogger(ImmutableList.of( + new FileLogger(Platform.getGameFolder().resolve("logs/rei.log")), + new FilteringLogger(new FileLogger(Platform.getGameFolder().resolve("logs/rei-issues.log")), Level.WARN), + new Log4JLogger(LogManager.getFormatterLogger("REI")) + )), message -> "[REI] " + message); + + public static void onInitialize() { + Internals.attachInstanceSupplier(LOGGER, "logger"); + } +} diff --git a/runtime-engine/subsets/.gradle/loom-cache/launch.cfg b/runtime-engine/subsets/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..2851e515b --- /dev/null +++ b/runtime-engine/subsets/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/subsets/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/subsets/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/subsets/.gradle/loom-cache/log4j.xml b/runtime-engine/subsets/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/subsets/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/subsets/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/subsets/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/subsets/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/subsets/build/libs/subsets-transformProductionFabric.jar b/runtime-engine/subsets/build/libs/subsets-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..8d5af12ea3bd47f84fa92c8a9f120da34d5fbdc0 GIT binary patch literal 166 zcmWIWW@Zs#;Nak3xYhVOgaHYNFt9NAx`sIFdiuHP`#So0y1532==r++JH^28_$d=Z wfHynGn$|@kEI>U>Kpf!B$RxsmFbi1@WELvGWpaQwD;r29BM`a)X)mxg074fXHvj+t literal 0 HcmV?d00001 diff --git a/runtime-engine/subsets/build/libs/subsets-transformProductionForge.jar b/runtime-engine/subsets/build/libs/subsets-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..8d5af12ea3bd47f84fa92c8a9f120da34d5fbdc0 GIT binary patch literal 166 zcmWIWW@Zs#;Nak3xYhVOgaHYNFt9NAx`sIFdiuHP`#So0y1532==r++JH^28_$d=Z wfHynGn$|@kEI>U>Kpf!B$RxsmFbi1@WELvGWpaQwD;r29BM`a)X)mxg074fXHvj+t literal 0 HcmV?d00001 diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/subsets/SubsetsRegistryImpl.java b/runtime-engine/subsets/src/main/java/me/shedaniel/rei/impl/client/subsets/SubsetsRegistryImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/subsets/SubsetsRegistryImpl.java rename to runtime-engine/subsets/src/main/java/me/shedaniel/rei/impl/client/subsets/SubsetsRegistryImpl.java diff --git a/runtime-engine/subsets/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.subsets.SubsetsRegistry b/runtime-engine/subsets/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.subsets.SubsetsRegistry new file mode 100644 index 000000000..a0bf0b39a --- /dev/null +++ b/runtime-engine/subsets/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.subsets.SubsetsRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.subsets.SubsetsRegistryImpl \ No newline at end of file diff --git a/runtime-engine/transfer-handlers/.gradle/loom-cache/launch.cfg b/runtime-engine/transfer-handlers/.gradle/loom-cache/launch.cfg new file mode 100644 index 000000000..05ff19d9c --- /dev/null +++ b/runtime-engine/transfer-handlers/.gradle/loom-cache/launch.cfg @@ -0,0 +1,14 @@ +commonProperties + fabric.development=true + fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/transfer-handlers/.gradle/loom-cache/remapClasspath.txt + log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/transfer-handlers/.gradle/loom-cache/log4j.xml + log4j2.formatMsgNoLookups=true + fabric.log.disableAnsi=false +clientArgs + --assetIndex + 1.18.2-1.18 + --assetsDir + /home/shedaniel/.gradle/caches/fabric-loom/assets +clientProperties + java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 + org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/transfer-handlers/.gradle/loom-cache/log4j.xml b/runtime-engine/transfer-handlers/.gradle/loom-cache/log4j.xml new file mode 100644 index 000000000..c009f9fb4 --- /dev/null +++ b/runtime-engine/transfer-handlers/.gradle/loom-cache/log4j.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/runtime-engine/transfer-handlers/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/transfer-handlers/.gradle/loom-cache/remapClasspath.txt new file mode 100644 index 000000000..01f75adc1 --- /dev/null +++ b/runtime-engine/transfer-handlers/.gradle/loom-cache/remapClasspath.txt @@ -0,0 +1 @@ +/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/transfer-handlers/build/libs/transfer-handlers-transformProductionFabric.jar b/runtime-engine/transfer-handlers/build/libs/transfer-handlers-transformProductionFabric.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime-engine/transfer-handlers/build/libs/transfer-handlers-transformProductionForge.jar b/runtime-engine/transfer-handlers/build/libs/transfer-handlers-transformProductionForge.jar new file mode 100644 index 0000000000000000000000000000000000000000..08580be661de1742505338e3fad4c7e6c3a1781c GIT binary patch literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw literal 0 HcmV?d00001 diff --git a/runtime/build.gradle b/runtime/build.gradle index ef54168cc..2cc114aac 100644 --- a/runtime/build.gradle +++ b/runtime/build.gradle @@ -1,19 +1,5 @@ -archivesBaseName = rootProject.name + "-" + project.name - -architectury { - common(forgeEnabled.toBoolean()) -} - -loom { - accessWidenerPath = gradle.rootProject.project("fabric").file("src/main/resources/roughlyenoughitems.accessWidener") -} - dependencies { - modCompileOnly("net.fabricmc:fabric-loader:${project.fabricloader_version}") - modApi("me.shedaniel.cloth:cloth-config:${cloth_config_version}") - modApi("dev.architectury:architectury:${architectury_version}") compileClasspath(annotationProcessor("org.projectlombok:lombok:1.18.22")) - compileClasspath(project(path: ":api", configuration: "namedElements")) testImplementation(project(path: ":api", configuration: "namedElements")) testImplementation("org.junit.jupiter:junit-jupiter:5.8.2") } @@ -21,34 +7,3 @@ dependencies { test { useJUnitPlatform() } - -remapJar { - classifier "raw" -} - -task fakeJar(type: Jar, dependsOn: remapJar) { - from remapJar.archiveFile.map { zipTree(it) } - from(rootProject.file("fake/fabric.mod.json")) { - into "" - } - classifier null -} - -artifacts { - apiElements(fakeJar) - runtimeElements(fakeJar) -} - -afterEvaluate { - configurations.apiElements.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(tasks.remapJar) } - configurations.runtimeElements.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(tasks.remapJar) } -} - -publishing { - publications { - mavenCommon(MavenPublication) { - artifactId = rootProject.name + "-" + project.name - from components.java - } - } -} diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index f7bc42f5f..1cda29bf3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -23,60 +23,37 @@ package me.shedaniel.rei; -import com.google.common.collect.ImmutableList; import dev.architectury.platform.Platform; import dev.architectury.registry.ReloadListenerRegistry; import dev.architectury.utils.Env; import dev.architectury.utils.EnvExecutor; import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.annotation.Nullable; -import me.shedaniel.rei.api.common.entry.type.EntryType; +import me.shedaniel.rei.api.common.display.DisplaySerializerRegistry; +import me.shedaniel.rei.api.common.entry.comparison.FluidComparatorRegistry; +import me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry; +import me.shedaniel.rei.api.common.entry.settings.EntrySettingsAdapterRegistry; +import me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry; +import me.shedaniel.rei.api.common.fluid.FluidSupportProvider; import me.shedaniel.rei.api.common.plugins.PluginManager; -import me.shedaniel.rei.api.common.plugins.PluginView; import me.shedaniel.rei.api.common.plugins.REIPlugin; -import me.shedaniel.rei.api.common.plugins.REIServerPlugin; +import me.shedaniel.rei.api.common.registry.RecipeManagerContext; import me.shedaniel.rei.api.common.registry.ReloadStage; +import me.shedaniel.rei.api.common.transfer.info.MenuInfoRegistry; import me.shedaniel.rei.impl.Internals; -import me.shedaniel.rei.impl.common.InternalLogger; -import me.shedaniel.rei.impl.common.category.CategoryIdentifierImpl; -import me.shedaniel.rei.impl.common.display.DisplaySerializerRegistryImpl; -import me.shedaniel.rei.impl.common.entry.DeferringEntryTypeProviderImpl; -import me.shedaniel.rei.impl.common.entry.EntryIngredientImpl; -import me.shedaniel.rei.impl.common.entry.EntryStackProviderImpl; -import me.shedaniel.rei.impl.common.entry.comparison.FluidComparatorRegistryImpl; -import me.shedaniel.rei.impl.common.entry.comparison.ItemComparatorRegistryImpl; -import me.shedaniel.rei.impl.common.entry.comparison.NbtHasherProviderImpl; -import me.shedaniel.rei.impl.common.entry.settings.EntrySettingsAdapterRegistryImpl; -import me.shedaniel.rei.impl.common.entry.type.EntryTypeRegistryImpl; -import me.shedaniel.rei.impl.common.fluid.FluidSupportProviderImpl; -import me.shedaniel.rei.impl.common.logging.*; import me.shedaniel.rei.impl.common.logging.performance.PerformanceLogger; import me.shedaniel.rei.impl.common.logging.performance.PerformanceLoggerImpl; -import me.shedaniel.rei.impl.common.plugins.PluginManagerImpl; -import me.shedaniel.rei.impl.common.registry.RecipeManagerContextImpl; -import me.shedaniel.rei.impl.common.transfer.MenuInfoRegistryImpl; import me.shedaniel.rei.impl.init.PluginDetector; -import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.PackType; import net.minecraft.util.Unit; import org.apache.commons.lang3.mutable.MutableLong; -import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.LogManager; import org.jetbrains.annotations.ApiStatus; -import java.util.ServiceLoader; -import java.util.function.Function; -import java.util.function.UnaryOperator; +import java.util.List; @ApiStatus.Internal public class RoughlyEnoughItemsCore { - @ApiStatus.Internal - public static final InternalLogger LOGGER = new TransformingLogger(new MultiLogger(ImmutableList.of( - new FileLogger(Platform.getGameFolder().resolve("logs/rei.log")), - new FilteringLogger(new FileLogger(Platform.getGameFolder().resolve("logs/rei-issues.log")), Level.WARN), - new Log4JLogger(LogManager.getFormatterLogger("REI")) - )), message -> "[REI] " + message); public static final PerformanceLogger PERFORMANCE_LOGGER = new PerformanceLoggerImpl(); - private static final ServiceLoader PLUGIN_DETECTOR_LOADER = ServiceLoader.load(PluginDetector.class); + public static final List PLUGIN_DETECTORS = Internals.resolveServices(PluginDetector.class); static { attachCommonInternals(); @@ -86,26 +63,14 @@ public class RoughlyEnoughItemsCore { } public static void attachCommonInternals() { - Internals.attachInstanceSupplier(LOGGER, "logger"); - CategoryIdentifierImpl.attach(); - Internals.attachInstance((Function>) DeferringEntryTypeProviderImpl.INSTANCE, "entryTypeDeferred"); - Internals.attachInstance(EntryStackProviderImpl.INSTANCE, Internals.EntryStackProvider.class); - Internals.attachInstance(NbtHasherProviderImpl.INSTANCE, Internals.NbtHasherProvider.class); - Internals.attachInstance(EntryIngredientImpl.INSTANCE, Internals.EntryIngredientProvider.class); - Internals.attachInstanceSupplier(new PluginManagerImpl<>( - REIPlugin.class, - UnaryOperator.identity(), - new EntryTypeRegistryImpl(), - new EntrySettingsAdapterRegistryImpl(), - new RecipeManagerContextImpl<>(RecipeManagerContextImpl.supplier()), - new ItemComparatorRegistryImpl(), - new FluidComparatorRegistryImpl(), - new DisplaySerializerRegistryImpl(), - new FluidSupportProviderImpl()), "commonPluginManager"); - Internals.attachInstanceSupplier(new PluginManagerImpl<>( - REIServerPlugin.class, - view -> view.then(PluginView.getInstance()), - new MenuInfoRegistryImpl()), "serverPluginManager"); + PluginManager.getInstance().registerReloadable(EntryTypeRegistry.class); + PluginManager.getInstance().registerReloadable(EntrySettingsAdapterRegistry.class); + PluginManager.getInstance().registerReloadable(RecipeManagerContext.class); + PluginManager.getInstance().registerReloadable(ItemComparatorRegistry.class); + PluginManager.getInstance().registerReloadable(FluidComparatorRegistry.class); + PluginManager.getInstance().registerReloadable(DisplaySerializerRegistry.class); + PluginManager.getInstance().registerReloadable(FluidSupportProvider.class); + PluginManager.getServerInstance().registerReloadable(MenuInfoRegistry.class); } public static void _reloadPlugins(@Nullable ReloadStage stage) { @@ -131,9 +96,10 @@ public static void _reloadPlugins(@Nullable ReloadStage stage) { } public void onInitialize() { - PluginDetector detector = getPluginDetector(); - detector.detectCommonPlugins(); - detector.detectServerPlugins(); + for (PluginDetector detector : PLUGIN_DETECTORS) { + detector.detectCommonPlugins(); + detector.detectServerPlugins(); + } RoughlyEnoughItemsNetwork.onInitialize(); if (Platform.getEnvironment() == Env.SERVER) { @@ -146,8 +112,4 @@ public void onInitialize() { }); } } - - public static PluginDetector getPluginDetector() { - return PLUGIN_DETECTOR_LOADER.findFirst().orElseThrow(); - } } diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java index 0181a0267..e2dba5a38 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java @@ -34,8 +34,10 @@ import dev.architectury.networking.NetworkManager; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; -import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; +import me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry; +import me.shedaniel.rei.api.client.entry.renderer.EntryRendererRegistry; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; @@ -44,44 +46,37 @@ import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; +import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; +import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry; +import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.registry.screen.ClickArea; import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; +import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry; +import me.shedaniel.rei.api.client.search.SearchProvider; +import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; +import me.shedaniel.rei.api.client.subsets.SubsetsRegistry; +import me.shedaniel.rei.api.client.view.Views; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.plugins.PluginView; import me.shedaniel.rei.api.common.plugins.REIPlugin; +import me.shedaniel.rei.api.common.plugins.REIPluginProvider; import me.shedaniel.rei.api.common.registry.ReloadStage; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; import me.shedaniel.rei.impl.ClientInternals; import me.shedaniel.rei.impl.client.REIRuntimeImpl; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; -import me.shedaniel.rei.impl.client.config.addon.ConfigAddonRegistryImpl; -import me.shedaniel.rei.impl.client.entry.renderer.EntryRendererRegistryImpl; -import me.shedaniel.rei.impl.client.favorites.DelegatingFavoriteEntryProviderImpl; -import me.shedaniel.rei.impl.client.favorites.FavoriteEntryTypeRegistryImpl; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; +import me.shedaniel.rei.impl.client.gui.widget.CatchingExceptionUtils; import me.shedaniel.rei.impl.client.gui.widget.QueuedTooltip; import me.shedaniel.rei.impl.client.gui.widget.TooltipContextImpl; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; -import me.shedaniel.rei.impl.client.registry.category.CategoryRegistryImpl; -import me.shedaniel.rei.impl.client.registry.display.DisplayRegistryImpl; -import me.shedaniel.rei.impl.client.registry.screen.ScreenRegistryImpl; -import me.shedaniel.rei.impl.client.search.SearchProviderImpl; -import me.shedaniel.rei.impl.client.search.method.InputMethodRegistryImpl; -import me.shedaniel.rei.impl.client.subsets.SubsetsRegistryImpl; -import me.shedaniel.rei.impl.client.transfer.TransferHandlerRegistryImpl; -import me.shedaniel.rei.impl.client.view.ViewsImpl; import me.shedaniel.rei.impl.common.InternalLogger; -import me.shedaniel.rei.impl.common.entry.type.EntryRegistryImpl; -import me.shedaniel.rei.impl.common.entry.type.collapsed.CollapsibleEntryRegistryImpl; -import me.shedaniel.rei.impl.common.entry.type.types.EmptyEntryDefinition; import me.shedaniel.rei.impl.common.plugins.PluginManagerImpl; import me.shedaniel.rei.impl.common.util.IssuesDetector; -import me.shedaniel.rei.plugin.test.REITestPlugin; +import me.shedaniel.rei.impl.init.PluginDetector; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -110,6 +105,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +import java.lang.reflect.InvocationTargetException; import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.List; @@ -135,10 +131,7 @@ public class RoughlyEnoughItemsCoreClient { private static final List> RELOAD_TASKS = new CopyOnWriteArrayList<>(); public static void attachClientInternals() { - InternalWidgets.attach(); - EmptyEntryDefinition.EmptyRenderer emptyEntryRenderer = new EmptyEntryDefinition.EmptyRenderer(); - ClientInternals.attachInstance((Supplier>) () -> emptyEntryRenderer, "emptyEntryRenderer"); - ClientInternals.attachInstance((BiFunction>, Supplier, FavoriteEntry>) DelegatingFavoriteEntryProviderImpl::new, "delegateFavoriteEntry"); + CatchingExceptionUtils.attach(); ClientInternals.attachInstance((Function>) (object) -> { String type = object.getString(FavoriteEntry.TYPE_KEY); ResourceLocation id = new ResourceLocation(type); @@ -204,30 +197,29 @@ public Stream> getCategories() { return categories.stream(); } }, "clickAreaHandlerResult"); - ClientInternals.attachInstanceSupplier(new PluginManagerImpl<>( - REIClientPlugin.class, - view -> view.then(PluginView.getInstance()), - new EntryRendererRegistryImpl(), - new ViewsImpl(), - new InputMethodRegistryImpl(), - new SearchProviderImpl(), - new ConfigManagerImpl(), - new EntryRegistryImpl(), - new CollapsibleEntryRegistryImpl(), - new CategoryRegistryImpl(), - new DisplayRegistryImpl(), - new ScreenRegistryImpl(), - new FavoriteEntryTypeRegistryImpl(), - new SubsetsRegistryImpl(), - new TransferHandlerRegistryImpl(), - new REIRuntimeImpl(), - new ConfigAddonRegistryImpl()), "clientPluginManager"); + ClientInternals.getPluginManager().registerReloadable(EntryRendererRegistry.class); + ClientInternals.getPluginManager().registerReloadable(Views.class); + ClientInternals.getPluginManager().registerReloadable(InputMethodRegistry.class); + ClientInternals.getPluginManager().registerReloadable(SearchProvider.class); + ClientInternals.getPluginManager().registerReloadable(ConfigManager.class); + ClientInternals.getPluginManager().registerReloadable(EntryRegistry.class); + ClientInternals.getPluginManager().registerReloadable(CollapsibleEntryRegistry.class); + ClientInternals.getPluginManager().registerReloadable(CategoryRegistry.class); + ClientInternals.getPluginManager().registerReloadable(DisplayRegistry.class); + ClientInternals.getPluginManager().registerReloadable(ScreenRegistry.class); + ClientInternals.getPluginManager().registerReloadable(FavoriteEntryType.Registry.class); + ClientInternals.getPluginManager().registerReloadable(SubsetsRegistry.class); + ClientInternals.getPluginManager().registerReloadable(TransferHandlerRegistry.class); + ClientInternals.getPluginManager().registerReloadable(REIRuntime.class); + ClientInternals.getPluginManager().registerReloadable(ConfigAddonRegistry.class); } public void onInitializeClient() { IssuesDetector.detect(); registerEvents(); - RoughlyEnoughItemsCore.getPluginDetector().detectClientPlugins().get().run(); + for (PluginDetector detector : RoughlyEnoughItemsCore.PLUGIN_DETECTORS) { + detector.detectClientPlugins().get().run(); + } loadTestPlugins(); Minecraft client = Minecraft.getInstance(); @@ -271,7 +263,13 @@ public void onInitializeClient() { private void loadTestPlugins() { if (System.getProperty("rei.test", "false").equals("true")) { - PluginView.getClientInstance().registerPlugin(new REITestPlugin()); + try { + PluginView.getClientInstance().registerPlugin((REIPluginProvider) Class.forName("me.shedaniel.rei.plugin.test.REITestPlugin") + .getDeclaredConstructor() + .newInstance()); + } catch (InstantiationException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException(e); + } } } @@ -312,7 +310,7 @@ private void registerEvents() { reloadPlugins(endReload, ReloadStage.END); }); ClientGuiEvent.INIT_PRE.register((screen, access) -> { - List stages = ((PluginManagerImpl>) PluginManager.getInstance()).getObservedStages(); + List stages = ((PluginManagerImpl>) PluginManager.getInstance()).getReloader().getObservedStages(); if (Minecraft.getInstance().level != null && Minecraft.getInstance().player != null && stages.contains(ReloadStage.START) && !stages.contains(ReloadStage.END) && !PluginManager.areAnyReloading() && screen instanceof AbstractContainerScreen) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesSystemRegionListener.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/AbstractViewSearchBuilder.java similarity index 55% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesSystemRegionListener.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/AbstractViewSearchBuilder.java index 634b0853a..b0cc20251 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesSystemRegionListener.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/AbstractViewSearchBuilder.java @@ -21,36 +21,30 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.favorites.listeners; +package me.shedaniel.rei.impl.client; -import me.shedaniel.rei.api.client.favorites.FavoriteEntry; -import me.shedaniel.rei.api.client.gui.drag.DraggableStack; -import me.shedaniel.rei.api.client.gui.drag.DraggingContext; -import me.shedaniel.rei.impl.client.gui.widget.region.RealRegionEntry; -import me.shedaniel.rei.impl.client.gui.widget.region.RegionListener; +import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; +import me.shedaniel.rei.api.client.view.ViewSearchBuilder; +import me.shedaniel.rei.impl.display.DisplaySpec; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; -import org.jetbrains.annotations.Nullable; -public class FavoritesSystemRegionListener implements RegionListener { - @Override - @Nullable - public FavoriteEntry convertDraggableStack(DraggingContext context, DraggableStack stack) { - return FavoriteEntry.fromEntryStack(stack.getStack().copy()); - } - - @Override - public boolean canAcceptDrop(RealRegionEntry entry) { - return false; - } - - @Override - @Nullable - public FavoriteEntry asFavorite(RealRegionEntry entry) { - return null; +import java.util.Collection; +import java.util.stream.Stream; + +abstract class AbstractViewSearchBuilder implements ViewSearchBuilder { + public ViewSearchBuilder fillPreferredOpenedCategory() { + if (getPreferredOpenedCategory() == null) { + Screen currentScreen = Minecraft.getInstance().screen; + if (currentScreen instanceof DisplayScreen displayScreen) { + setPreferredOpenedCategory(displayScreen.getCurrentCategoryId()); + } + } + return this; } @Override - public boolean removeOnDrag() { - return false; + public Stream streamDisplays() { + return buildMapInternal().values().stream().flatMap(Collection::stream); } -} \ No newline at end of file +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java index 7a90619fc..b690e0932 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java @@ -49,7 +49,6 @@ import me.shedaniel.rei.impl.ClientInternals; import me.shedaniel.rei.impl.client.gui.screen.CompositeDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; -import me.shedaniel.rei.impl.client.view.ViewsImpl; import me.shedaniel.rei.impl.display.DisplaySpec; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -61,7 +60,6 @@ import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.LazyLoadedValue; import net.minecraft.util.Mth; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.Slot; @@ -70,15 +68,16 @@ import org.jetbrains.annotations.Nullable; import java.time.LocalDateTime; -import java.util.*; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; import java.util.function.Supplier; -import java.util.stream.Stream; @ApiStatus.Internal @Environment(EnvType.CLIENT) public class ClientHelperImpl implements ClientHelper { - @ApiStatus.Internal - public final LazyLoadedValue isAprilFools = new LazyLoadedValue<>(() -> { + public final Supplier isAprilFools = Suppliers.memoize(() -> { try { LocalDateTime now = LocalDateTime.now(); return now.getMonthValue() == 4 && now.getDayOfMonth() == 1; @@ -86,7 +85,7 @@ public class ClientHelperImpl implements ClientHelper { } return false; }); - private final Map modNameCache = new HashMap() {{ + private final Map modNameCache = new HashMap<>() {{ put("minecraft", "Minecraft"); put("c", "Global"); put("global", "Global"); @@ -358,241 +357,4 @@ public void onInitializeClient() { ClientInternals.attachInstance(this, ClientHelper.class); ClientInternals.attachInstance((Supplier) ViewSearchBuilderImpl::new, "viewSearchBuilder"); } - - private static abstract class AbstractViewSearchBuilder implements ViewSearchBuilder { - public ViewSearchBuilder fillPreferredOpenedCategory() { - if (getPreferredOpenedCategory() == null) { - Screen currentScreen = Minecraft.getInstance().screen; - if (currentScreen instanceof DisplayScreen displayScreen) { - setPreferredOpenedCategory(displayScreen.getCurrentCategoryId()); - } - } - return this; - } - - @Override - public Stream streamDisplays() { - return buildMapInternal().values().stream().flatMap(Collection::stream); - } - } - - public static final class ViewSearchBuilderImpl extends AbstractViewSearchBuilder { - private final Set> filteringCategories = new HashSet<>(); - private final Set> categories = new HashSet<>(); - private final List> recipesFor = new ArrayList<>(); - private final List> usagesFor = new ArrayList<>(); - @Nullable - private CategoryIdentifier preferredOpenedCategory = null; - private boolean mergeDisplays = true; - private boolean processVisibilityHandlers = true; - private final Supplier, List>> map = Suppliers.memoize(() -> ViewsImpl.buildMapFor(this)); - - @Override - public ViewSearchBuilder addCategory(CategoryIdentifier category) { - this.categories.add(category); - return this; - } - - @Override - public ViewSearchBuilder addCategories(Collection> categories) { - this.categories.addAll(categories); - return this; - } - - @Override - public Set> getCategories() { - return categories; - } - - @Override - public ViewSearchBuilder addRecipesFor(EntryStack stack) { - this.recipesFor.add(stack); - return this; - } - - @Override - public List> getRecipesFor() { - return recipesFor; - } - - @Override - public ViewSearchBuilder addUsagesFor(EntryStack stack) { - this.usagesFor.add(stack); - return this; - } - - @Override - public List> getUsagesFor() { - return usagesFor; - } - - @Override - public ViewSearchBuilder setPreferredOpenedCategory(@Nullable CategoryIdentifier category) { - this.preferredOpenedCategory = category; - return this; - } - - @Override - @Nullable - public CategoryIdentifier getPreferredOpenedCategory() { - return this.preferredOpenedCategory; - } - - @Override - public ViewSearchBuilder filterCategory(CategoryIdentifier category) { - this.filteringCategories.add(category); - return this; - } - - @Override - public ViewSearchBuilder filterCategories(Collection> categories) { - this.filteringCategories.addAll(categories); - return this; - } - - @Override - public Set> getFilteringCategories() { - return filteringCategories; - } - - @Override - public Map, List> buildMapInternal() { - fillPreferredOpenedCategory(); - return this.map.get(); - } - - @Override - public boolean isMergingDisplays() { - return mergeDisplays; - } - - @Override - public ViewSearchBuilder mergingDisplays(boolean mergingDisplays) { - this.mergeDisplays = mergingDisplays; - return this; - } - - @Override - public boolean isProcessingVisibilityHandlers() { - return processVisibilityHandlers; - } - - @Override - public ViewSearchBuilder processingVisibilityHandlers(boolean processingVisibilityHandlers) { - this.processVisibilityHandlers = processingVisibilityHandlers; - return this; - } - } - - public static final class LegacyWrapperViewSearchBuilder extends AbstractViewSearchBuilder { - private final Map, List> map; - @Nullable - private EntryStack inputNotice; - @Nullable - private EntryStack outputNotice; - @Nullable - private CategoryIdentifier preferredOpenedCategory = null; - - public LegacyWrapperViewSearchBuilder(Map, List> map) { - this.map = map; - } - - @Override - public ViewSearchBuilder addCategory(CategoryIdentifier category) { - return this; - } - - @Override - public ViewSearchBuilder addCategories(Collection> categories) { - return this; - } - - @Override - public Set> getCategories() { - return Collections.emptySet(); - } - - @Override - public ViewSearchBuilder filterCategory(CategoryIdentifier category) { - return this; - } - - @Override - public ViewSearchBuilder filterCategories(Collection> categories) { - return this; - } - - @Override - public Set> getFilteringCategories() { - return Collections.emptySet(); - } - - @Override - public ViewSearchBuilder addRecipesFor(EntryStack stack) { - return this; - } - - @Override - public List> getRecipesFor() { - return inputNotice == null ? Collections.emptyList() : Collections.singletonList(outputNotice); - } - - @Override - public ViewSearchBuilder addUsagesFor(EntryStack stack) { - return this; - } - - @Override - public List> getUsagesFor() { - return inputNotice == null ? Collections.emptyList() : Collections.singletonList(inputNotice); - } - - @Override - public ViewSearchBuilder setPreferredOpenedCategory(@Nullable CategoryIdentifier category) { - this.preferredOpenedCategory = category; - return this; - } - - @Override - @Nullable - public CategoryIdentifier getPreferredOpenedCategory() { - return this.preferredOpenedCategory; - } - - public LegacyWrapperViewSearchBuilder addInputNotice(@Nullable EntryStack stack) { - this.inputNotice = stack; - return this; - } - - public LegacyWrapperViewSearchBuilder addOutputNotice(@Nullable EntryStack stack) { - this.outputNotice = stack; - return this; - } - - @Override - public Map, List> buildMapInternal() { - fillPreferredOpenedCategory(); - return this.map; - } - - @Override - public boolean isMergingDisplays() { - return true; - } - - @Override - public ViewSearchBuilder mergingDisplays(boolean mergingDisplays) { - return this; - } - - @Override - public boolean isProcessingVisibilityHandlers() { - return false; - } - - @Override - public ViewSearchBuilder processingVisibilityHandlers(boolean processingVisibilityHandlers) { - return this; - } - } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/LegacyWrapperViewSearchBuilder.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/LegacyWrapperViewSearchBuilder.java new file mode 100644 index 000000000..c199f94e9 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/LegacyWrapperViewSearchBuilder.java @@ -0,0 +1,145 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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; + +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.client.view.ViewSearchBuilder; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.impl.display.DisplaySpec; +import org.jetbrains.annotations.Nullable; + +import java.util.*; + +public final class LegacyWrapperViewSearchBuilder extends AbstractViewSearchBuilder { + private final Map, List> map; + @Nullable + private EntryStack inputNotice; + @Nullable + private EntryStack outputNotice; + @Nullable + private CategoryIdentifier preferredOpenedCategory = null; + + public LegacyWrapperViewSearchBuilder(Map, List> map) { + this.map = map; + } + + @Override + public ViewSearchBuilder addCategory(CategoryIdentifier category) { + return this; + } + + @Override + public ViewSearchBuilder addCategories(Collection> categories) { + return this; + } + + @Override + public Set> getCategories() { + return Collections.emptySet(); + } + + @Override + public ViewSearchBuilder filterCategory(CategoryIdentifier category) { + return this; + } + + @Override + public ViewSearchBuilder filterCategories(Collection> categories) { + return this; + } + + @Override + public Set> getFilteringCategories() { + return Collections.emptySet(); + } + + @Override + public ViewSearchBuilder addRecipesFor(EntryStack stack) { + return this; + } + + @Override + public List> getRecipesFor() { + return inputNotice == null ? Collections.emptyList() : Collections.singletonList(outputNotice); + } + + @Override + public ViewSearchBuilder addUsagesFor(EntryStack stack) { + return this; + } + + @Override + public List> getUsagesFor() { + return inputNotice == null ? Collections.emptyList() : Collections.singletonList(inputNotice); + } + + @Override + public ViewSearchBuilder setPreferredOpenedCategory(@Nullable CategoryIdentifier category) { + this.preferredOpenedCategory = category; + return this; + } + + @Override + @Nullable + public CategoryIdentifier getPreferredOpenedCategory() { + return this.preferredOpenedCategory; + } + + public LegacyWrapperViewSearchBuilder addInputNotice(@Nullable EntryStack stack) { + this.inputNotice = stack; + return this; + } + + public LegacyWrapperViewSearchBuilder addOutputNotice(@Nullable EntryStack stack) { + this.outputNotice = stack; + return this; + } + + @Override + public Map, List> buildMapInternal() { + fillPreferredOpenedCategory(); + return this.map; + } + + @Override + public boolean isMergingDisplays() { + return true; + } + + @Override + public ViewSearchBuilder mergingDisplays(boolean mergingDisplays) { + return this; + } + + @Override + public boolean isProcessingVisibilityHandlers() { + return false; + } + + @Override + public ViewSearchBuilder processingVisibilityHandlers(boolean processingVisibilityHandlers) { + return this; + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java index bff0573e8..a63ddc97d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java @@ -42,12 +42,13 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; +import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.registry.ReloadStage; +import me.shedaniel.rei.impl.Internals; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; -import me.shedaniel.rei.impl.client.search.argument.Argument; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -74,7 +75,7 @@ public class REIRuntimeImpl implements REIRuntime { private AbstractContainerScreen previousContainerScreen = null; private Screen previousScreen = null; private LinkedHashSet lastDisplayScreen = Sets.newLinkedHashSetWithExpectedSize(10); - private List hintProviders = new ArrayList<>(); + private List hintProviders = Internals.resolveServices(HintProvider.class); /** * @return the instance of screen helper @@ -85,10 +86,6 @@ public static REIRuntimeImpl getInstance() { return (REIRuntimeImpl) REIRuntime.getInstance(); } - public void addHintProvider(HintProvider provider) { - this.hintProviders.add(provider); - } - public List getHintProviders() { return Collections.unmodifiableList(hintProviders); } @@ -255,7 +252,7 @@ public Rectangle calculateFavoritesListArea() { @Override public void startReload() { - Argument.SEARCH_CACHE.clear(); + SearchProvider.getInstance().clearCache(); getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); lastDisplayScreen.clear(); if (!RenderSystem.isOnRenderThread()) { @@ -272,7 +269,7 @@ public void startReload(ReloadStage stage) { @Override public void endReload(ReloadStage stage) { - Argument.SEARCH_CACHE.clear(); + SearchProvider.getInstance().clearCache(); getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ViewSearchBuilderImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ViewSearchBuilderImpl.java new file mode 100644 index 000000000..3db7d31a9 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ViewSearchBuilderImpl.java @@ -0,0 +1,144 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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; + +import com.google.common.base.Suppliers; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.client.view.ViewSearchBuilder; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.impl.client.view.ViewsImpl; +import me.shedaniel.rei.impl.display.DisplaySpec; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.function.Supplier; + +public final class ViewSearchBuilderImpl extends AbstractViewSearchBuilder { + private final Set> filteringCategories = new HashSet<>(); + private final Set> categories = new HashSet<>(); + private final List> recipesFor = new ArrayList<>(); + private final List> usagesFor = new ArrayList<>(); + @Nullable + private CategoryIdentifier preferredOpenedCategory = null; + private boolean mergeDisplays = true; + private boolean processVisibilityHandlers = true; + private final Supplier, List>> map = Suppliers.memoize(() -> ViewsImpl.buildMapFor(this)); + + @Override + public ViewSearchBuilder addCategory(CategoryIdentifier category) { + this.categories.add(category); + return this; + } + + @Override + public ViewSearchBuilder addCategories(Collection> categories) { + this.categories.addAll(categories); + return this; + } + + @Override + public Set> getCategories() { + return categories; + } + + @Override + public ViewSearchBuilder addRecipesFor(EntryStack stack) { + this.recipesFor.add(stack); + return this; + } + + @Override + public List> getRecipesFor() { + return recipesFor; + } + + @Override + public ViewSearchBuilder addUsagesFor(EntryStack stack) { + this.usagesFor.add(stack); + return this; + } + + @Override + public List> getUsagesFor() { + return usagesFor; + } + + @Override + public ViewSearchBuilder setPreferredOpenedCategory(@Nullable CategoryIdentifier category) { + this.preferredOpenedCategory = category; + return this; + } + + @Override + @Nullable + public CategoryIdentifier getPreferredOpenedCategory() { + return this.preferredOpenedCategory; + } + + @Override + public ViewSearchBuilder filterCategory(CategoryIdentifier category) { + this.filteringCategories.add(category); + return this; + } + + @Override + public ViewSearchBuilder filterCategories(Collection> categories) { + this.filteringCategories.addAll(categories); + return this; + } + + @Override + public Set> getFilteringCategories() { + return filteringCategories; + } + + @Override + public Map, List> buildMapInternal() { + fillPreferredOpenedCategory(); + return this.map.get(); + } + + @Override + public boolean isMergingDisplays() { + return mergeDisplays; + } + + @Override + public ViewSearchBuilder mergingDisplays(boolean mergingDisplays) { + this.mergeDisplays = mergingDisplays; + return this; + } + + @Override + public boolean isProcessingVisibilityHandlers() { + return processVisibilityHandlers; + } + + @Override + public ViewSearchBuilder processingVisibilityHandlers(boolean processingVisibilityHandlers) { + this.processVisibilityHandlers = processingVisibilityHandlers; + return this; + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java index 7b09548c7..45ab4ef4e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java @@ -29,9 +29,9 @@ import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; +import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.impl.client.gui.screen.ConfigReloadingScreen; -import me.shedaniel.rei.impl.client.search.argument.Argument; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.components.AbstractWidget; @@ -64,7 +64,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { } }; private AbstractWidget reloadSearchButton = new Button(0, 0, 0, 20, NarratorChatListener.NO_TITLE, button -> { - Argument.SEARCH_CACHE.clear(); + SearchProvider.getInstance().clearCache(); }); private List children = ImmutableList.of(reloadPluginsButton, reloadSearchButton); @@ -99,7 +99,7 @@ public void render(PoseStack matrices, int index, int y, int x, int entryWidth, this.reloadPluginsButton.setWidth(width / 2 - 2); this.reloadPluginsButton.x = x + entryWidth / 2 - width / 2; this.reloadPluginsButton.render(matrices, mouseX, mouseY, delta); - this.reloadSearchButton.active = this.isEditable() && !Argument.SEARCH_CACHE.isEmpty(); + this.reloadSearchButton.active = this.isEditable() && SearchProvider.getInstance().hasCache(); this.reloadSearchButton.y = y; this.reloadSearchButton.setWidth(width / 2 - 2); this.reloadSearchButton.x = x + entryWidth / 2 + 2; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/DelegatingFavoriteEntryProviderImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/DelegatingFavoriteEntryProviderImpl.java deleted file mode 100644 index 1a6b4430c..000000000 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/DelegatingFavoriteEntryProviderImpl.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.favorites; - -import com.mojang.serialization.DataResult; -import me.shedaniel.rei.api.client.favorites.FavoriteEntry; -import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; -import me.shedaniel.rei.api.client.gui.Renderer; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.resources.ResourceLocation; - -import java.util.Collection; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; -import java.util.function.Supplier; - -public class DelegatingFavoriteEntryProviderImpl extends FavoriteEntry { - private final Supplier> supplier; - private final Supplier toJson; - private FavoriteEntry value = null; - - public DelegatingFavoriteEntryProviderImpl(Supplier> supplier, Supplier toJson) { - this.supplier = supplier; - this.toJson = toJson; - } - - @Override - public FavoriteEntry getUnwrapped() { - synchronized (this) { - if (this.value == null) { - DataResult result = supplier.get(); - this.value = result.getOrThrow(false, error -> {}); - } - } - return Objects.requireNonNull(value).getUnwrapped(); - } - - @Override - public UUID getUuid() { - return getUnwrapped().getUuid(); - } - - @Override - public boolean isInvalid() { - try { - return getUnwrapped().isInvalid(); - } catch (Exception e) { - return true; - } - } - - @Override - public Renderer getRenderer(boolean showcase) { - return getUnwrapped().getRenderer(showcase); - } - - @Override - public boolean doAction(int button) { - return getUnwrapped().doAction(button); - } - - @Override - public Optional>> getMenuEntries() { - return getUnwrapped().getMenuEntries(); - } - - @Override - public long hashIgnoreAmount() { - return getUnwrapped().hashIgnoreAmount(); - } - - @Override - public FavoriteEntry copy() { - return FavoriteEntry.delegateResult(supplier, toJson); - } - - @Override - public ResourceLocation getType() { - return getUnwrapped().getType(); - } - - @Override - public CompoundTag save(CompoundTag tag) { - if (toJson == null) { - return getUnwrapped().save(tag); - } - - return tag.merge(toJson.get()); - } - - @Override - public boolean isSame(FavoriteEntry other) { - return getUnwrapped().isSame(other.getUnwrapped()); - } -} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java index e9c71f7cd..8dc417dd5 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java @@ -40,7 +40,6 @@ import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.REIRuntime; -import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.DisplayScreenType; import me.shedaniel.rei.api.client.gui.widgets.Button; @@ -49,7 +48,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; import me.shedaniel.rei.impl.ClientInternals; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; @@ -148,8 +147,7 @@ public void init() { if (scroll.target() == 0 && allModsUsingJEI != null) { scroll.setTo(200, 450); } else if (allModsUsingJEI != null && jeiEnabled) { - ConfigManagerImpl.getInstance().getConfig().setJEICompatibilityLayerEnabled(jeiEnabled); - ConfigManager.getInstance().saveConfig(); + ConfigManagerInternal.getInstance().set("advanced.enableJeiCompatibilityLayer", jeiEnabled); RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.clear(); RoughlyEnoughItemsCoreClient.reloadPlugins(null, null); Minecraft.getInstance().setScreen(REIRuntime.getInstance().getPreviousScreen()); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CatchingExceptionUtils.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CatchingExceptionUtils.java index b27b33e8e..a1c5a6825 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CatchingExceptionUtils.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CatchingExceptionUtils.java @@ -24,10 +24,12 @@ package me.shedaniel.rei.impl.client.gui.widget; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; +import me.shedaniel.rei.impl.ClientInternals; import me.shedaniel.rei.impl.client.gui.error.ErrorsEntryListWidget; import me.shedaniel.rei.impl.client.gui.error.ErrorsScreen; import me.shedaniel.rei.impl.client.util.CrashReportUtils; import net.minecraft.CrashReport; +import net.minecraft.ReportedException; import net.minecraft.client.Minecraft; import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.TextComponent; @@ -39,10 +41,15 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.function.BiConsumer; import java.util.function.Function; public class CatchingExceptionUtils { - public static void handleThrowable(Throwable throwable, String task) { + public static void attach() { + ClientInternals.attachInstance((BiConsumer) CatchingExceptionUtils::handleThrowable, "crashHandler"); + } + + private static void handleThrowable(Throwable throwable, String task) { CrashReport report = CrashReportUtils.essential(throwable, task); File reportsFolder = new File(Minecraft.getInstance().gameDirectory, "crash-reports"); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss"); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java index 5ce1e3270..03fc87793 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java @@ -30,6 +30,7 @@ import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.gui.config.AppearanceTheme; import me.shedaniel.rei.api.client.gui.config.DisplayPanelLocation; import me.shedaniel.rei.api.client.gui.config.SyntaxHighlightingMode; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; @@ -38,8 +39,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.impl.client.ClientHelperImpl; import me.shedaniel.rei.impl.client.REIRuntimeImpl; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; -import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.modules.MenuAccess; @@ -89,7 +89,8 @@ public static Widget create(ScreenOverlayImpl overlay) { } private static Collection menuEntries() { - ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); + ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); + ConfigObject config = ConfigObject.getInstance(); return List.of( ToggleMenuEntry.of(new TranslatableComponent("text.rei.cheating"), config::isCheating, @@ -112,19 +113,19 @@ else if (!ClientHelperImpl.getInstance().hasOperatorPermission()) { ToggleMenuEntry.ofDeciding(new TranslatableComponent("text.rei.config.menu.dark_theme"), config::isUsingDarkTheme, dark -> { - config.setUsingDarkTheme(dark); + manager.set("appearance.theme", dark ? AppearanceTheme.DARK : AppearanceTheme.LIGHT); return false; } ), ToggleMenuEntry.of(new TranslatableComponent("text.rei.config.menu.craftable_filter"), config::isCraftableFilterEnabled, - config::setCraftableFilterEnabled + bool -> manager.set("appearance.layout.showCraftableOnlyButton", bool) ), new SubMenuEntry(new TranslatableComponent("text.rei.config.menu.display"), List.of( ToggleMenuEntry.of(new TranslatableComponent("text.rei.config.menu.display.remove_recipe_book"), config::doesDisableRecipeBook, disableRecipeBook -> { - config.setDisableRecipeBook(disableRecipeBook); + manager.set("functionality.disableRecipeBook", disableRecipeBook); Screen screen = Minecraft.getInstance().screen; if (screen != null) { @@ -135,7 +136,7 @@ else if (!ClientHelperImpl.getInstance().hasOperatorPermission()) { ToggleMenuEntry.of(new TranslatableComponent("text.rei.config.menu.display.left_side_mob_effects"), config::isLeftSideMobEffects, disableRecipeBook -> { - config.setLeftSideMobEffects(disableRecipeBook); + manager.set("functionality.leftSideMobEffects", disableRecipeBook); Screen screen = Minecraft.getInstance().screen; if (screen != null) { @@ -145,21 +146,21 @@ else if (!ClientHelperImpl.getInstance().hasOperatorPermission()) { ), ToggleMenuEntry.of(new TranslatableComponent("text.rei.config.menu.display.left_side_panel"), config::isLeftHandSidePanel, - bool -> config.setDisplayPanelLocation(bool ? DisplayPanelLocation.LEFT : DisplayPanelLocation.RIGHT) + bool -> manager.set("advanced.accessibility.displayPanelLocation", bool ? DisplayPanelLocation.LEFT : DisplayPanelLocation.RIGHT) ), ToggleMenuEntry.of(new TranslatableComponent("text.rei.config.menu.display.scrolling_side_panel"), config::isEntryListWidgetScrolled, - config::setEntryListWidgetScrolled + bool -> manager.set("appearance.scrollingEntryListWidget", bool) ), new SeparatorMenuEntry(), ToggleMenuEntry.of(new TranslatableComponent("text.rei.config.menu.display.caching_entry_rendering"), config::doesCacheEntryRendering, - config::setDoesCacheEntryRendering + bool -> manager.set("advanced.miscellaneous.cachingFastEntryRendering", bool) ), new SeparatorMenuEntry(), ToggleMenuEntry.of(new TranslatableComponent("text.rei.config.menu.display.syntax_highlighting"), () -> config.getSyntaxHighlightingMode() == SyntaxHighlightingMode.COLORFUL || config.getSyntaxHighlightingMode() == SyntaxHighlightingMode.COLORFUL_UNDERSCORED, - bool -> config.setSyntaxHighlightingMode(bool ? SyntaxHighlightingMode.COLORFUL : SyntaxHighlightingMode.PLAIN_UNDERSCORED) + bool -> manager.set("appearance.syntaxHighlightingMode", bool ? SyntaxHighlightingMode.COLORFUL : SyntaxHighlightingMode.PLAIN_UNDERSCORED) ) )), new SeparatorMenuEntry(), diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java index afd0654c1..26cb5a9f4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java @@ -26,6 +26,7 @@ import com.mojang.math.Vector4f; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.config.ConfigManager; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; import me.shedaniel.rei.api.client.gui.widgets.Button; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; @@ -35,8 +36,7 @@ import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.REIRuntimeImpl; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; -import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.modules.MenuAccess; import me.shedaniel.rei.impl.client.gui.modules.MenuEntry; @@ -91,12 +91,13 @@ public static Widget create(ScreenOverlayImpl overlay) { } private static Collection menuEntries() { - ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); + ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); + ConfigObject config = ConfigObject.getInstance(); ArrayList entries = new ArrayList<>(List.of( new SubMenuEntry(new TranslatableComponent("text.rei.config.menu.search_field.position"), Arrays.stream(SearchFieldLocation.values()) .map(location -> ToggleMenuEntry.of(new TextComponent(location.toString()), () -> config.getSearchFieldLocation() == location, - bool -> config.setSearchFieldLocation(location)) + bool -> manager.set("appearance.layout.searchFieldLocation", location)) .withActive(() -> config.getSearchFieldLocation() != location) ) .toList()) @@ -118,7 +119,8 @@ public static List>> getApplicableInp } public static List createInputMethodEntries(List>> applicableInputMethods) { - ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); + ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); + ConfigObject config = ConfigObject.getInstance(); return applicableInputMethods.stream() .map(pair -> ToggleMenuEntry.of(pair.getValue().getName(), () -> Objects.equals(config.getInputMethodId(), pair.getKey()), @@ -130,14 +132,14 @@ public static List createInputMethodEntries(List future = pair.getValue().prepare(service).whenComplete((unused, throwable) -> { if (throwable != null) { InternalLogger.getInstance().error("Failed to prepare input method", throwable); - ConfigManagerImpl.getInstance().getConfig().setInputMethodId(new ResourceLocation("rei:default")); + manager.set("functionality.inputMethod", new ResourceLocation("rei:default")); } else { - ConfigManagerImpl.getInstance().getConfig().setInputMethodId(pair.getKey()); + manager.set("functionality.inputMethod", pair.getKey()); } }); Screen screen = Minecraft.getInstance().screen; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java index cba9a4bb1..d1158aa9f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java @@ -161,11 +161,7 @@ private LateRenderableWidget(Widget widget) { } } - public static void attach() { - ClientInternals.attachInstance(new WidgetsProvider(), ClientInternals.WidgetsProvider.class); - } - - private static class WidgetsProvider implements ClientInternals.WidgetsProvider { + public static class WidgetsProvider implements ClientInternals.WidgetsProvider { @Override public boolean isRenderingPanel(Panel panel) { return PanelWidget.isRendering(panel); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedEntriesTooltip.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedEntriesTooltip.java index 44d848b8e..74b540284 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedEntriesTooltip.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedEntriesTooltip.java @@ -27,7 +27,6 @@ import com.mojang.blaze3d.vertex.Tesselator; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.common.entry.type.collapsed.CollapsedStack; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/collapsed/CollapsedStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedStack.java similarity index 89% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/collapsed/CollapsedStack.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedStack.java index 348b3a0f2..1957db3e1 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/collapsed/CollapsedStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedStack.java @@ -21,8 +21,9 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.entry.type.collapsed; +package me.shedaniel.rei.impl.client.gui.widget.entrylist; +import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntry; import me.shedaniel.rei.api.common.entry.EntryStack; import net.minecraft.network.chat.Component; @@ -30,9 +31,9 @@ public class CollapsedStack { private final List> ingredient; - private final CollapsibleEntryRegistryImpl.Entry entry; + private final CollapsibleEntry entry; - public CollapsedStack(List> ingredient, CollapsibleEntryRegistryImpl.Entry entry) { + public CollapsedStack(List> ingredient, CollapsibleEntry entry) { this.ingredient = ingredient; this.entry = entry; } @@ -54,6 +55,6 @@ public Component getName() { } public String getModId() { - return entry.getModId(); + return entry.getId().getNamespace(); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsingEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsingEntryListWidget.java index fe2d8b7e8..d38372e4a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsingEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsingEntryListWidget.java @@ -27,7 +27,6 @@ import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.common.entry.type.collapsed.CollapsedStack; import java.util.ArrayList; import java.util.List; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java index a03865208..14a1f5d3b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java @@ -29,6 +29,7 @@ import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.EntryPanelOrdering; +import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntry; import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.view.Views; @@ -36,9 +37,8 @@ import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.search.AsyncSearchManager; +import me.shedaniel.rei.impl.client.search.SearchManager; import me.shedaniel.rei.impl.common.InternalLogger; -import me.shedaniel.rei.impl.common.entry.type.collapsed.CollapsedStack; -import me.shedaniel.rei.impl.common.entry.type.collapsed.CollapsibleEntryRegistryImpl; import net.minecraft.client.Minecraft; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.ItemStack; @@ -61,7 +61,7 @@ public class EntryListSearchManager { public static final EntryListSearchManager INSTANCE = new EntryListSearchManager(); - private AsyncSearchManager searchManager = new AsyncSearchManager(EntryRegistry.getInstance()::getPreFilteredList, () -> { + private SearchManager searchManager = new AsyncSearchManager(EntryRegistry.getInstance()::getPreFilteredList, () -> { boolean checkCraftable = ConfigManager.getInstance().isCraftableOnlyEnabled(); LongSet workingItems = checkCraftable ? new LongOpenHashSet() : null; if (checkCraftable) { @@ -104,10 +104,10 @@ private List> copyAndOrder(List> list) { } private List | CollapsedStack*/ Object> collapse(List> stacks) { - CollapsibleEntryRegistryImpl collapsibleRegistry = (CollapsibleEntryRegistryImpl) CollapsibleEntryRegistry.getInstance(); - Map entries = new HashMap<>(); + CollapsibleEntryRegistry collapsibleRegistry = CollapsibleEntryRegistry.getInstance(); + Map entries = new HashMap<>(); - for (CollapsibleEntryRegistryImpl.Entry entry : collapsibleRegistry.getEntries()) { + for (CollapsibleEntry entry : collapsibleRegistry) { entries.put(entry, null); } @@ -117,10 +117,10 @@ private List> copyAndOrder(List> list) { long hashExact = EntryStacks.hashExact(stack); boolean matchedAny = false; - for (Map.Entry mapEntry : entries.entrySet()) { - CollapsibleEntryRegistryImpl.Entry entry = mapEntry.getKey(); + for (Map.Entry mapEntry : entries.entrySet()) { + CollapsibleEntry entry = mapEntry.getKey(); - if (entry.getMatcher().matches(stack, hashExact)) { + if (entry.matches(stack, hashExact)) { CollapsedStack collapsed = mapEntry.getValue(); if (collapsed == null) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java index 31b03aca1..62dc6e6d2 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java @@ -26,7 +26,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.api.animator.NumberAnimator; import me.shedaniel.clothconfig2.api.animator.ValueAnimator; -import me.shedaniel.math.FloatingPoint; import me.shedaniel.math.FloatingRectangle; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; @@ -37,7 +36,6 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; import me.shedaniel.rei.impl.client.gui.widget.DisplayedEntryWidget; -import me.shedaniel.rei.impl.common.entry.type.collapsed.CollapsedStack; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.Mth; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java index 30aa0de60..71f837952 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java @@ -30,7 +30,6 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.REIRuntime; -import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.drag.DraggableStack; import me.shedaniel.rei.api.client.gui.drag.DraggableStackVisitorWidget; @@ -42,15 +41,14 @@ import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.api.client.overlay.OverlayListWidget; -import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.ClientHelperImpl; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; -import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; +import me.shedaniel.rei.impl.client.REIRuntimeImpl; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; @@ -171,13 +169,9 @@ public DraggedAcceptorResult acceptDraggedStack(DraggingContext context, public boolean mouseScrolled(double mouseX, double mouseY, double amount) { if (containsChecked(mouseX, mouseY, false)) { if (Screen.hasControlDown()) { - ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); + ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); + manager.set("advanced.accessibility.entrySize", manager.getConfig().getEntrySize() + amount * 0.075); scaleIndicator.setAs(10.0D); - if (config.setEntrySize(config.getEntrySize() + amount * 0.075)) { - ConfigManager.getInstance().saveConfig(); - REIRuntime.getInstance().getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); - return true; - } } } @@ -266,7 +260,6 @@ public void updateEntriesPosition() { updateEntries(entrySize, zoomed); FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); if (favoritesListWidget != null) { - favoritesListWidget.getSystemRegion().updateEntriesPosition(entry -> true); favoritesListWidget.getRegion().updateEntriesPosition(entry -> true); } } @@ -354,4 +347,9 @@ public EntryStack getFocusedStack() { public void init(ScreenOverlayImpl overlay) { } + + @Override + public void queueReloadSearch() { + updateSearch(REIRuntimeImpl.getSearchField().getText(), true); + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java index fb7c864c5..a43dc1265 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java @@ -45,7 +45,6 @@ import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; import me.shedaniel.rei.impl.client.gui.widget.DefaultDisplayChoosePageWidget; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; -import me.shedaniel.rei.impl.common.entry.type.collapsed.CollapsedStack; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.screens.Screen; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java index fda8ec704..b8126813a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java @@ -35,7 +35,6 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.client.gui.widget.BatchedEntryRendererManager; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; -import me.shedaniel.rei.impl.common.entry.type.collapsed.CollapsedStack; import net.minecraft.client.gui.screens.Screen; import net.minecraft.util.Mth; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java index de8391e41..1cec53e3a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java @@ -28,12 +28,8 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; -import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; -import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; -import me.shedaniel.rei.api.client.favorites.SystemFavoriteEntryProvider; -import me.shedaniel.rei.api.client.gui.drag.DraggableStack; import me.shedaniel.rei.api.client.gui.drag.DraggedAcceptorResult; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponent; @@ -42,37 +38,26 @@ import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.api.client.overlay.OverlayListWidget; -import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; -import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; -import me.shedaniel.rei.impl.client.favorites.FavoriteEntryTypeRegistryImpl; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.widget.favorites.history.DisplayHistoryManager; import me.shedaniel.rei.impl.client.gui.widget.favorites.history.DisplayHistoryWidget; import me.shedaniel.rei.impl.client.gui.widget.favorites.listeners.FavoritesRegionListener; -import me.shedaniel.rei.impl.client.gui.widget.favorites.listeners.FavoritesSystemRegionListener; import me.shedaniel.rei.impl.client.gui.widget.favorites.panel.FavoritesPanel; import me.shedaniel.rei.impl.client.gui.widget.favorites.panel.FavoritesTogglePanelButton; import me.shedaniel.rei.impl.client.gui.widget.favorites.trash.TrashWidget; import me.shedaniel.rei.impl.client.gui.widget.region.EntryStacksRegionWidget; -import me.shedaniel.rei.impl.client.gui.widget.region.RealRegionEntry; -import me.shedaniel.rei.impl.client.gui.widget.region.RegionDraggableStack; import me.shedaniel.rei.impl.common.util.RectangleUtils; import net.minecraft.client.gui.screens.Screen; -import org.apache.commons.lang3.mutable.MutableLong; -import org.apache.commons.lang3.tuple.Triple; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.Objects; import java.util.stream.Stream; @ApiStatus.Internal @@ -80,27 +65,21 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableCo public Rectangle fullBounds; public Rectangle excludedBounds; public Rectangle favoritesBounds; - private EntryStacksRegionWidget systemRegion = new EntryStacksRegionWidget<>(new FavoritesSystemRegionListener()); private EntryStacksRegionWidget region = new EntryStacksRegionWidget<>(new FavoritesRegionListener(this)); - private List lastSystemEntries = new ArrayList<>(); public final FavoritesPanel favoritePanel = new FavoritesPanel(this); public final TrashWidget trash = new TrashWidget(this); public final DisplayHistoryWidget displayHistory = new DisplayHistoryWidget(this); public final FavoritesTogglePanelButton togglePanelButton = new FavoritesTogglePanelButton(this); - private List children = ImmutableList.of(favoritePanel, togglePanelButton, systemRegion, region); + private List children = ImmutableList.of(favoritePanel, togglePanelButton, region); @Override public boolean mouseScrolled(double mouseX, double mouseY, double amount) { if (fullBounds.contains(mouseX, mouseY)) { if (Screen.hasControlDown()) { - ConfigObjectImpl config = ConfigManagerImpl.getInstance().getConfig(); + ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); + manager.set("advanced.accessibility.entrySize", manager.getConfig().getEntrySize() + amount * 0.075); ScreenOverlayImpl.getEntryListWidget().scaleIndicator.setAs(10.0D); - if (config.setEntrySize(config.getEntrySize() + amount * 0.075)) { - ConfigManager.getInstance().saveConfig(); - REIRuntime.getInstance().getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); - return true; - } } else if (favoritePanel.mouseScrolled(mouseX, mouseY, amount)) { return true; } else if (displayHistory.mouseScrolled(mouseX, mouseY, amount)) { @@ -119,17 +98,11 @@ public EntryStacksRegionWidget getRegion() { return region; } - public EntryStacksRegionWidget getSystemRegion() { - return systemRegion; - } - @Override @Nullable public DraggableComponent getHovered(DraggingContext context, double mouseX, double mouseY) { DraggableComponent stack = region.getHoveredStack(context, mouseX, mouseY); if (stack != null) return (DraggableComponent) stack; - stack = systemRegion.getHoveredStack(context, mouseX, mouseY); - if (stack != null) return (DraggableComponent) stack; if (favoritePanel.containsMouse(mouseX, mouseY)) { stack = favoritePanel.getHoveredStack(mouseX, mouseY); if (stack != null) return (DraggableComponent) stack; @@ -146,7 +119,7 @@ public DraggedAcceptorResult acceptDragged(DraggingContext context, Drag context.renderToVoid(stack); return DraggedAcceptorResult.CONSUMED; } - return Stream.of(region, systemRegion, displayHistory) + return Stream.of(region, displayHistory) .map(visitor -> visitor.acceptDragged(context, stack)) .filter(result -> result != DraggedAcceptorResult.PASS) .findFirst() @@ -158,8 +131,6 @@ public EntryStack getFocusedStack() { Point mouse = mouse(); EntryStack stack = region.getFocusedStack(); if (stack != null && !stack.isEmpty()) return stack; - stack = systemRegion.getFocusedStack(); - if (stack != null && !stack.isEmpty()) return stack; if (favoritePanel.containsMouse(mouse)) { EntryStack focusedStack = favoritePanel.getFocusedStack(mouse); @@ -183,24 +154,12 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { this.trash.render(matrices, mouseX, mouseY, delta); double trashHeight = this.trash.getHeight(); - if (!PluginManager.areAnyReloading()) { - updateSystemRegion(); - } - boolean draggingDisplay = DraggingContext.getInstance().isDraggingComponent() && DraggingContext.getInstance().getDragged().get() instanceof Display; int topOffsetHeight = 0; this.favoritesBounds = DisplayHistoryManager.INSTANCE.getEntries(displayHistory).isEmpty() && !draggingDisplay ? fullBounds : RectangleUtils.excludeZones(this.fullBounds, Stream.of(displayHistory.createBounds(this.excludedBounds))); - systemRegion.getBounds().setBounds(this.favoritesBounds.x, this.favoritesBounds.y + 1, this.favoritesBounds.width, Math.max(1, systemRegion.scrolling.getMaxScrollHeight())); - int systemHeight = systemRegion.getBounds().getHeight(); - if (systemHeight > 1 && !region.isEmpty()) { - Rectangle innerBounds = systemRegion.getInnerBounds(); - fillGradient(matrices, innerBounds.x + 1, this.favoritesBounds.y + systemHeight + 2, innerBounds.getMaxX() - 1, this.favoritesBounds.y + systemHeight + 3, 0xFF777777, 0xFF777777); - topOffsetHeight += systemHeight + 4; - } - displayHistory.render(matrices, mouseX, mouseY, delta); if (favoritePanel.getBounds().height > 20) { @@ -210,53 +169,10 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { region.getBounds().setBounds(this.favoritesBounds.x, this.favoritesBounds.y + topOffsetHeight, this.favoritesBounds.width, this.favoritesBounds.height - topOffsetHeight - (Math.round(trashHeight) <= 0 ? 0 : trashHeight + 24)); } - systemRegion.render(matrices, mouseX, mouseY, delta); region.render(matrices, mouseX, mouseY, delta); renderAddFavorite(matrices, mouseX, mouseY, delta); } - private void updateSystemRegion() { - boolean updated = false; - List, MutableLong, List>> providers = ((FavoriteEntryTypeRegistryImpl) FavoriteEntryType.registry()).getSystemProviders(); - - for (Triple, MutableLong, List> pair : providers) { - SystemFavoriteEntryProvider provider = pair.getLeft(); - MutableLong mutableLong = pair.getMiddle(); - List entries = pair.getRight(); - - if (mutableLong.getValue() == -1 || mutableLong.getValue() < System.currentTimeMillis()) { - mutableLong.setValue(System.currentTimeMillis() + provider.updateInterval()); - List provide = (List) provider.provide(); - if (!provide.equals(entries)) { - entries.clear(); - entries.addAll(provide); - updated = true; - } - } - } - - if (updated) { - lastSystemEntries = CollectionUtils.flatMap(providers, Triple::getRight); - setSystemRegionEntries(null); - } - } - - public void setSystemRegionEntries(@Nullable RealRegionEntry removed) { - systemRegion.setEntries(CollectionUtils.filterToList(lastSystemEntries, entry -> { - if (region.has(entry)) return false; - if (DraggingContext.getInstance().isDraggingStack()) { - DraggableStack currentStack = DraggingContext.getInstance().getCurrentStack(); - if (currentStack instanceof RegionDraggableStack) { - RegionDraggableStack stack = (RegionDraggableStack) currentStack; - - if (removed != null && stack.getEntry() == removed) return true; - return stack.getEntry().region != region || !Objects.equals(stack.getEntry().getEntry(), entry); - } - } - return true; - }), EntryStacksRegionWidget.RemovalMode.DISAPPEAR); - } - private void renderAddFavorite(PoseStack matrices, int mouseX, int mouseY, float delta) { this.favoritePanel.render(matrices, mouseX, mouseY, delta); this.togglePanelButton.render(matrices, mouseX, mouseY, delta); @@ -279,9 +195,14 @@ public void updateFavoritesBounds(@Nullable String searchTerm) { this.favoritesBounds = RectangleUtils.excludeZones(this.fullBounds, Stream.of(displayHistory.createBounds(this.fullBounds, null))); } + @Override + public void queueReloadSearch() { + updateSearch(); + } + public void updateSearch() { if (ConfigObject.getInstance().isFavoritesEnabled()) { - region.setEntries(CollectionUtils.map(FavoritesEntriesManager.INSTANCE.getFavorites(), FavoriteEntry::copy), EntryStacksRegionWidget.RemovalMode.DISAPPEAR); + region.setEntries(CollectionUtils.map(ConfigObject.getInstance().getFavoriteEntries(), FavoriteEntry::copy), EntryStacksRegionWidget.RemovalMode.DISAPPEAR); } else region.setEntries(Collections.emptyList(), EntryStacksRegionWidget.RemovalMode.DISAPPEAR); } @@ -292,7 +213,7 @@ public List children() { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (systemRegion.mouseClicked(mouseX, mouseY, button) || region.mouseClicked(mouseX, mouseY, button)) + if (region.mouseClicked(mouseX, mouseY, button)) return true; for (Widget widget : children()) if (widget.mouseClicked(mouseX, mouseY, button)) diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java index 87ef93cbe..d115190ff 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java @@ -25,12 +25,13 @@ import com.google.common.collect.Iterables; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.display.DisplaySerializerRegistry; import me.shedaniel.rei.api.common.plugins.PluginManager; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.common.InternalLogger; import net.minecraft.Util; import net.minecraft.nbt.CompoundTag; @@ -43,6 +44,10 @@ public class DisplayHistoryManager { private Map entries = new LinkedHashMap<>(); private long lastCheckTime = -1; + private List getDisplayHistory() { + return (List) ConfigManagerInternal.getInstance().get("basics.displayHistory"); + } + public Collection getEntries(DisplayHistoryWidget parent) { if ((lastCheckTime == -1 || Util.getMillis() - lastCheckTime > 4000) && !PluginManager.areAnyReloading()) { updateEntries(parent); @@ -53,7 +58,7 @@ public Collection getEntries(DisplayHistoryWidget parent) { } private void updateEntries(DisplayHistoryWidget parent) { - List displayHistory = ConfigManagerImpl.getInstance().getConfig().getDisplayHistory(); + List displayHistory = getDisplayHistory(); Map copy = new LinkedHashMap<>(entries); entries.clear(); for (CompoundTag tag : displayHistory) { @@ -80,13 +85,13 @@ private void updateEntries(DisplayHistoryWidget parent) { public void removeEntry(DisplayEntry entry) { this.entries.remove(entry.getUuid().toString()); - List displayHistory = ConfigManagerImpl.getInstance().getConfig().getDisplayHistory(); + List displayHistory = getDisplayHistory(); displayHistory.removeIf(tag -> tag.getString("DisplayHistoryUUID").equals(entry.getUuid().toString())); save(); } public void addEntry(DisplayHistoryWidget parent, @Nullable Rectangle bounds, Display display) { - List displayHistory = ConfigManagerImpl.getInstance().getConfig().getDisplayHistory(); + List displayHistory = getDisplayHistory(); Iterator iterator = this.entries.values().iterator(); while (iterator.hasNext()) { DisplayEntry entry = iterator.next(); @@ -116,7 +121,7 @@ public void addEntry(DisplayHistoryWidget parent, @Nullable Rectangle bounds, Di } private void save() { - List displayHistory = ConfigManagerImpl.getInstance().getConfig().getDisplayHistory(); + List displayHistory = getDisplayHistory(); for (CompoundTag compoundTag : displayHistory) { String uuid = compoundTag.getString("DisplayHistoryUUID"); DisplayEntry entry = entries.get(uuid); @@ -137,6 +142,6 @@ private void save() { } } - ConfigManagerImpl.getInstance().saveConfig(); + ConfigManager.getInstance().saveConfig(); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java index d9c211ec4..79f2ceac8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java @@ -27,7 +27,7 @@ import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.drag.DraggableStack; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesEntriesManager; +import me.shedaniel.rei.impl.client.favorites.MutableFavoritesList; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; import me.shedaniel.rei.impl.client.gui.widget.region.RealRegionEntry; import me.shedaniel.rei.impl.client.gui.widget.region.RegionEntryWidget; @@ -47,20 +47,19 @@ public class FavoritesRegionListener implements RegionListener { @Override public void onDrop(Stream entries) { if (ConfigObject.getInstance().isFavoritesEnabled()) { - FavoritesEntriesManager.INSTANCE.setEntries(entries.collect(Collectors.toList())); + ((MutableFavoritesList) ConfigObject.getInstance().getFavoriteEntries()).setAll(entries.collect(Collectors.toList())); } } @Override public void onRemove(RealRegionEntry entry) { if (ConfigObject.getInstance().isFavoritesEnabled()) { - FavoritesEntriesManager.INSTANCE.remove(entry.getEntry()); + ConfigObject.getInstance().getFavoriteEntries().remove(entry.getEntry()); } } @Override public void onConsumed(RealRegionEntry entry) { - favoritesListWidget.setSystemRegionEntries(entry); } @Override @@ -71,6 +70,5 @@ public FavoriteEntry convertDraggableStack(DraggingContext context, Drag @Override public void onSetNewEntries(List> regionEntryListEntries) { - favoritesListWidget.setSystemRegionEntries(null); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java index 4168b1916..2f9fe51b9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java @@ -46,9 +46,10 @@ import me.shedaniel.rei.impl.client.gui.hints.HintProvider; import me.shedaniel.rei.impl.client.gui.text.TextTransformations; import me.shedaniel.rei.impl.client.gui.widget.basewidgets.TextFieldWidget; -import me.shedaniel.rei.impl.client.search.argument.type.ArgumentType; -import me.shedaniel.rei.impl.client.search.argument.type.ArgumentTypesRegistry; -import me.shedaniel.rei.impl.client.search.argument.type.TextArgumentType; +import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.HighlightInfo; +import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.PartHighlightInfo; +import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.QuoteHighlightInfo; +import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.SplitterHighlightInfo; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; @@ -68,6 +69,7 @@ import java.util.OptionalDouble; import java.util.function.Consumer; +@SuppressWarnings("UnstableApiUsage") @ApiStatus.Internal public class OverlaySearchField extends TextFieldWidget implements TextFieldWidget.TextFormatter { public static boolean isHighlighting = false; @@ -95,23 +97,22 @@ public FormattedCharSequence format(TextFieldWidget widget, String text, int ind boolean isPlain = ConfigObject.getInstance().getSyntaxHighlightingMode() == SyntaxHighlightingMode.PLAIN || ConfigObject.getInstance().getSyntaxHighlightingMode() == SyntaxHighlightingMode.PLAIN_UNDERSCORED; boolean hasUnderscore = ConfigObject.getInstance().getSyntaxHighlightingMode() == SyntaxHighlightingMode.PLAIN_UNDERSCORED || ConfigObject.getInstance().getSyntaxHighlightingMode() == SyntaxHighlightingMode.COLORFUL_UNDERSCORED; return TextTransformations.forwardWithTransformation(text, (s, charIndex, c) -> { - byte arg = highlighter.highlighted[charIndex + index]; + HighlightInfo arg = highlighter.highlighted[charIndex + index]; Style style = Style.EMPTY; if (isMain && ScreenOverlayImpl.getEntryListWidget().isEmpty() && !getText().isEmpty()) { style = ERROR_STYLE; } - if (arg > 0) { - ArgumentType argumentType = ArgumentTypesRegistry.ARGUMENT_TYPE_LIST.get((arg - 1) / 2); + if (arg instanceof PartHighlightInfo part) { if (!isPlain) { - style = argumentType.getHighlightedStyle(); + style = part.style(); } - if (!(argumentType instanceof TextArgumentType) && hasUnderscore && arg % 2 == 1) { + if (part.style() != Style.EMPTY && hasUnderscore && part.grammar()) { style = style.withUnderlined(true); } } else if (!isPlain) { - if (arg == -1) { + if (arg == SplitterHighlightInfo.INSTANCE) { style = SPLITTER_STYLE; - } else if (arg == -2) { + } else if (arg == QuoteHighlightInfo.INSTANCE) { style = QUOTES_STYLE; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchFieldSyntaxHighlighter.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchFieldSyntaxHighlighter.java index 24e63c253..487aba72f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchFieldSyntaxHighlighter.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchFieldSyntaxHighlighter.java @@ -23,9 +23,10 @@ package me.shedaniel.rei.impl.client.gui.widget.search; -import me.shedaniel.rei.impl.client.search.IntRange; -import me.shedaniel.rei.impl.client.search.argument.Argument; -import me.shedaniel.rei.impl.client.search.argument.type.ArgumentTypesRegistry; +import it.unimi.dsi.fastutil.ints.IntIntPair; +import me.shedaniel.rei.api.client.search.SearchFilter; +import me.shedaniel.rei.api.client.search.SearchProvider; +import net.minecraft.network.chat.Style; import org.jetbrains.annotations.ApiStatus; import java.util.Collection; @@ -33,7 +34,7 @@ @ApiStatus.Internal public class OverlaySearchFieldSyntaxHighlighter implements Consumer { - public byte[] highlighted; + public HighlightInfo[] highlighted; public OverlaySearchFieldSyntaxHighlighter(String text) { this.accept(text); @@ -41,32 +42,46 @@ public OverlaySearchFieldSyntaxHighlighter(String text) { @Override public void accept(String text) { - this.highlighted = new byte[text.length()]; - Argument.bakeArguments(text, new Argument.ProcessedSink() { + this.highlighted = new HighlightInfo[text.length()]; + SearchProvider.getInstance().createFilter(text).processDecoration(new SearchFilter.ParseDecorationSink() { @Override public void addQuote(int index) { - highlighted[index] = -2; + highlighted[index] = QuoteHighlightInfo.INSTANCE; } @Override public void addSplitter(int index) { - highlighted[index] = -1; + highlighted[index] = SplitterHighlightInfo.INSTANCE; } @Override - public void addPart(Argument argument, boolean usingGrammar, Collection grammarRanges, int index) { + public void addPart(IntIntPair range, Style style, boolean usingGrammar, Collection grammarRanges, int index) { if (usingGrammar) { - int argIndex = ArgumentTypesRegistry.ARGUMENT_TYPE_LIST.indexOf(argument.getArgument()) * 2 + 1; - for (int i = argument.start(); i < argument.end(); i++) { - highlighted[i] = (byte) argIndex; + PartHighlightInfo base = new PartHighlightInfo(style, false); + PartHighlightInfo grammar = new PartHighlightInfo(style, true); + for (int i = range.leftInt(); i < range.rightInt(); i++) { + highlighted[i] = base; } - for (IntRange grammarRange : grammarRanges) { - for (int i = grammarRange.min(); i <= grammarRange.max(); i++) { - highlighted[i + index] = (byte) (argIndex + 1); + for (IntIntPair grammarRange : grammarRanges) { + for (int i = grammarRange.leftInt(); i <= grammarRange.rightInt(); i++) { + highlighted[i + index] = grammar; } } } } }); } + + public sealed interface HighlightInfo { + } + + public record PartHighlightInfo(Style style, boolean grammar) implements HighlightInfo {} + + public enum QuoteHighlightInfo implements HighlightInfo { + INSTANCE, + } + + public enum SplitterHighlightInfo implements HighlightInfo { + INSTANCE, + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java index 1264b9abf..cb0472283 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java @@ -23,34 +23,22 @@ package me.shedaniel.rei.impl.common.plugins; -import com.google.common.base.Stopwatch; import com.google.common.collect.FluentIterable; import com.google.common.collect.Iterables; -import com.mojang.datafixers.util.Pair; -import dev.architectury.platform.Platform; -import dev.architectury.utils.Env; -import dev.architectury.utils.EnvExecutor; -import dev.architectury.utils.GameInstance; -import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.plugins.PluginView; import me.shedaniel.rei.api.common.plugins.REIPlugin; import me.shedaniel.rei.api.common.plugins.REIPluginProvider; import me.shedaniel.rei.api.common.registry.ReloadStage; import me.shedaniel.rei.api.common.registry.Reloadable; -import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.common.InternalLogger; -import me.shedaniel.rei.impl.common.logging.performance.PerformanceLogger; -import net.minecraft.client.Minecraft; -import net.minecraft.server.MinecraftServer; -import org.apache.commons.lang3.tuple.MutablePair; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; -import java.io.Closeable; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.BiConsumer; import java.util.function.UnaryOperator; @ApiStatus.Internal @@ -59,19 +47,14 @@ public class PluginManagerImpl

> implements PluginManager< private final Map>, Reloadable> cache = new ConcurrentHashMap<>(); private final Class

pluginClass; private final UnaryOperator> view; - @Nullable - private ReloadStage reloading = null; - private List observedStages = new ArrayList<>(); private final List> plugins = new ArrayList<>(); - private final Stopwatch reloadStopwatch = Stopwatch.createUnstarted(); - private boolean forcedMainThread; - private final Stopwatch forceMainThreadStopwatch = Stopwatch.createUnstarted(); + private final PluginReloaderImpl

reloader = new PluginReloaderImpl<>(); @SafeVarargs - public PluginManagerImpl(Class

pluginClass, UnaryOperator> view, Reloadable... reloadables) { + public PluginManagerImpl(Class

pluginClass, UnaryOperator> view, Class>... reloadables) { this.pluginClass = pluginClass; this.view = view; - for (Reloadable reloadable : reloadables) { + for (Class> reloadable : reloadables) { registerReloadable(reloadable); } } @@ -79,11 +62,12 @@ public PluginManagerImpl(Class

pluginClass, UnaryOperator> view @Override public void registerReloadable(Reloadable reloadable) { this.reloadables.add((Reloadable

) reloadable); + InternalLogger.getInstance().info("Registered reloadable into plugin manager []: " + reloadable.getClass().getName(), pluginClass.getSimpleName()); } @Override public boolean isReloading() { - return reloading != null; + return this.reloader.isReloading(); } @Override @@ -113,269 +97,52 @@ public PluginView

view() { @Override public void registerPlugin(REIPluginProvider plugin) { plugins.add((REIPluginProvider

) plugin); - InternalLogger.getInstance().info("Registered plugin provider %s for %s", plugin.getPluginProviderName(), name(pluginClass)); + InternalLogger.getInstance().info("Registered plugin provider %s for %s", plugin.getPluginProviderName(), PluginReloaderImpl.name(pluginClass)); } @Override - public List> getPluginProviders() { - return Collections.unmodifiableList(plugins); + public void pre(ReloadStage stage) { + this.reloader.pre(this, pluginClass, getPluginWrapped().toList(), stage); } @Override - public FluentIterable

getPlugins() { - return FluentIterable.concat(Iterables.transform(plugins, REIPluginProvider::provide)); - } - - private static class PluginWrapper

> { - private final P plugin; - private final REIPluginProvider

provider; - - public PluginWrapper(P plugin, REIPluginProvider

provider) { - this.plugin = plugin; - this.provider = provider; - } - - public double getPriority() { - return plugin.getPriority(); - } - - public String getPluginProviderName() { - return provider.getPluginProviderName(); - } - } - - @SuppressWarnings("RedundantTypeArguments") - public FluentIterable> getPluginWrapped() { - return FluentIterable.>concat(Iterables., Iterable>>transform(plugins, input -> Iterables.>transform(input.provide(), - plugin -> new PluginWrapper(plugin, input)))); - } - - private static class SectionClosable implements Closeable { - private ReloadStage stage; - private MutablePair sectionData; - - public SectionClosable(ReloadStage stage, String section) { - this.stage = stage; - this.sectionData = new MutablePair<>(Stopwatch.createUnstarted(), ""); - sectionData.setRight(section); - InternalLogger.getInstance().trace("[" + stage + "] Reloading Section: \"%s\"", section); - sectionData.getLeft().reset().start(); - } - - @Override - public void close() { - sectionData.getLeft().stop(); - String section = sectionData.getRight(); - InternalLogger.getInstance().trace("[" + stage + "] Reloading Section: \"%s\" done in %s", section, sectionData.getLeft().toString()); - sectionData.getLeft().reset(); - } - } - - private SectionClosable section(ReloadStage stage, String section) { - return new SectionClosable(stage, section); - } - - @FunctionalInterface - private interface SectionPluginSink { - void accept(boolean respectMainThread, Runnable task); - } - - private void pluginSection(ReloadStage stage, String sectionName, List> list, @Nullable Reloadable reloadable, BiConsumer, SectionPluginSink> consumer) { - for (PluginWrapper

wrapper : list) { - try (SectionClosable section = section(stage, sectionName + wrapper.getPluginProviderName() + "/")) { - consumer.accept(wrapper, (respectMainThread, runnable) -> { - if (!respectMainThread || reloadable == null || !wrapper.plugin.shouldBeForcefullyDoneOnMainThread(reloadable)) { - runnable.run(); - } else { - try { - forcedMainThread = true; - forceMainThreadStopwatch.start(); - InternalLogger.getInstance().warn("Forcing plugin " + wrapper.getPluginProviderName() + " to run on the main thread for " + sectionName + "! This is extremely dangerous, and have large performance implications."); - if (Platform.getEnvironment() == Env.CLIENT) { - EnvExecutor.runInEnv(Env.CLIENT, () -> () -> queueExecutionClient(runnable)); - } else { - queueExecution(runnable); - } - } finally { - forceMainThreadStopwatch.stop(); - } - } - }); - } catch (Throwable throwable) { - InternalLogger.getInstance().error(wrapper.getPluginProviderName() + " plugin failed to " + sectionName + "!", throwable); - } - } - } - - private void queueExecution(Runnable runnable) { - MinecraftServer server = GameInstance.getServer(); - if (server != null) { - server.executeBlocking(runnable); - } + public void post(ReloadStage stage) { + this.reloader.post(this, pluginClass, getPluginWrapped().toList(), stage); } - private void queueExecutionClient(Runnable runnable) { - Minecraft.getInstance().executeBlocking(runnable); + @Override + public void startReload(ReloadStage stage) { + this.reloader.startReload(this, pluginClass, getPluginWrapped().toList(), stage); } @Override - public void pre(ReloadStage stage) { - this.forcedMainThread = false; - this.forceMainThreadStopwatch.reset(); - this.reloadStopwatch.reset().start(); - this.observedStages.clear(); - this.observedStages.add(stage); - List> plugins = new ArrayList<>(getPluginWrapped().toList()); - plugins.sort(Comparator.comparingDouble(PluginWrapper

::getPriority).reversed()); - Collections.reverse(plugins); - try (SectionClosable preRegister = section(stage, "pre-register/"); - PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage("Pre Registration")) { - pluginSection(stage, "pre-register/", plugins, null, (plugin, sink) -> { - try (PerformanceLogger.Plugin.Inner inner = perfLogger.plugin(new Pair<>(plugin.provider, plugin.plugin))) { - sink.accept(false, () -> { - ((REIPlugin

) plugin.plugin).preStage(this, stage); - }); - } - }); - } catch (Throwable throwable) { - new RuntimeException("Failed to run pre registration").printStackTrace(); - } - this.reloadStopwatch.stop(); + public List> getPluginProviders() { + return Collections.unmodifiableList(plugins); } @Override - public void post(ReloadStage stage) { - this.reloadStopwatch.start(); - List> plugins = new ArrayList<>(getPluginWrapped().toList()); - plugins.sort(Comparator.comparingDouble(PluginWrapper

::getPriority).reversed()); - Collections.reverse(plugins); - try (SectionClosable postRegister = section(stage, "post-register/"); - PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage("Post Registration")) { - pluginSection(stage, "post-register/", plugins, null, (plugin, sink) -> { - try (PerformanceLogger.Plugin.Inner inner = perfLogger.plugin(new Pair<>(plugin.provider, plugin.plugin))) { - sink.accept(false, () -> { - ((REIPlugin

) plugin.plugin).postStage(this, stage); - }); - } - }); - } catch (Throwable throwable) { - new RuntimeException("Failed to run post registration").printStackTrace(); - } - this.reloadStopwatch.stop(); - InternalLogger.getInstance().info("Reloaded Plugin Manager [%s] with %d plugins in %s.", pluginClass.getSimpleName(), plugins.size(), reloadStopwatch); - if (forcedMainThread) { - InternalLogger.getInstance().warn("Forcing plugins to run on main thread took " + forceMainThreadStopwatch); - } + public FluentIterable

getPlugins() { + return FluentIterable.concat(Iterables.transform(plugins, REIPluginProvider::provide)); } - private static String name(Class clazz) { - String simpleName = clazz.getSimpleName(); - if (simpleName.isEmpty()) return clazz.getName(); - return simpleName; + @SuppressWarnings({"RedundantTypeArguments", "UnstableApiUsage"}) + public FluentIterable> getPluginWrapped() { + return FluentIterable.>concat(Iterables., Iterable>>transform(plugins, input -> Iterables.>transform(input.provide(), + plugin -> new PluginWrapper<>(plugin, input)))); } - @Override - public void startReload(ReloadStage stage) { - try { - this.reloadStopwatch.start(); - reloading = stage; - - // Pre Reload - try (SectionClosable startReloadAll = section(stage, "start-reload/"); - PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage("Reload Initialization")) { - for (Reloadable

reloadable : reloadables) { - Class reloadableClass = reloadable.getClass(); - try (SectionClosable startReload = section(stage, "start-reload/" + name(reloadableClass) + "/"); - PerformanceLogger.Plugin.Inner inner = perfLogger.stage(name(reloadableClass))) { - reloadable.startReload(stage); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - } - } - - // Sort Plugins - List> plugins = new ArrayList<>(getPluginWrapped().toList()); - plugins.sort(Comparator.comparingDouble(PluginWrapper

::getPriority).reversed()); - InternalLogger.getInstance().info("Reloading Plugin Manager [%s] stage [%s], registered %d plugins: %s", name(pluginClass), stage.toString(), plugins.size(), CollectionUtils.mapAndJoinToString(plugins, PluginWrapper::getPluginProviderName, ", ")); - Collections.reverse(plugins); - - // Reload - for (Reloadable

reloadable : getReloadables()) { - Class reloadableClass = reloadable.getClass(); - try (SectionClosable reloadablePlugin = section(stage, "reloadable-plugin/" + name(reloadableClass) + "/"); - PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage(name(reloadableClass))) { - try (PerformanceLogger.Plugin.Inner inner = perfLogger.stage("reloadable-plugin/" + name(reloadableClass) + "/prompt-others-before")) { - for (Reloadable

listener : reloadables) { - try { - listener.beforeReloadable(stage, reloadable); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - } - } - - pluginSection(stage, "reloadable-plugin/" + name(reloadableClass) + "/", plugins, reloadable, (plugin, sink) -> { - try (PerformanceLogger.Plugin.Inner inner = perfLogger.plugin(new Pair<>(plugin.provider, plugin.plugin))) { - sink.accept(true, () -> { - for (Reloadable

listener : reloadables) { - try { - listener.beforeReloadablePlugin(stage, reloadable, plugin.plugin); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - } - - try { - reloadable.acceptPlugin(plugin.plugin, stage); - } finally { - for (Reloadable

listener : reloadables) { - try { - listener.afterReloadablePlugin(stage, reloadable, plugin.plugin); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - } - } - }); - } - }); - - try (PerformanceLogger.Plugin.Inner inner = perfLogger.stage("reloadable-plugin/" + name(reloadableClass) + "/prompt-others-after")) { - for (Reloadable

listener : reloadables) { - try { - listener.afterReloadable(stage, reloadable); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - } - } - } - } - - // Post Reload - try (SectionClosable endReloadAll = section(stage, "end-reload/"); - PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage("Reload Finalization")) { - for (Reloadable

reloadable : reloadables) { - Class reloadableClass = reloadable.getClass(); - try (SectionClosable endReload = section(stage, "end-reload/" + name(reloadableClass) + "/"); - PerformanceLogger.Plugin.Inner inner = perfLogger.stage(name(reloadableClass))) { - reloadable.endReload(stage); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - } - } - - this.reloadStopwatch.stop(); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } finally { - reloading = null; - } + public PluginReloaderImpl

getReloader() { + return reloader; } - public List getObservedStages() { - return observedStages; + record PluginWrapper

>(P plugin, REIPluginProvider

provider) { + + public double getPriority() { + return plugin.getPriority(); + } + + public String getPluginProviderName() { + return provider.getPluginProviderName(); + } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java new file mode 100644 index 000000000..52bcae1f5 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java @@ -0,0 +1,289 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.plugins; + +import com.google.common.base.Stopwatch; +import com.mojang.datafixers.util.Pair; +import dev.architectury.platform.Platform; +import dev.architectury.utils.Env; +import dev.architectury.utils.EnvExecutor; +import dev.architectury.utils.GameInstance; +import me.shedaniel.rei.RoughlyEnoughItemsCore; +import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.api.common.plugins.REIPlugin; +import me.shedaniel.rei.api.common.registry.ReloadStage; +import me.shedaniel.rei.api.common.registry.Reloadable; +import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.common.InternalLogger; +import me.shedaniel.rei.impl.common.logging.performance.PerformanceLogger; +import net.minecraft.client.Minecraft; +import net.minecraft.server.MinecraftServer; +import org.apache.commons.lang3.tuple.MutablePair; +import org.jetbrains.annotations.Nullable; + +import java.io.Closeable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.function.BiConsumer; + +public class PluginReloaderImpl

> { + @Nullable + private ReloadStage reloading = null; + private List observedStages = new ArrayList<>(); + private final Stopwatch reloadStopwatch = Stopwatch.createUnstarted(); + private boolean forcedMainThread; + private final Stopwatch forceMainThreadStopwatch = Stopwatch.createUnstarted(); + + public boolean isReloading() { + return reloading != null; + } + + @FunctionalInterface + private interface SectionPluginSink { + void accept(boolean respectMainThread, Runnable task); + } + + private static class SectionClosable implements Closeable { + private ReloadStage stage; + private MutablePair sectionData; + + public SectionClosable(ReloadStage stage, String section) { + this.stage = stage; + this.sectionData = new MutablePair<>(Stopwatch.createUnstarted(), ""); + sectionData.setRight(section); + InternalLogger.getInstance().trace("[" + stage + "] Reloading Section: \"%s\"", section); + sectionData.getLeft().reset().start(); + } + + @Override + public void close() { + sectionData.getLeft().stop(); + String section = sectionData.getRight(); + InternalLogger.getInstance().trace("[" + stage + "] Reloading Section: \"%s\" done in %s", section, sectionData.getLeft().toString()); + sectionData.getLeft().reset(); + } + } + + private SectionClosable section(ReloadStage stage, String section) { + return new SectionClosable(stage, section); + } + + private void pluginSection(ReloadStage stage, String sectionName, List> list, @Nullable Reloadable reloadable, BiConsumer, SectionPluginSink> consumer) { + for (PluginManagerImpl.PluginWrapper

wrapper : list) { + try (SectionClosable section = section(stage, sectionName + wrapper.getPluginProviderName() + "/")) { + consumer.accept(wrapper, (respectMainThread, runnable) -> { + if (!respectMainThread || reloadable == null || !wrapper.plugin().shouldBeForcefullyDoneOnMainThread(reloadable)) { + runnable.run(); + } else { + try { + forcedMainThread = true; + forceMainThreadStopwatch.start(); + InternalLogger.getInstance().warn("Forcing plugin " + wrapper.getPluginProviderName() + " to run on the main thread for " + sectionName + "! This is extremely dangerous, and have large performance implications."); + if (Platform.getEnvironment() == Env.CLIENT) { + EnvExecutor.runInEnv(Env.CLIENT, () -> () -> queueExecutionClient(runnable)); + } else { + queueExecution(runnable); + } + } finally { + forceMainThreadStopwatch.stop(); + } + } + }); + } catch (Throwable throwable) { + InternalLogger.getInstance().error(wrapper.getPluginProviderName() + " plugin failed to " + sectionName + "!", throwable); + } + } + } + + private void queueExecution(Runnable runnable) { + MinecraftServer server = GameInstance.getServer(); + if (server != null) { + server.executeBlocking(runnable); + } + } + + private void queueExecutionClient(Runnable runnable) { + Minecraft.getInstance().executeBlocking(runnable); + } + + public void pre(PluginManager

manager, Class

pluginClass, List> plugins, ReloadStage stage) { + this.forcedMainThread = false; + this.forceMainThreadStopwatch.reset(); + this.reloadStopwatch.reset().start(); + this.observedStages.clear(); + this.observedStages.add(stage); + plugins = new ArrayList<>(plugins); + plugins.sort(Comparator.comparingDouble(PluginManagerImpl.PluginWrapper

::getPriority).reversed()); + Collections.reverse(plugins); + try (SectionClosable preRegister = section(stage, "pre-register/"); + PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage("Pre Registration")) { + pluginSection(stage, "pre-register/", plugins, null, (plugin, sink) -> { + try (PerformanceLogger.Plugin.Inner inner = perfLogger.plugin(new Pair<>(plugin.provider(), plugin.plugin()))) { + sink.accept(false, () -> { + ((REIPlugin

) plugin.plugin()).preStage(manager, stage); + }); + } + }); + } catch (Throwable throwable) { + new RuntimeException("Failed to run pre registration").printStackTrace(); + } + this.reloadStopwatch.stop(); + } + + public void post(PluginManager

manager, Class

pluginClass, List> plugins, ReloadStage stage) { + this.reloadStopwatch.start(); + plugins = new ArrayList<>(plugins); + plugins.sort(Comparator.comparingDouble(PluginManagerImpl.PluginWrapper

::getPriority).reversed()); + Collections.reverse(plugins); + try (SectionClosable postRegister = section(stage, "post-register/"); + PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage("Post Registration")) { + pluginSection(stage, "post-register/", plugins, null, (plugin, sink) -> { + try (PerformanceLogger.Plugin.Inner inner = perfLogger.plugin(new Pair<>(plugin.provider(), plugin.plugin()))) { + sink.accept(false, () -> { + ((REIPlugin

) plugin.plugin()).postStage(manager, stage); + }); + } + }); + } catch (Throwable throwable) { + new RuntimeException("Failed to run post registration").printStackTrace(); + } + this.reloadStopwatch.stop(); + InternalLogger.getInstance().info("Reloaded Plugin Manager [%s] with %d plugins in %s.", pluginClass.getSimpleName(), plugins.size(), reloadStopwatch); + if (forcedMainThread) { + InternalLogger.getInstance().warn("Forcing plugins to run on main thread took " + forceMainThreadStopwatch); + } + } + + public void startReload(PluginManager

manager, Class

pluginClass, List> plugins, ReloadStage stage) { + try { + this.reloadStopwatch.start(); + reloading = stage; + + // Pre Reload + try (SectionClosable startReloadAll = section(stage, "start-reload/"); + PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage("Reload Initialization")) { + for (Reloadable

reloadable : manager.getReloadables()) { + Class reloadableClass = reloadable.getClass(); + try (SectionClosable startReload = section(stage, "start-reload/" + name(reloadableClass) + "/"); + PerformanceLogger.Plugin.Inner inner = perfLogger.stage(name(reloadableClass))) { + reloadable.startReload(stage); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + } + + // Sort Plugins + plugins = new ArrayList<>(plugins); + plugins.sort(Comparator.comparingDouble(PluginManagerImpl.PluginWrapper

::getPriority).reversed()); + InternalLogger.getInstance().info("Reloading Plugin Manager [%s] stage [%s], registered %d plugins: %s", name(pluginClass), stage.toString(), plugins.size(), CollectionUtils.mapAndJoinToString(plugins, PluginManagerImpl.PluginWrapper::getPluginProviderName, ", ")); + Collections.reverse(plugins); + + // Reload + for (Reloadable

reloadable : manager.getReloadables()) { + Class reloadableClass = reloadable.getClass(); + try (SectionClosable reloadablePlugin = section(stage, "reloadable-plugin/" + name(reloadableClass) + "/"); + PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage(name(reloadableClass))) { + try (PerformanceLogger.Plugin.Inner inner = perfLogger.stage("reloadable-plugin/" + name(reloadableClass) + "/prompt-others-before")) { + for (Reloadable

listener : manager.getReloadables()) { + try { + listener.beforeReloadable(stage, reloadable); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + } + + pluginSection(stage, "reloadable-plugin/" + name(reloadableClass) + "/", plugins, reloadable, (plugin, sink) -> { + try (PerformanceLogger.Plugin.Inner inner = perfLogger.plugin(new Pair<>(plugin.provider(), plugin.plugin()))) { + sink.accept(true, () -> { + for (Reloadable

listener : manager.getReloadables()) { + try { + listener.beforeReloadablePlugin(stage, reloadable, plugin.plugin()); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + + try { + reloadable.acceptPlugin(plugin.plugin(), stage); + } finally { + for (Reloadable

listener : manager.getReloadables()) { + try { + listener.afterReloadablePlugin(stage, reloadable, plugin.plugin()); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + } + }); + } + }); + + try (PerformanceLogger.Plugin.Inner inner = perfLogger.stage("reloadable-plugin/" + name(reloadableClass) + "/prompt-others-after")) { + for (Reloadable

listener : manager.getReloadables()) { + try { + listener.afterReloadable(stage, reloadable); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + } + } + } + + // Post Reload + try (SectionClosable endReloadAll = section(stage, "end-reload/"); + PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage("Reload Finalization")) { + for (Reloadable

reloadable : manager.getReloadables()) { + Class reloadableClass = reloadable.getClass(); + try (SectionClosable endReload = section(stage, "end-reload/" + name(reloadableClass) + "/"); + PerformanceLogger.Plugin.Inner inner = perfLogger.stage(name(reloadableClass))) { + reloadable.endReload(stage); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + } + + this.reloadStopwatch.stop(); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } finally { + reloading = null; + } + } + + static String name(Class clazz) { + String simpleName = clazz.getSimpleName(); + if (simpleName.isEmpty()) return clazz.getName(); + return simpleName; + } + + public List getObservedStages() { + return observedStages; + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java b/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java index 31436a70a..bd8f34a90 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java @@ -45,6 +45,7 @@ public static void onInitialize() { adapter.checkMods(); if (RoughlyEnoughItemsState.getErrors().isEmpty()) { + initializeEntryPoint(false, "me.shedaniel.rei.init.RoughlyEnoughItemsEngine"); initializeEntryPoint(false, "me.shedaniel.rei.RoughlyEnoughItemsCore"); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/init/ServiceBasedPluginDetector.java b/runtime/src/main/java/me/shedaniel/rei/impl/init/ServiceBasedPluginDetector.java new file mode 100644 index 000000000..5723a56d9 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/init/ServiceBasedPluginDetector.java @@ -0,0 +1,61 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.init; + +import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.api.common.plugins.REIPlugin; +import me.shedaniel.rei.api.common.plugins.REIServerPlugin; +import me.shedaniel.rei.impl.Internals; + +import java.util.List; +import java.util.function.Supplier; + +public class ServiceBasedPluginDetector implements PluginDetector { + @Override + public void detectServerPlugins() { + List plugins = Internals.resolveServices(REIServerPlugin.class); + for (REIServerPlugin plugin : plugins) { + PluginManager.getServerInstance().view().registerPlugin(plugin); + } + } + + @Override + public void detectCommonPlugins() { + List> plugins = Internals.resolveServices((Class>) (Class) REIPlugin.class); + for (REIPlugin plugin : plugins) { + PluginManager.getInstance().view().registerPlugin(plugin); + } + } + + @Override + public Supplier detectClientPlugins() { + return () -> () -> { + List plugins = Internals.resolveServices(REIClientPlugin.class); + for (REIClientPlugin plugin : plugins) { + PluginManager.getClientInstance().view().registerPlugin(plugin); + } + }; + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java index 781380276..d607dba93 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java @@ -28,7 +28,6 @@ import com.mojang.serialization.DataResult; import com.mojang.serialization.Lifecycle; import dev.architectury.platform.Platform; -import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; import me.shedaniel.rei.api.client.ClientHelper; @@ -41,9 +40,9 @@ import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentVisitorWidget; import me.shedaniel.rei.api.client.gui.widgets.Panel; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; -import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.registry.screen.ExclusionZones; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; @@ -51,22 +50,15 @@ import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.plugins.PluginManager; -import me.shedaniel.rei.api.common.plugins.REIPlugin; -import me.shedaniel.rei.api.common.registry.Reloadable; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.ClientHelperImpl; -import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; -import me.shedaniel.rei.impl.client.search.method.DefaultInputMethod; import me.shedaniel.rei.impl.client.search.method.unihan.BomopofoInputMethod; import me.shedaniel.rei.impl.client.search.method.unihan.JyutpingInputMethod; import me.shedaniel.rei.impl.client.search.method.unihan.PinyinInputMethod; import me.shedaniel.rei.impl.client.search.method.unihan.UniHanManager; -import me.shedaniel.rei.impl.common.entry.type.EntryRegistryImpl; -import me.shedaniel.rei.impl.common.entry.type.EntryRegistryListener; import me.shedaniel.rei.plugin.autocrafting.DefaultCategoryHandler; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -78,24 +70,13 @@ import org.jetbrains.annotations.Nullable; import java.util.Collections; -import java.util.List; import java.util.function.Function; @Environment(EnvType.CLIENT) @ApiStatus.Internal public class DefaultClientRuntimePlugin implements REIClientPlugin { - private final FilteredStacksVisibilityHandler filteredStacksVisibilityHandler = new FilteredStacksVisibilityHandler(); - @SuppressWarnings("rawtypes") public DefaultClientRuntimePlugin() { - PluginStageExecutionWatcher watcher = new PluginStageExecutionWatcher(); - for (PluginManager> instance : PluginManager.getActiveInstances()) { - instance.registerReloadable((Reloadable) watcher.reloadable(instance)); - } - REIRuntimeImpl.getInstance().addHintProvider(watcher); - REIRuntimeImpl.getInstance().addHintProvider(new SearchBarHighlightWatcher()); - REIRuntimeImpl.getInstance().addHintProvider(new SearchFilterPrepareWatcher()); - REIRuntimeImpl.getInstance().addHintProvider(new InputMethodWatcher()); } @Override @@ -112,24 +93,11 @@ public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, @Override @Nullable - public Tooltip getTooltip(Point point) { - return Tooltip.create(new TextComponent("Kirby"), ClientHelper.getInstance().getFormattedModFromModId("Dream Land")); + public Tooltip getTooltip(TooltipContext context) { + return Tooltip.create(context.getPoint(), new TextComponent("Kirby"), ClientHelper.getInstance().getFormattedModFromModId("Dream Land")); } })); } - - ((EntryRegistryImpl) registry).listeners.add(new EntryRegistryListener() { - @Override - public void onReFilter(List> stacks) { - filteredStacksVisibilityHandler.reset(); - } - }); - } - - @Override - public void registerDisplays(DisplayRegistry registry) { - filteredStacksVisibilityHandler.reset(); - registry.registerVisibilityPredicate(filteredStacksVisibilityHandler); } @Override @@ -172,7 +140,6 @@ public void registerTransferHandlers(TransferHandlerRegistry registry) { @Override public void registerInputMethods(InputMethodRegistry registry) { - registry.add(DefaultInputMethod.ID, DefaultInputMethod.INSTANCE); UniHanManager manager = new UniHanManager(Platform.getConfigFolder().resolve("roughlyenoughitems/unihan.zip")); registry.add(new ResourceLocation("rei:pinyin"), new PinyinInputMethod(manager)); registry.add(new ResourceLocation("rei:jyutping"), new JyutpingInputMethod(manager)); diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java index 81fff836f..e7dc28d04 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java @@ -25,20 +25,18 @@ import me.shedaniel.math.Color; import me.shedaniel.math.Point; -import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.search.method.InputMethod; import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.config.ConfigManagerImpl; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; import me.shedaniel.rei.impl.client.gui.modules.MenuAccess; import me.shedaniel.rei.impl.client.gui.widget.CraftableFilterButtonWidget; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; -import me.shedaniel.rei.impl.client.search.method.DefaultInputMethod; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; @@ -49,6 +47,7 @@ import java.util.Collections; import java.util.List; +import java.util.Map; public class InputMethodWatcher implements HintProvider { @Override @@ -59,8 +58,9 @@ public List provide() { String languageCode = Minecraft.getInstance().options.languageCode; MutableComponent component = new TextComponent(""); int match = 0; - for (InputMethod method : InputMethodRegistry.getInstance().getAll().values()) { - if (method instanceof DefaultInputMethod) continue; + for (Map.Entry> entry : InputMethodRegistry.getInstance().getAll().entrySet()) { + InputMethod method = entry.getValue(); + if (entry.getKey().equals(new ResourceLocation("rei:default"))) continue; if (CollectionUtils.anyMatch(method.getMatchingLocales(), locale -> locale.code().equals(languageCode))) { if (!component.getString().isEmpty()) { component.append(", "); @@ -99,8 +99,7 @@ public List getButtons() { () -> CraftableFilterButtonWidget.createInputMethodEntries(CraftableFilterButtonWidget.getApplicableInputMethods())); }), new HintButton(new TranslatableComponent("text.rei.input.methods.hint.ignore"), bounds -> { - ConfigManagerImpl.getInstance().getConfig().setInputMethodId(new ResourceLocation("rei:default")); - ConfigManager.getInstance().saveConfig(); + ConfigManagerInternal.getInstance().set("functionality.inputMethod", new ResourceLocation("rei:default")); }) ); } diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java index 57f30d2bc..179a89724 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java @@ -48,6 +48,12 @@ public class PluginStageExecutionWatcher implements HintProvider { private final Map, PluginManagerData> allStages = new HashMap<>(); + public PluginStageExecutionWatcher() { + for (PluginManager> instance : PluginManager.getActiveInstances()) { + instance.registerReloadable((Reloadable) reloadable(instance)); + } + } + private static class PluginManagerData { private final PluginManager manager; private final Map>> beganStages = new HashMap<>(); @@ -64,49 +70,7 @@ private void clear() { } public > Reloadable reloadable(PluginManager manager) { - return new Reloadable<>() { - private PluginManagerData data() { - return allStages.computeIfAbsent(manager, PluginManagerData::new); - } - - @Override - public void startReload() { - for (ReloadStage stage : ReloadStage.values()) { - startReload(stage); - } - } - - @Override - public void startReload(ReloadStage stage) { - synchronized (allStages) { - if (manager == PluginManager.getInstance() && stage.ordinal() == 0) { - allStages.clear(); - } - data().beganStages.put(stage, new ArrayList<>()); - } - } - - @Override - public void endReload() { - for (ReloadStage stage : ReloadStage.values()) { - endReload(stage); - } - } - - @Override - public void endReload(ReloadStage stage) { - synchronized (allStages) { - data().finishedStages.add(stage); - } - } - - @Override - public void beforeReloadable(ReloadStage stage, Reloadable other) { - synchronized (allStages) { - data().beganStages.get(stage).add(other); - } - } - }; + return new Observatory<>(manager); } public Set notVisited() { @@ -229,4 +193,52 @@ public Color getColor() { public List getButtons() { return Collections.emptyList(); } + + private class Observatory> implements Reloadable { + private final PluginManager manager; + + public Observatory(PluginManager manager) {this.manager = manager;} + + private PluginManagerData data() { + return allStages.computeIfAbsent(manager, PluginManagerData::new); + } + + @Override + public void startReload() { + for (ReloadStage stage : ReloadStage.values()) { + startReload(stage); + } + } + + @Override + public void startReload(ReloadStage stage) { + synchronized (allStages) { + if (manager == PluginManager.getInstance() && stage.ordinal() == 0) { + allStages.clear(); + } + data().beganStages.put(stage, new ArrayList<>()); + } + } + + @Override + public void endReload() { + for (ReloadStage stage : ReloadStage.values()) { + endReload(stage); + } + } + + @Override + public void endReload(ReloadStage stage) { + synchronized (allStages) { + data().finishedStages.add(stage); + } + } + + @Override + public void beforeReloadable(ReloadStage stage, Reloadable other) { + synchronized (allStages) { + data().beganStages.get(stage).add(other); + } + } + } } diff --git a/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$WidgetsProvider b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$WidgetsProvider new file mode 100644 index 000000000..d285af069 --- /dev/null +++ b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$WidgetsProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.gui.widget.InternalWidgets$WidgetsProvider \ No newline at end of file diff --git a/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider new file mode 100644 index 000000000..5e8ecf8d2 --- /dev/null +++ b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider @@ -0,0 +1,3 @@ +me.shedaniel.rei.plugin.client.runtime.PluginStageExecutionWatcher +me.shedaniel.rei.plugin.client.runtime.SearchBarHighlightWatcher +me.shedaniel.rei.plugin.client.runtime.InputMethodWatcher \ No newline at end of file diff --git a/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.init.PluginDetector b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.init.PluginDetector new file mode 100644 index 000000000..971b542a3 --- /dev/null +++ b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.init.PluginDetector @@ -0,0 +1 @@ +me.shedaniel.rei.impl.init.ServiceBasedPluginDetector \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index be97e596c..ad53f19ab 100755 --- a/settings.gradle +++ b/settings.gradle @@ -11,6 +11,21 @@ rootProject.name = "RoughlyEnoughItems" include "api" include "default-plugin" +include "shared-internals" +include "runtime-engine" +include "runtime-engine:entry-types" +include "runtime-engine:entry-stacks" +include "runtime-engine:categories" +include "runtime-engine:configs" +include "runtime-engine:displays" +include "runtime-engine:filtering-entries" +include "runtime-engine:entries" +include "runtime-engine:screens" +include "runtime-engine:favorites" +include "runtime-engine:search" +include "runtime-engine:subsets" +include "runtime-engine:transfer-handlers" +include "runtime-engine:default-runtime-plugin" include "runtime" include "fabric" include "forge" diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerInternal.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerInternal.java new file mode 100644 index 000000000..48d2aec3b --- /dev/null +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerInternal.java @@ -0,0 +1,41 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.config; + +import me.shedaniel.rei.api.client.config.ConfigManager; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public interface ConfigManagerInternal extends ConfigManager { + /** + * @return the instance of {@link ConfigManagerInternal} + */ + static ConfigManagerInternal getInstance() { + return (ConfigManagerInternal) ConfigManager.getInstance(); + } + + Object get(String fieldKey); + + boolean set(String fieldKey, Object value); +} diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/favorites/MutableFavoritesList.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/favorites/MutableFavoritesList.java new file mode 100644 index 000000000..0765cd0e4 --- /dev/null +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/favorites/MutableFavoritesList.java @@ -0,0 +1,9 @@ +package me.shedaniel.rei.impl.client.favorites; + +import me.shedaniel.rei.api.client.favorites.FavoriteEntry; + +import java.util.List; + +public interface MutableFavoritesList extends List { + void setAll(List entries); +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java rename to shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java rename to shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java index 0031ef004..1d3bfdecb 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java @@ -38,7 +38,7 @@ import java.util.function.Supplier; import java.util.function.UnaryOperator; -public class AsyncSearchManager implements Supplier>> { +public class AsyncSearchManager implements SearchManager { private final Supplier>> stacksProvider; private final Supplier>> additionalPredicateSupplier; private final UnaryOperator> transformer; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/IntRange.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/SearchManager.java similarity index 63% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/IntRange.java rename to shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/SearchManager.java index e4d29f9c9..92c44dc02 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/IntRange.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/SearchManager.java @@ -23,39 +23,26 @@ package me.shedaniel.rei.impl.client.search; -import java.util.Objects; +import me.shedaniel.rei.api.client.search.SearchProvider; +import me.shedaniel.rei.api.common.entry.EntryStack; -public class IntRange { - private final int min; - private final int max; +import java.util.List; +import java.util.concurrent.Future; +import java.util.function.Consumer; +import java.util.function.Supplier; + +public interface SearchManager extends Supplier>> { + void markDirty(); - private IntRange(int min, int max) { - this.min = min; - this.max = max; - } + void markFilterDirty(); - public static IntRange of(int min, int max) { - return new IntRange(min, max); - } + void updateFilter(String filter); - public int min() { - return min; - } + boolean isDirty(); - public int max() { - return max; - } + boolean isFilterDirty(); - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - IntRange intRange = (IntRange) o; - return min == intRange.min && max == intRange.max; - } + Future getAsync(Consumer>> consumer); - @Override - public int hashCode() { - return Objects.hash(min, max); - } + boolean matches(EntryStack stack); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java similarity index 94% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java rename to shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java index bea5a7669..eab3a1c87 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java @@ -24,7 +24,7 @@ package me.shedaniel.rei.impl.client.util; import me.shedaniel.rei.api.client.gui.Renderer; -import me.shedaniel.rei.impl.client.gui.widget.CatchingExceptionUtils; +import me.shedaniel.rei.impl.ClientInternals; import net.minecraft.CrashReport; import net.minecraft.CrashReportCategory; import net.minecraft.ReportedException; @@ -69,6 +69,6 @@ public static ReportedException throwReport(CrashReport report) { } public static void catchReport(CrashReport report) { - CatchingExceptionUtils.handleThrowable(new ReportedException(report), report.getTitle()); + ClientInternals.crash(new ReportedException(report), report.getTitle()); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/util/HashedEntryStackWrapper.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/common/util/HashedEntryStackWrapper.java similarity index 96% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/util/HashedEntryStackWrapper.java rename to shared-internals/src/main/java/me/shedaniel/rei/impl/common/util/HashedEntryStackWrapper.java index 401f9a174..9803c1797 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/util/HashedEntryStackWrapper.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/common/util/HashedEntryStackWrapper.java @@ -25,14 +25,11 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.EntryStacks; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; import org.jetbrains.annotations.ApiStatus; import java.util.Objects; @ApiStatus.Internal -@Environment(EnvType.CLIENT) public class HashedEntryStackWrapper { private final EntryStack stack; private long hash; From acc7a8e33d34b05321711f29b2683dd83fda2deb Mon Sep 17 00:00:00 2001 From: shedaniel Date: Wed, 27 Jul 2022 23:30:34 +0800 Subject: [PATCH 02/20] Add logging module, remove build files --- build.gradle | 2 +- .../CategoryRegistryImpl$Configuration.class | Bin 7035 -> 0 bytes .../category/CategoryRegistryImpl.class | Bin 10847 -> 0 bytes .../CategoryIdentifierConstructorImpl.class | Bin 1958 -> 0 bytes .../category/CategoryIdentifierImpl.class | Bin 2182 -> 0 bytes .../categories-transformProductionFabric.jar | Bin 166 -> 0 bytes .../categories-transformProductionForge.jar | Bin 166 -> 0 bytes ....client.registry.category.CategoryRegistry | 1 - ...pl.Internals.CategoryIdentifierConstructor | 1 - .../CategoryIdentifierConstructorImpl.java | 22 ----------------- .../configs-transformProductionFabric.jar | Bin 166 -> 0 bytes .../libs/configs-transformProductionForge.jar | Bin 166 -> 0 bytes ...ntime-plugin-transformProductionFabric.jar | Bin 166 -> 0 bytes ...untime-plugin-transformProductionForge.jar | Bin 166 -> 0 bytes .../displays-transformProductionFabric.jar | Bin 166 -> 0 bytes .../displays-transformProductionForge.jar | Bin 166 -> 0 bytes .../entries-transformProductionFabric.jar | Bin 166 -> 0 bytes .../libs/entries-transformProductionForge.jar | Bin 166 -> 0 bytes ...cks-8.3.9999-transformProductionFabric.jar | Bin 166 -> 0 bytes ...acks-8.3.9999-transformProductionForge.jar | Bin 166 -> 0 bytes ...entry-stacks-transformProductionFabric.jar | Bin 166 -> 0 bytes .../entry-stacks-transformProductionForge.jar | Bin 166 -> 0 bytes ...pes-8.3.9999-transformProductionFabric.jar | Bin 166 -> 0 bytes ...ypes-8.3.9999-transformProductionForge.jar | Bin 166 -> 0 bytes .../entry-types-transformProductionFabric.jar | Bin 166 -> 0 bytes .../entry-types-transformProductionForge.jar | Bin 166 -> 0 bytes .../favorites-transformProductionFabric.jar | Bin 166 -> 0 bytes .../favorites-transformProductionForge.jar | Bin 166 -> 0 bytes ...ring-entries-transformProductionFabric.jar | Bin 166 -> 0 bytes ...ering-entries-transformProductionForge.jar | Bin 166 -> 0 bytes .../rei/impl/common/logging/FileLogger.java | 0 .../impl/common/logging/FilteringLogger.java | 0 .../rei/impl/common/logging/Log4JLogger.java | 0 .../common/logging/LoggerInitializer.java} | 7 ++---- .../rei/impl/common/logging/MultiLogger.java | 0 .../common/logging/TransformingLogger.java | 0 .../registry/screen/ExclusionZonesImpl.class | Bin 9115 -> 0 bytes .../screen/ScreenRegistryImpl$1.class | Bin 2749 -> 0 bytes .../screen/ScreenRegistryImpl$2.class | Bin 2322 -> 0 bytes .../screen/ScreenRegistryImpl$3.class | Bin 2325 -> 0 bytes .../registry/screen/ScreenRegistryImpl.class | Bin 20609 -> 0 bytes .../screens-transformProductionFabric.jar | Bin 166 -> 0 bytes .../libs/screens-transformProductionForge.jar | Bin 166 -> 0 bytes .../compileJava/previous-compilation-data.bin | Bin 112600 -> 0 bytes .../libs/search-transformProductionFabric.jar | Bin 166 -> 0 bytes .../libs/search-transformProductionForge.jar | Bin 166 -> 0 bytes .../subsets-transformProductionFabric.jar | Bin 166 -> 0 bytes .../libs/subsets-transformProductionForge.jar | Bin 166 -> 0 bytes ...fer-handlers-transformProductionFabric.jar | Bin 166 -> 0 bytes ...sfer-handlers-transformProductionForge.jar | Bin 166 -> 0 bytes .../init/RoughlyEnoughItemsInitializer.java | 2 +- settings.gradle | 1 + .../favorites/MutableFavoritesList.java | 23 ++++++++++++++++++ 53 files changed, 28 insertions(+), 31 deletions(-) delete mode 100644 runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl$Configuration.class delete mode 100644 runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.class delete mode 100644 runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.class delete mode 100644 runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.class delete mode 100644 runtime-engine/categories/build/libs/categories-transformProductionFabric.jar delete mode 100644 runtime-engine/categories/build/libs/categories-transformProductionForge.jar delete mode 100644 runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.api.client.registry.category.CategoryRegistry delete mode 100644 runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor delete mode 100644 runtime-engine/categories/build/tmp/updateLicenseMain/original/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java delete mode 100644 runtime-engine/configs/build/libs/configs-transformProductionFabric.jar delete mode 100644 runtime-engine/configs/build/libs/configs-transformProductionForge.jar delete mode 100644 runtime-engine/default-runtime-plugin/build/libs/default-runtime-plugin-transformProductionFabric.jar delete mode 100644 runtime-engine/default-runtime-plugin/build/libs/default-runtime-plugin-transformProductionForge.jar delete mode 100644 runtime-engine/displays/build/libs/displays-transformProductionFabric.jar delete mode 100644 runtime-engine/displays/build/libs/displays-transformProductionForge.jar delete mode 100644 runtime-engine/entries/build/libs/entries-transformProductionFabric.jar delete mode 100644 runtime-engine/entries/build/libs/entries-transformProductionForge.jar delete mode 100644 runtime-engine/entry-stacks/build/libs/RoughlyEnoughItems-entry-stacks-8.3.9999-transformProductionFabric.jar delete mode 100644 runtime-engine/entry-stacks/build/libs/RoughlyEnoughItems-entry-stacks-8.3.9999-transformProductionForge.jar delete mode 100644 runtime-engine/entry-stacks/build/libs/entry-stacks-transformProductionFabric.jar delete mode 100644 runtime-engine/entry-stacks/build/libs/entry-stacks-transformProductionForge.jar delete mode 100644 runtime-engine/entry-types/build/libs/RoughlyEnoughItems-entry-types-8.3.9999-transformProductionFabric.jar delete mode 100644 runtime-engine/entry-types/build/libs/RoughlyEnoughItems-entry-types-8.3.9999-transformProductionForge.jar delete mode 100644 runtime-engine/entry-types/build/libs/entry-types-transformProductionFabric.jar delete mode 100644 runtime-engine/entry-types/build/libs/entry-types-transformProductionForge.jar delete mode 100644 runtime-engine/favorites/build/libs/favorites-transformProductionFabric.jar delete mode 100644 runtime-engine/favorites/build/libs/favorites-transformProductionForge.jar delete mode 100644 runtime-engine/filtering-entries/build/libs/filtering-entries-transformProductionFabric.jar delete mode 100644 runtime-engine/filtering-entries/build/libs/filtering-entries-transformProductionForge.jar rename runtime-engine/{ => logging}/src/main/java/me/shedaniel/rei/impl/common/logging/FileLogger.java (100%) rename runtime-engine/{ => logging}/src/main/java/me/shedaniel/rei/impl/common/logging/FilteringLogger.java (100%) rename runtime-engine/{ => logging}/src/main/java/me/shedaniel/rei/impl/common/logging/Log4JLogger.java (100%) rename runtime-engine/{src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsEngine.java => logging/src/main/java/me/shedaniel/rei/impl/common/logging/LoggerInitializer.java} (91%) rename runtime-engine/{ => logging}/src/main/java/me/shedaniel/rei/impl/common/logging/MultiLogger.java (100%) rename runtime-engine/{ => logging}/src/main/java/me/shedaniel/rei/impl/common/logging/TransformingLogger.java (100%) delete mode 100644 runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ExclusionZonesImpl.class delete mode 100644 runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$1.class delete mode 100644 runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$2.class delete mode 100644 runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$3.class delete mode 100644 runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl.class delete mode 100644 runtime-engine/screens/build/libs/screens-transformProductionFabric.jar delete mode 100644 runtime-engine/screens/build/libs/screens-transformProductionForge.jar delete mode 100644 runtime-engine/screens/build/tmp/compileJava/previous-compilation-data.bin delete mode 100644 runtime-engine/search/build/libs/search-transformProductionFabric.jar delete mode 100644 runtime-engine/search/build/libs/search-transformProductionForge.jar delete mode 100644 runtime-engine/subsets/build/libs/subsets-transformProductionFabric.jar delete mode 100644 runtime-engine/subsets/build/libs/subsets-transformProductionForge.jar delete mode 100644 runtime-engine/transfer-handlers/build/libs/transfer-handlers-transformProductionFabric.jar delete mode 100644 runtime-engine/transfer-handlers/build/libs/transfer-handlers-transformProductionForge.jar diff --git a/build.gradle b/build.gradle index f4b3e8caf..4f44dac96 100755 --- a/build.gradle +++ b/build.gradle @@ -16,6 +16,7 @@ group = "me.shedaniel" allprojects { ext { runtimeEngines = [ + ":runtime-engine:logging", ":runtime-engine:entry-types", ":runtime-engine:entry-stacks", ":runtime-engine:categories", @@ -34,7 +35,6 @@ allprojects { ":api", ":shared-internals", ":runtime", - ":runtime-engine", ":default-plugin", ] + runtimeEngines } diff --git a/runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl$Configuration.class b/runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl$Configuration.class deleted file mode 100644 index 06ebb4a0da7fcd0ca1daf48509a88cc81379e5b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7035 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 diff --git a/runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.class b/runtime-engine/categories/build/classes/java/main/me/shedaniel/rei/impl/client/registry/category/CategoryRegistryImpl.class deleted file mode 100644 index 2107b717e094094d5a041b09749603c5e31514fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10847 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 Xj4w#)7T+UTp*KnEFHyt&rOAH)-0mMv diff --git a/runtime-engine/categories/build/libs/categories-transformProductionFabric.jar b/runtime-engine/categories/build/libs/categories-transformProductionFabric.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/categories/build/libs/categories-transformProductionForge.jar b/runtime-engine/categories/build/libs/categories-transformProductionForge.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.api.client.registry.category.CategoryRegistry b/runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.api.client.registry.category.CategoryRegistry deleted file mode 100644 index 61b3a5741..000000000 --- a/runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.api.client.registry.category.CategoryRegistry +++ /dev/null @@ -1 +0,0 @@ -me.shedaniel.rei.impl.client.registry.category.CategoryRegistryImpl \ No newline at end of file diff --git a/runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor b/runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor deleted file mode 100644 index 6909538ca..000000000 --- a/runtime-engine/categories/build/resources/main/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor +++ /dev/null @@ -1 +0,0 @@ -me.shedaniel.rei.impl.common.category.CategoryIdentifierConstructorImpl \ No newline at end of file diff --git a/runtime-engine/categories/build/tmp/updateLicenseMain/original/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java b/runtime-engine/categories/build/tmp/updateLicenseMain/original/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java deleted file mode 100644 index cef00c684..000000000 --- a/runtime-engine/categories/build/tmp/updateLicenseMain/original/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java +++ /dev/null @@ -1,22 +0,0 @@ -package me.shedaniel.rei.impl.common.category; - -import me.shedaniel.rei.api.common.category.CategoryIdentifier; -import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.impl.Internals; -import net.minecraft.resources.ResourceLocation; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -public class CategoryIdentifierConstructorImpl implements Internals.CategoryIdentifierConstructor { - private static final Map> CACHE = new ConcurrentHashMap<>(); - - @Override - public CategoryIdentifier create(String location) { - CategoryIdentifier identifier = CACHE.get(location); - if (identifier != null) return identifier.cast(); - identifier = new CategoryIdentifierImpl<>(new ResourceLocation(location)); - CACHE.put(location, identifier); - return identifier.cast(); - } -} diff --git a/runtime-engine/configs/build/libs/configs-transformProductionFabric.jar b/runtime-engine/configs/build/libs/configs-transformProductionFabric.jar deleted file mode 100644 index eabc1eb02ae77c2cc32006f127d568485edcd171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3uxR-m!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0IzNv`2YX_ diff --git a/runtime-engine/configs/build/libs/configs-transformProductionForge.jar b/runtime-engine/configs/build/libs/configs-transformProductionForge.jar deleted file mode 100644 index eabc1eb02ae77c2cc32006f127d568485edcd171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3uxR-m!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0IzNv`2YX_ diff --git a/runtime-engine/default-runtime-plugin/build/libs/default-runtime-plugin-transformProductionFabric.jar b/runtime-engine/default-runtime-plugin/build/libs/default-runtime-plugin-transformProductionFabric.jar deleted file mode 100644 index 6430324c7b707c52acb9bbf7c3ee3f5b6838d60c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3Fsc6?!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0H-V)=Kufz diff --git a/runtime-engine/default-runtime-plugin/build/libs/default-runtime-plugin-transformProductionForge.jar b/runtime-engine/default-runtime-plugin/build/libs/default-runtime-plugin-transformProductionForge.jar deleted file mode 100644 index 6430324c7b707c52acb9bbf7c3ee3f5b6838d60c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3Fsc6?!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0H-V)=Kufz diff --git a/runtime-engine/displays/build/libs/displays-transformProductionFabric.jar b/runtime-engine/displays/build/libs/displays-transformProductionFabric.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/displays/build/libs/displays-transformProductionForge.jar b/runtime-engine/displays/build/libs/displays-transformProductionForge.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/entries/build/libs/entries-transformProductionFabric.jar b/runtime-engine/entries/build/libs/entries-transformProductionFabric.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/entries/build/libs/entries-transformProductionForge.jar b/runtime-engine/entries/build/libs/entries-transformProductionForge.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/entry-stacks/build/libs/RoughlyEnoughItems-entry-stacks-8.3.9999-transformProductionFabric.jar b/runtime-engine/entry-stacks/build/libs/RoughlyEnoughItems-entry-stacks-8.3.9999-transformProductionFabric.jar deleted file mode 100644 index 7c15ed0d5c5975298d155b177f90831968004645..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3V5s>W!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0CavEc>n+a diff --git a/runtime-engine/entry-stacks/build/libs/RoughlyEnoughItems-entry-stacks-8.3.9999-transformProductionForge.jar b/runtime-engine/entry-stacks/build/libs/RoughlyEnoughItems-entry-stacks-8.3.9999-transformProductionForge.jar deleted file mode 100644 index 7c15ed0d5c5975298d155b177f90831968004645..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3V5s>W!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0CavEc>n+a diff --git a/runtime-engine/entry-stacks/build/libs/entry-stacks-transformProductionFabric.jar b/runtime-engine/entry-stacks/build/libs/entry-stacks-transformProductionFabric.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/entry-stacks/build/libs/entry-stacks-transformProductionForge.jar b/runtime-engine/entry-stacks/build/libs/entry-stacks-transformProductionForge.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/entry-types/build/libs/RoughlyEnoughItems-entry-types-8.3.9999-transformProductionFabric.jar b/runtime-engine/entry-types/build/libs/RoughlyEnoughItems-entry-types-8.3.9999-transformProductionFabric.jar deleted file mode 100644 index 46ac07fb2c6e5b0fd902996a83b5a49846d58ab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3V66Ea!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Cj2`djJ3c diff --git a/runtime-engine/entry-types/build/libs/RoughlyEnoughItems-entry-types-8.3.9999-transformProductionForge.jar b/runtime-engine/entry-types/build/libs/RoughlyEnoughItems-entry-types-8.3.9999-transformProductionForge.jar deleted file mode 100644 index 46ac07fb2c6e5b0fd902996a83b5a49846d58ab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3V66Ea!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Cj2`djJ3c diff --git a/runtime-engine/entry-types/build/libs/entry-types-transformProductionFabric.jar b/runtime-engine/entry-types/build/libs/entry-types-transformProductionFabric.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/entry-types/build/libs/entry-types-transformProductionForge.jar b/runtime-engine/entry-types/build/libs/entry-types-transformProductionForge.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/favorites/build/libs/favorites-transformProductionFabric.jar b/runtime-engine/favorites/build/libs/favorites-transformProductionFabric.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/favorites/build/libs/favorites-transformProductionForge.jar b/runtime-engine/favorites/build/libs/favorites-transformProductionForge.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/filtering-entries/build/libs/filtering-entries-transformProductionFabric.jar b/runtime-engine/filtering-entries/build/libs/filtering-entries-transformProductionFabric.jar deleted file mode 100644 index b713a813d1e265a4166d6e9c79be71f137b7302e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 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 Zyj^UqtQOnE8^raSs>KcBP2y(6{ttdtDVhKP diff --git a/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$1.class b/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$1.class deleted file mode 100644 index ce3a2e14da673b0cf1773987f2bb2b61a9c34c0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2749 zcmb_eZBrXn6n-wGSrV3#AW{@xP-&YGWsCK-iPR9FM8k^-P{A2zmh2_Db+ennb?2fQwctRNgA7Z?UJ*&Pj68K!zjTc&Ip zRZ^u*Hcudhw1zPqFJPQu(c#i)35VA`^FSVZ+31MSLEjM0Avx}n%f)^2+^oxz>qwKf zc!Bc_n#~X7rt34XvcjLxaZQ28rQ0U461}A3WhF|Amf7Ib>;3fA!o{TWp|Qz6K`pl(QzF&7)Jk#LdiCLB2Edv==-AKnEN(g@!S@}c&5^) zme1}bkU>_%td1PsX1Lz#{?Kl=WQqS}ego$^dBgtob^R71q@)|xo zE6>fgI8K26G+z>a+cu8^BR4(wP*~h!SjzPBT)bNH*&T{c$+b8Iqe4lw-f8V~Z%Z8` z!&t?woA!?B3H2TdW2(3qO3zC@GoPmv4eFR&xs0$gO!QiO)IPTQ-X-7{W*5lhL`|i+ z?06KQgUiSk1^fRALuVuWRnxJA(>N~r^r`An-uG2pVXK-~Hm?+_cg_z$0G(erRk#66 zc8?hRrrWWtux9wiA@^)kSPa!?h(w5=?X%=5RZnL3Yo1YyAtrTSa+P7ECe8XcYi2u4 z*4>LaP8j{1Pq%KEn#ZOmTu;cOZuehen2*LTm=Ncl?e~#W3%8uEt&28?LSK;22;I4p zMJ1-no@CAKcy+!aR8P1TL_9ij=Tz2FjxIZO+x00&*SKuDmImrAcY9{x#T%54FV)-~ z4LTzCmiU3$9SKA0+?T7aPt!p!J2VZulZgA6rv5$zh7Z6}DfOR%dcL}c@exTsrqu#z z45&#koBIuH_A#_y=xqRZ=r>L}U{{f+^+ceB0{u-q=Tiirq?c0!>M;BpUzlB}Fi+@sYh${~eCZ;B$F`wOY>ka&ojKOp`P z?#`)=%_| z9?Nu>EC^66AWIeLFgC-zw@F)BotVu%LFy6SRn|rUf^!W35}~zMLNmTVwX0pj7CmFw T#(nH|CEM7eXOc)1I9>k&5(MpQ diff --git a/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$2.class b/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$2.class deleted file mode 100644 index adfa8d7ef3aeb409503e737639f0a722f6c1bc30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2322 zcmbtVYje{^6g``mD0bAuq-mg~Ep0Ji$88kCqXn6Ou@eYm9%Dmh$~VPY>}6yrvn!{Q zAJKo(nLcKKX+L!M+#l8HT}e(98>h)2kF}4vd+s^+-o5(g-@pC_a2xltn82igjEPg2 zVyO1GrMld8e8D|Sa$$+yj%T$!!Tpfd9ic+GXQ{U2+_zfM&`fqW$+ED@Fco%%Dy$G# z;{(y`9Hx;qkTWp@lOg}g*>x<>@jKR&?N_`VlCz5NMYzT=SuAbMU>0)*@+MAWp5fYv zduK-sv~>DnAfqnSj_2&fY8bK|9^MQ3zN;9{7fXjl^qjD3HOV!R@Hi1%z$XS4O`O45 zhPeZRHP2B5kQb_|l<4@*w#PSQ&|_FAHipdX(u*uU!#M+=oA?4>GF$>#Y{U<;Jm&*i-KclzDn`l=*K=TtI<%ljK8d znW5YDREj`~a4%|9b%rbHSjElkf9?*$o!Ln)8SVs9ze8lh@P18V^Qb5K&kb&>8 z906H4OZJ-7BN`*1`PuRteEbV-O{N%?#{#Vo&=s;aX(S#5y-KsIG@rmVnq9|@#Kl8e zX&0G4@Tn%6#$QR{XZDF^2<>}1b%3vTe%QyqNwZtfG0+m030-r@Ea3dFG^PV_J;IMU zCiwX(#j%o{y-L=aTXw1Z4zq9Y^>8HPl*9npgy5+}=50!;c6SGNY0RLC8rGwoDmG}$ JkrNG0&wqA_Y}Eh& diff --git a/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$3.class b/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl$3.class deleted file mode 100644 index e7b0fdac7f69e11fd262d04f23ff146f8d2b74a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2325 zcmcguTXWk)6#mw6t;Uf_8rqa{X-jH~?X(s+TncuRrnb|DI%%jgdEiZvH}QNHf34kWoDm zwf(MjcjrEL6gjI2U#KO9i9&JPz#9xVeXcA| z_}mHYUG)@tHx@(GktO^-v5~}MWryh4j;c#v*|a4bFq%XTGbT=9mSL(V`#j{Gwkye9 zzBOw7TN%2Y0|vDgp+1c>2Ifqh#aj&XFWtnQdZr86O%bm?)yeQ0nl$Wrt2rD2jMYx?G3Ps!K1B zvEOOx**zY`F2yG&e8s~s4%Ai{bA}s**5RC~7F(}wF#&VM#8s3T(t#Zj^D+hK7#1>* z^Hgf|7^o1S@uxh#zE-6ZN0fRx;G3cBiw+MN8ik|hdAusE7PpB_U3Tb%rdyQv8?m>; z!!3KqCCO|{I<~uQheFSX!n7`GhWhKe&M#Ie4}$?2hTw1l4Li-javjuUb=0$GtDdzf zDcr}4ClPi=i=7ViP!f;9@Y0q+tTKbH$Z)uR$JiTkVmRSR3NgdE=h9=C8x6=_@H8m5 z{sZ8((h_0MB{{Zk2g7hrwnf*ssoDtIkNw&oKau+m zrG>}HZCw2Y(|_T-9vzLAP7NpfxUi289`0k|A?->hK4-NBRwbS_Tx8d&M=mG+ zOC&cjk1A>jgUY{1D)gUYNh3uC%eX;UR_NO#$w2=m>DNgz0aiwXK2m7X;wo;@Tf;7s vL~l=@hV@gj{)~JhajuPNfCKVr+)lLC@KqwcgLT|ZBzLe$W0th_k<#-72z;zK diff --git a/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl.class b/runtime-engine/screens/build/classes/java/main/me/shedaniel/rei/impl/client/registry/screen/ScreenRegistryImpl.class deleted file mode 100644 index 071c40c21ba725d4bac357c49710790dff168740..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20609 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 diff --git a/runtime-engine/screens/build/libs/screens-transformProductionFabric.jar b/runtime-engine/screens/build/libs/screens-transformProductionFabric.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/screens/build/libs/screens-transformProductionForge.jar b/runtime-engine/screens/build/libs/screens-transformProductionForge.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/screens/build/tmp/compileJava/previous-compilation-data.bin b/runtime-engine/screens/build/tmp/compileJava/previous-compilation-data.bin deleted file mode 100644 index e87e019889ba42ccd469c209a39b358c6a81865e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112600 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

0^uG;DN9ibSeEdC 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 xlaf+#0JxYO4FCWD diff --git a/runtime-engine/search/build/libs/search-transformProductionForge.jar b/runtime-engine/search/build/libs/search-transformProductionForge.jar deleted file mode 100644 index 298b693b1509d2ac42504110c3e00b299dde6739..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3u+#0JxYO4FCWD diff --git a/runtime-engine/subsets/build/libs/subsets-transformProductionFabric.jar b/runtime-engine/subsets/build/libs/subsets-transformProductionFabric.jar deleted file mode 100644 index 8d5af12ea3bd47f84fa92c8a9f120da34d5fbdc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3xYhVOgaHYNFt9NAx`sIFdiuHP`#So0y1532==r++JH^28_$d=Z wfHynGn$|@kEI>U>Kpf!B$RxsmFbi1@WELvGWpaQwD;r29BM`a)X)mxg074fXHvj+t diff --git a/runtime-engine/subsets/build/libs/subsets-transformProductionForge.jar b/runtime-engine/subsets/build/libs/subsets-transformProductionForge.jar deleted file mode 100644 index 8d5af12ea3bd47f84fa92c8a9f120da34d5fbdc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3xYhVOgaHYNFt9NAx`sIFdiuHP`#So0y1532==r++JH^28_$d=Z wfHynGn$|@kEI>U>Kpf!B$RxsmFbi1@WELvGWpaQwD;r29BM`a)X)mxg074fXHvj+t diff --git a/runtime-engine/transfer-handlers/build/libs/transfer-handlers-transformProductionFabric.jar b/runtime-engine/transfer-handlers/build/libs/transfer-handlers-transformProductionFabric.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime-engine/transfer-handlers/build/libs/transfer-handlers-transformProductionForge.jar b/runtime-engine/transfer-handlers/build/libs/transfer-handlers-transformProductionForge.jar deleted file mode 100644 index 08580be661de1742505338e3fad4c7e6c3a1781c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 166 zcmWIWW@Zs#;Nak3=&Jo4!hi%s7+4s5T|*poJ^kGDeI5Ng-CTo1^nBg^onl~k{FI3y wz?+?8P3s~N7N8y`AP(?mWD;ROn1w6{G7A;pGC9DTl?|kl5eVIYv=>+#0Q8_7j{pDw diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java b/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java index bd8f34a90..bae00c714 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java @@ -45,7 +45,7 @@ public static void onInitialize() { adapter.checkMods(); if (RoughlyEnoughItemsState.getErrors().isEmpty()) { - initializeEntryPoint(false, "me.shedaniel.rei.init.RoughlyEnoughItemsEngine"); + initializeEntryPoint(false, "me.shedaniel.rei.impl.common.logging.LoggerInitializer"); initializeEntryPoint(false, "me.shedaniel.rei.RoughlyEnoughItemsCore"); } } diff --git a/settings.gradle b/settings.gradle index ad53f19ab..67ca82964 100755 --- a/settings.gradle +++ b/settings.gradle @@ -13,6 +13,7 @@ include "api" include "default-plugin" include "shared-internals" include "runtime-engine" +include "runtime-engine:logging" include "runtime-engine:entry-types" include "runtime-engine:entry-stacks" include "runtime-engine:categories" diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/favorites/MutableFavoritesList.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/favorites/MutableFavoritesList.java index 0765cd0e4..27ac4c940 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/favorites/MutableFavoritesList.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/favorites/MutableFavoritesList.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.favorites; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; From c85b3d49f6d88e7e92b06bacca1ce93db7b75fd0 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Wed, 27 Jul 2022 23:32:49 +0800 Subject: [PATCH 03/20] Remove .gradle --- .../categories/.gradle/loom-cache/launch.cfg | 14 ----- .../categories/.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - .../configs/.gradle/loom-cache/launch.cfg | 14 ----- .../configs/.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - .../.gradle/loom-cache/launch.cfg | 14 ----- .../.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - .../displays/.gradle/loom-cache/launch.cfg | 14 ----- .../displays/.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - .../entries/.gradle/loom-cache/launch.cfg | 14 ----- .../entries/.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - .../.gradle/loom-cache/launch.cfg | 14 ----- .../entry-stacks/.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - .../entry-types/.gradle/loom-cache/launch.cfg | 14 ----- .../entry-types/.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - .../favorites/.gradle/loom-cache/launch.cfg | 14 ----- .../favorites/.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - .../.gradle/loom-cache/launch.cfg | 14 ----- .../.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - .../screens/.gradle/loom-cache/launch.cfg | 14 ----- .../screens/.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - .../search/.gradle/loom-cache/launch.cfg | 14 ----- .../search/.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - .../subsets/.gradle/loom-cache/launch.cfg | 14 ----- .../subsets/.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - .../.gradle/loom-cache/launch.cfg | 14 ----- .../.gradle/loom-cache/log4j.xml | 63 ------------------- .../.gradle/loom-cache/remapClasspath.txt | 1 - 39 files changed, 1014 deletions(-) delete mode 100644 runtime-engine/categories/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/categories/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/categories/.gradle/loom-cache/remapClasspath.txt delete mode 100644 runtime-engine/configs/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/configs/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/configs/.gradle/loom-cache/remapClasspath.txt delete mode 100644 runtime-engine/default-runtime-plugin/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/default-runtime-plugin/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/default-runtime-plugin/.gradle/loom-cache/remapClasspath.txt delete mode 100644 runtime-engine/displays/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/displays/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/displays/.gradle/loom-cache/remapClasspath.txt delete mode 100644 runtime-engine/entries/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/entries/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/entries/.gradle/loom-cache/remapClasspath.txt delete mode 100644 runtime-engine/entry-stacks/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/entry-stacks/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/entry-stacks/.gradle/loom-cache/remapClasspath.txt delete mode 100644 runtime-engine/entry-types/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/entry-types/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/entry-types/.gradle/loom-cache/remapClasspath.txt delete mode 100644 runtime-engine/favorites/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/favorites/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/favorites/.gradle/loom-cache/remapClasspath.txt delete mode 100644 runtime-engine/filtering-entries/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/filtering-entries/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/filtering-entries/.gradle/loom-cache/remapClasspath.txt delete mode 100644 runtime-engine/screens/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/screens/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/screens/.gradle/loom-cache/remapClasspath.txt delete mode 100644 runtime-engine/search/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/search/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/search/.gradle/loom-cache/remapClasspath.txt delete mode 100644 runtime-engine/subsets/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/subsets/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/subsets/.gradle/loom-cache/remapClasspath.txt delete mode 100644 runtime-engine/transfer-handlers/.gradle/loom-cache/launch.cfg delete mode 100644 runtime-engine/transfer-handlers/.gradle/loom-cache/log4j.xml delete mode 100644 runtime-engine/transfer-handlers/.gradle/loom-cache/remapClasspath.txt diff --git a/runtime-engine/categories/.gradle/loom-cache/launch.cfg b/runtime-engine/categories/.gradle/loom-cache/launch.cfg deleted file mode 100644 index 983de0279..000000000 --- a/runtime-engine/categories/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/categories/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/categories/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/categories/.gradle/loom-cache/log4j.xml b/runtime-engine/categories/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/categories/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/categories/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/categories/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/categories/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/configs/.gradle/loom-cache/launch.cfg b/runtime-engine/configs/.gradle/loom-cache/launch.cfg deleted file mode 100644 index a0890e04c..000000000 --- a/runtime-engine/configs/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/configs/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/configs/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/configs/.gradle/loom-cache/log4j.xml b/runtime-engine/configs/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/configs/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/configs/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/configs/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/configs/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/default-runtime-plugin/.gradle/loom-cache/launch.cfg b/runtime-engine/default-runtime-plugin/.gradle/loom-cache/launch.cfg deleted file mode 100644 index 78cd94430..000000000 --- a/runtime-engine/default-runtime-plugin/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/default-runtime-plugin/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/default-runtime-plugin/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/default-runtime-plugin/.gradle/loom-cache/log4j.xml b/runtime-engine/default-runtime-plugin/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/default-runtime-plugin/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/default-runtime-plugin/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/default-runtime-plugin/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/default-runtime-plugin/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/displays/.gradle/loom-cache/launch.cfg b/runtime-engine/displays/.gradle/loom-cache/launch.cfg deleted file mode 100644 index a9fc564cc..000000000 --- a/runtime-engine/displays/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/displays/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/displays/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/displays/.gradle/loom-cache/log4j.xml b/runtime-engine/displays/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/displays/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/displays/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/displays/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/displays/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/entries/.gradle/loom-cache/launch.cfg b/runtime-engine/entries/.gradle/loom-cache/launch.cfg deleted file mode 100644 index 37d0ec9e3..000000000 --- a/runtime-engine/entries/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/entries/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/entries/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/entries/.gradle/loom-cache/log4j.xml b/runtime-engine/entries/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/entries/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/entries/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/entries/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/entries/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/entry-stacks/.gradle/loom-cache/launch.cfg b/runtime-engine/entry-stacks/.gradle/loom-cache/launch.cfg deleted file mode 100644 index 6c940564d..000000000 --- a/runtime-engine/entry-stacks/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/entry-stacks/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/entry-stacks/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/entry-stacks/.gradle/loom-cache/log4j.xml b/runtime-engine/entry-stacks/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/entry-stacks/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/entry-stacks/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/entry-stacks/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/entry-stacks/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/entry-types/.gradle/loom-cache/launch.cfg b/runtime-engine/entry-types/.gradle/loom-cache/launch.cfg deleted file mode 100644 index 8cad64e87..000000000 --- a/runtime-engine/entry-types/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/entry-types/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/entry-types/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/entry-types/.gradle/loom-cache/log4j.xml b/runtime-engine/entry-types/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/entry-types/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/entry-types/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/entry-types/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/entry-types/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/favorites/.gradle/loom-cache/launch.cfg b/runtime-engine/favorites/.gradle/loom-cache/launch.cfg deleted file mode 100644 index 56a02b4a3..000000000 --- a/runtime-engine/favorites/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/favorites/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/favorites/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/favorites/.gradle/loom-cache/log4j.xml b/runtime-engine/favorites/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/favorites/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/favorites/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/favorites/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/favorites/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/filtering-entries/.gradle/loom-cache/launch.cfg b/runtime-engine/filtering-entries/.gradle/loom-cache/launch.cfg deleted file mode 100644 index ac0975495..000000000 --- a/runtime-engine/filtering-entries/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/filtering-entries/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/filtering-entries/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/filtering-entries/.gradle/loom-cache/log4j.xml b/runtime-engine/filtering-entries/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/filtering-entries/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/filtering-entries/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/filtering-entries/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/filtering-entries/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/screens/.gradle/loom-cache/launch.cfg b/runtime-engine/screens/.gradle/loom-cache/launch.cfg deleted file mode 100644 index b68220278..000000000 --- a/runtime-engine/screens/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/screens/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/screens/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/screens/.gradle/loom-cache/log4j.xml b/runtime-engine/screens/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/screens/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/screens/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/screens/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/screens/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/search/.gradle/loom-cache/launch.cfg b/runtime-engine/search/.gradle/loom-cache/launch.cfg deleted file mode 100644 index 30b5dde0a..000000000 --- a/runtime-engine/search/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/search/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/search/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/search/.gradle/loom-cache/log4j.xml b/runtime-engine/search/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/search/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/search/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/search/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/search/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/subsets/.gradle/loom-cache/launch.cfg b/runtime-engine/subsets/.gradle/loom-cache/launch.cfg deleted file mode 100644 index 2851e515b..000000000 --- a/runtime-engine/subsets/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/subsets/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/subsets/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/subsets/.gradle/loom-cache/log4j.xml b/runtime-engine/subsets/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/subsets/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/subsets/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/subsets/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/subsets/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file diff --git a/runtime-engine/transfer-handlers/.gradle/loom-cache/launch.cfg b/runtime-engine/transfer-handlers/.gradle/loom-cache/launch.cfg deleted file mode 100644 index 05ff19d9c..000000000 --- a/runtime-engine/transfer-handlers/.gradle/loom-cache/launch.cfg +++ /dev/null @@ -1,14 +0,0 @@ -commonProperties - fabric.development=true - fabric.remapClasspathFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/transfer-handlers/.gradle/loom-cache/remapClasspath.txt - log4j.configurationFile=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/runtime-engine/transfer-handlers/.gradle/loom-cache/log4j.xml - log4j2.formatMsgNoLookups=true - fabric.log.disableAnsi=false -clientArgs - --assetIndex - 1.18.2-1.18 - --assetsDir - /home/shedaniel/.gradle/caches/fabric-loom/assets -clientProperties - java.library.path=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 - org.lwjgl.librarypath=/home/shedaniel/Documents/JavaCoding/RoughlyEnoughItems-117/.gradle/loom-cache/natives/1.18.2 \ No newline at end of file diff --git a/runtime-engine/transfer-handlers/.gradle/loom-cache/log4j.xml b/runtime-engine/transfer-handlers/.gradle/loom-cache/log4j.xml deleted file mode 100644 index c009f9fb4..000000000 --- a/runtime-engine/transfer-handlers/.gradle/loom-cache/log4j.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/runtime-engine/transfer-handlers/.gradle/loom-cache/remapClasspath.txt b/runtime-engine/transfer-handlers/.gradle/loom-cache/remapClasspath.txt deleted file mode 100644 index 01f75adc1..000000000 --- a/runtime-engine/transfer-handlers/.gradle/loom-cache/remapClasspath.txt +++ /dev/null @@ -1 +0,0 @@ -/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-mappings-parser/0.3.0+build.17/2f10540a290e382a7cd35c16ec3900046a4e252/tiny-mappings-parser-0.3.0+build.17.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/sponge-mixin/0.11.2+mixin.0.8.5/f4ae569d559b5e3244b67321945261d83ff7ad8e/sponge-mixin-0.11.2+mixin.0.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/tiny-remapper/0.8.1/d220c092cd1446d5f2668b53e71abe23a12cb8cf/tiny-remapper-0.8.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/access-widener/2.1.0/f62a27adbfd8ab4d4fa5681793039f2c0b177155/access-widener-2.1.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm/9.2/81a03f76019c67362299c40e0ba13405f5467bff/asm-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-analysis/9.2/7487dd756daf96cab9986e44b9d7bcb796a61c10/asm-analysis-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-commons/9.2/f4d7f0fc9054386f2893b602454d48e07d4fbead/asm-commons-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-tree/9.2/d96c99a30f5e1a19b0e609dbb19a44d8518ac01e/asm-tree-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.ow2.asm/asm-util/9.2/fbc178fc5ba3dab50fd7e8a5317b8b647c8e8946/asm-util-9.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/blocklist/1.0.10/5c685c5ffa94c4cd39496c7184c1d122e515ecef/blocklist-1.0.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/patchy/2.2.10/da05971b07cbb379d002cf7eaec6a2048211fefc/patchy-2.2.10.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.ibm.icu/icu4j/70.1/dfa3a1fbc55bf5db8c6e79fc0935ac7ab1202950/icu4j-70.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.15/49d94806b6e3dc933dacbd8acb0fdbab8ebd1e5d/commons-codec-1.15.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-compress/1.21/4ec95b60d4e86b5c95a0e919cb172a0af98011ef/commons-compress-1.21.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpclient/4.5.13/e5f6cae5ca7ecaac1ec2827a9e2d65ae2869cada/httpclient-4.5.13.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-logging/commons-logging/1.2/4bfc12adfe4842bf07b657f0369c4cb522955686/commons-logging-1.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpcore/4.4.14/9dd1a631c082d92ecd4bd8fd4cf55026c720a8c1/httpcore-4.4.14.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl/3.2.2/8ad6294407e15780b43e84929c40e4c5e997972e/lwjgl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-jemalloc/3.2.2/ee8e57a79300f78294576d87c4a587f8c99402e2/lwjgl-jemalloc-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-openal/3.2.2/2b772a102b0a11ee5f2109a5b136f4dc7c630827/lwjgl-openal-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-opengl/3.2.2/6ac5bb88b44c43ea195a570aab059f63da004cd8/lwjgl-opengl-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-glfw/3.2.2/d3ad4df38e400b8afba1de63f84338809399df5b/lwjgl-glfw-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-stb/3.2.2/3b8e6ebc5851dd3d17e37e5cadce2eff2a429f0f/lwjgl-stb-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.lwjgl/lwjgl-tinyfd/3.2.2/fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9/lwjgl-tinyfd-3.2.2.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/text2speech/1.12.4/1f618f522dbdd93218c270bcfd8f8dd84be31717/text2speech-1.12.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/logging/1.0.0/f6ca3b2eee0b80b384e8ed93d368faecb82dfb9b/logging-1.0.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.github.oshi/oshi-core/5.8.5/1d0ec654d820741327f5a9229d513732a4b7ce50/oshi-core-5.8.5.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna/5.10.0/7cf4c87dd802db50721db66947aa237d7ad09418/jna-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.java.dev.jna/jna-platform/5.10.0/fbed7d9669dba47714ad0d4f4454290a997aee69/jna-platform-5.10.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-api/1.8.0-beta4/83b0359d847ee053d745be7ec0d8e9e8a44304b4/slf4j-api-1.8.0-beta4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-slf4j18-impl/2.17.0/bd7f6c0b9224dd214afb4e684957e2349b529a8d/log4j-slf4j18-impl-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/javabridge/1.2.24/c876796229b2ef5120f186eab5acc870699d3b9/javabridge-1.2.24.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.sf.jopt-simple/jopt-simple/5.0.4/4fdac2fbe92dfad86aa6e9301736f6b4342a3f5c/jopt-simple-5.0.4.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/io.netty/netty-all/4.1.68.Final/b8266a3c93c1c051109f71d3449e5dcd5d60b333/netty-all-4.1.68.Final.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.commons/commons-lang3/3.12.0/c6842c86792ff03b9f1d1fe2aab8dc23aa6c6f0e/commons-lang3-3.12.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.11.0/a2503f302b11ebde7ebc3df41daebe0e4eea3689/commons-io-2.11.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/brigadier/1.0.18/c1ef1234282716483c92183f49bef47b1a89bfa9/brigadier-1.0.18.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/datafixerupper/4.1.27/a02c43824ce57c3f7a7d7e744f0d99a040398b5/datafixerupper-4.1.27.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.9/8a432c1d6825781e21a02db2e2c33c5fde2833b9/gson-2.8.9.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/com.mojang/authlib/3.3.39/289405e70c0917eaeac017f7fba9adb4427baa36/authlib-3.3.39.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/it.unimi.dsi/fastutil/8.5.6/76f95700418a68fbc4ac050525261f05dc681ca1/fastutil-8.5.6.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-api/2.17.0/bbd791e9c8c9421e45337c4fe0a10851c086e36c/log4j-api-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/org.apache.logging.log4j/log4j-core/2.17.0/fe6e7a32c1228884b9691a744f953a55d0dd8ead/log4j-core-2.17.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/cloth-config/6.2.57/51ec014dad95d65d070f9ef8a715966561998d3b/cloth-config-6.2.57.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/dev.architectury/architectury/4.5.75/aec16eaf48959ed6de2c446609dfa70ed8a8b4dd/architectury-4.5.75.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/me.shedaniel.cloth/basic-math/0.6.0/bcf71444d5a11d1ff0b70ded97c533ece0cea489/basic-math-0.6.0.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/modules-2/files-2.1/net.fabricmc/fabric-loader/0.13.3/a91fc6ea7a5e8c3140dfaf34aeadb43ce2f38fe2/fabric-loader-0.13.3.jar:/home/shedaniel/.gradle/caches/fabric-loom/1.18.2/minecraft-merged-intermediary.jar \ No newline at end of file From 9954713e457a5a5d80025432961b56ab0003bbb0 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Thu, 28 Jul 2022 01:39:41 +0800 Subject: [PATCH 04/20] More work on config module --- .../client/entry/filtering/FilteringRule.java | 34 ++++ .../shedaniel/rei/impl/ClientInternals.java | 9 + .../impl/client/config/ConfigManagerImpl.java | 59 ++---- .../impl/client/config/ConfigObjectImpl.java | 10 +- .../config/entries/RecipeScreenTypeEntry.java | 1 - .../config/entries/ReloadPluginsEntry.java | 0 .../UncertainDisplayViewingScreen.java | 6 +- .../gui/credits/CreditsEntryListWidget.java | 0 .../client/gui/credits/CreditsScreen.java | 0 .../FavoriteEntryTypeRegistryImpl.java | 4 +- .../favorites/FavoritesEntriesManager.java | 29 +-- ...ientInternals$FavoritesEntriesListProvider | 1 + .../entries/FilteringAddRuleScreen.java | 26 +-- .../entries/FilteringConfigEntries.java | 79 ++++++++ .../client/config/entries/FilteringEntry.java | 8 +- .../entries/FilteringRuleOptionsScreen.java | 23 ++- .../config/entries/FilteringRulesScreen.java | 24 +-- .../filtering/AbstractFilteringRule.java | 8 +- .../entry/filtering/FilteringCache.java | 5 +- .../entry/filtering/FilteringCacheImpl.java | 7 +- .../entry/filtering/FilteringContext.java | 1 - .../entry/filtering/FilteringContextType.java | 3 + .../entry/filtering/FilteringResult.java | 1 - .../client/entry/filtering/FilteringRule.java | 86 --------- .../filtering/FilteringRuleInternal.java | 18 ++ .../entry/filtering/FilteringRuleType.java | 54 ++++++ .../filtering/rules/ManualFilteringRule.java | 61 +----- .../rules/ManualFilteringRuleType.java | 58 ++++++ .../filtering/rules/SearchFilteringRule.java | 181 ++---------------- .../rules/SearchFilteringRuleType.java | 179 +++++++++++++++++ .../entry/type/PreFilteredEntryListImpl.java | 5 +- .../FilteredStacksVisibilityHandler.java | 3 + ...t.config.ConfigManagerInternal$SystemSetup | 1 + .../client/config/ConfigManagerInternal.java | 8 + .../rei/impl/client/gui/InternalTextures.java | 0 .../gui/screen/ConfigReloadingScreen.java | 0 36 files changed, 562 insertions(+), 430 deletions(-) create mode 100644 api/src/main/java/me/shedaniel/rei/api/client/entry/filtering/FilteringRule.java rename {runtime => runtime-engine/configs}/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java (100%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen => runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries}/UncertainDisplayViewingScreen.java (97%) rename {runtime => runtime-engine/configs}/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java (100%) rename {runtime => runtime-engine/configs}/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java (100%) create mode 100644 runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$FavoritesEntriesListProvider create mode 100644 runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringConfigEntries.java delete mode 100644 runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java create mode 100644 runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleInternal.java create mode 100644 runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleType.java create mode 100644 runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRuleType.java create mode 100644 runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java create mode 100644 runtime-engine/filtering-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.config.ConfigManagerInternal$SystemSetup rename {runtime => shared-internals}/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java (100%) rename {runtime => shared-internals}/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java (100%) diff --git a/api/src/main/java/me/shedaniel/rei/api/client/entry/filtering/FilteringRule.java b/api/src/main/java/me/shedaniel/rei/api/client/entry/filtering/FilteringRule.java new file mode 100644 index 000000000..cbc13636e --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/client/entry/filtering/FilteringRule.java @@ -0,0 +1,34 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.api.client.entry.filtering; + +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +@Environment(EnvType.CLIENT) +public interface FilteringRule { + boolean isManual(); +} diff --git a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java b/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java index 60c6399fd..df5e4938e 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java @@ -65,6 +65,7 @@ public final class ClientInternals { REIClientPlugin.class, UnaryOperator.identity()); private static final DelegatingFavoriteEntryProvider DELEGATE_FAVORITE_ENTRY = resolveService(DelegatingFavoriteEntryProvider.class); + private static final FavoritesEntriesListProvider FAVORITES_ENTRIES_LIST = resolveService(FavoritesEntriesListProvider.class); private static Function> favoriteEntryFromJson = (object) -> throwNotSetup(); private static Function clickAreaHandlerResult = (result) -> throwNotSetup(); private static BiConsumer, TooltipComponent> clientTooltipComponentProvider = (tooltip, result) -> throwNotSetup(); @@ -154,6 +155,10 @@ public static FavoriteEntry delegateFavoriteEntry(Supplier getFavoritesEntriesList() { + return FAVORITES_ENTRIES_LIST.get(); + } + public static DataResult favoriteEntryFromJson(CompoundTag tag) { return favoriteEntryFromJson.apply(tag); } @@ -221,4 +226,8 @@ public interface WidgetsProvider { public interface DelegatingFavoriteEntryProvider { FavoriteEntry delegate(Supplier> result, Supplier tag); } + + public interface FavoritesEntriesListProvider { + List get(); + } } diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java index 2970c5b62..df956d185 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java @@ -23,7 +23,6 @@ package me.shedaniel.rei.impl.client.config; -import com.google.common.collect.Lists; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.mojang.blaze3d.platform.InputConstants; @@ -51,6 +50,7 @@ import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry; import me.shedaniel.rei.api.client.config.entry.EntryStackProvider; +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.config.CheatingMode; import me.shedaniel.rei.api.client.gui.config.DisplayScreenType; @@ -58,14 +58,11 @@ import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; -import me.shedaniel.rei.impl.client.REIRuntimeImpl; +import me.shedaniel.rei.impl.Internals; import me.shedaniel.rei.impl.client.config.addon.ConfigAddonRegistryImpl; import me.shedaniel.rei.impl.client.config.entries.*; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule; import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.credits.CreditsScreen; import me.shedaniel.rei.impl.client.gui.performance.entry.PerformanceEntry; import me.shedaniel.rei.impl.common.InternalLogger; @@ -88,7 +85,6 @@ import java.lang.reflect.Field; import java.util.*; -import java.util.function.Consumer; import java.util.function.Supplier; import static me.shedaniel.autoconfig.util.Utils.getUnsafely; @@ -123,18 +119,9 @@ public ConfigManagerImpl() { guiRegistry.registerAnnotationProvider((i13n, field, config, defaults, guiProvider) -> Collections.singletonList(new SearchFilterSyntaxHighlightingEntry(new TranslatableComponent(i13n), getUnsafely(field, config, SyntaxHighlightingMode.COLORFUL), getUnsafely(field, defaults), type -> setUnsafely(field, config, type))) , (field) -> field.getType() == SyntaxHighlightingMode.class, ConfigObjectImpl.UseSpecialSearchFilterSyntaxHighlightingScreen.class); - guiRegistry.registerAnnotationProvider((i13n, field, config, defaults, guiProvider) -> { - List> value = CollectionUtils.map(Utils.>>getUnsafely(field, config, new ArrayList<>()), EntryStackProvider::provide); - List> defaultValue = CollectionUtils.map(Utils.>>getUnsafely(field, defaults), EntryStackProvider::provide); - Consumer>> saveConsumer = (newValue) -> { - setUnsafely(field, config, CollectionUtils.map(newValue, EntryStackProvider::ofStack)); - }; - return REIRuntime.getInstance().getPreviousContainerScreen() == null || Minecraft.getInstance().getConnection() == null || Minecraft.getInstance().getConnection().getRecipeManager() == null ? - Collections.singletonList(new NoFilteringEntry(220, value, defaultValue, saveConsumer)) - : - Collections.singletonList(new FilteringEntry(220, value, ((ConfigObjectImpl.Advanced.Filtering) config).filteringRules, defaultValue, saveConsumer, list -> ((ConfigObjectImpl.Advanced.Filtering) config).filteringRules = Lists.newArrayList(list))); - } - , (field) -> field.getType() == List.class, ConfigObjectImpl.UseFilteringScreen.class); + for (SystemSetup setup : Internals.resolveServices(SystemSetup.class)) { + setup.setup(guiRegistry); + } InternalLogger.getInstance().info("Config loaded"); saveConfig(); } @@ -234,32 +221,6 @@ private static Jankson buildJankson(Jankson.Builder builder) { } }); - // FilteringRule - builder.registerSerializer(FilteringRule.class, (value, marshaller) -> { - try { - return marshaller.serialize(FilteringRule.save(value, new CompoundTag())); - } catch (Exception e) { - e.printStackTrace(); - return JsonNull.INSTANCE; - } - }); - builder.registerDeserializer(Tag.class, FilteringRule.class, (value, marshaller) -> { - try { - return FilteringRule.read((CompoundTag) value); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - }); - builder.registerDeserializer(String.class, FilteringRule.class, (value, marshaller) -> { - try { - return FilteringRule.read(TagParser.parseTag(value)); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - }); - // FavoriteEntry builder.registerSerializer(FavoriteEntry.class, (value, marshaller) -> { try { @@ -282,6 +243,10 @@ private static Jankson buildJankson(Jankson.Builder builder) { } }); + for (SystemSetup setup : Internals.resolveServices(SystemSetup.class)) { + setup.setup(builder); + } + return builder.build(); } @@ -295,7 +260,7 @@ public static ConfigManagerImpl getInstance() { @Override public void saveConfig() { - if (getConfig().getFilteringRules().stream().noneMatch(filteringRule -> filteringRule instanceof ManualFilteringRule)) { + if (getConfig().getFilteringRules().stream().noneMatch(FilteringRule::isManual)) { getConfig().getFilteringRules().add(new ManualFilteringRule()); } AutoConfig.getConfigHolder(ConfigObjectImpl.class).registerLoadListener((configHolder, configObject) -> { @@ -427,8 +392,8 @@ public List narratables() { saveConfig(); EntryRegistry.getInstance().refilter(); REIRuntime.getInstance().getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); - if (REIRuntimeImpl.getSearchField() != null) { - ScreenOverlayImpl.getEntryListWidget().updateSearch(REIRuntimeImpl.getSearchField().getText(), true); + if (REIRuntime.getInstance().getSearchTextField() != null) { + REIRuntime.getInstance().getOverlay().ifPresent(ScreenOverlay::queueReloadSearch); } }).build(); }); diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java index d0b63a1ff..ae2008f0a 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java @@ -33,10 +33,10 @@ import me.shedaniel.clothconfig2.api.ModifierKeyCode; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.config.entry.EntryStackProvider; +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.config.*; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesEntriesManager; +import me.shedaniel.rei.impl.ClientInternals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -341,7 +341,7 @@ public boolean isLowerConfigButton() { @Override public List getFavoriteEntries() { - return FavoritesEntriesManager.INSTANCE.asListView(); + return ClientInternals.getFavoritesEntriesList(); } public List getConfigFavoriteEntries() { @@ -368,7 +368,7 @@ public boolean shouldFilterDisplays() { } @ApiStatus.Internal - public List> getFilteringRules() { + public List getFilteringRules() { return advanced.filtering.filteringRules; } @@ -652,7 +652,7 @@ public static class Miscellaneous { public static class Filtering { @UseFilteringScreen private List> filteredStacks = new ArrayList<>(); public boolean shouldFilterDisplays = true; - @ConfigEntry.Gui.Excluded public List> filteringRules = new ArrayList<>(); + @ConfigEntry.Gui.Excluded public List filteringRules = new ArrayList<>(); } } } diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java index bc37f2a35..514f8bd3f 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/RecipeScreenTypeEntry.java @@ -28,7 +28,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.gui.entries.TooltipListEntry; import me.shedaniel.rei.api.client.gui.config.DisplayScreenType; -import me.shedaniel.rei.impl.client.gui.screen.UncertainDisplayViewingScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.components.AbstractWidget; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java rename to runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/UncertainDisplayViewingScreen.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java rename to runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/UncertainDisplayViewingScreen.java index 8dc417dd5..96c3542c6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/UncertainDisplayViewingScreen.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/UncertainDisplayViewingScreen.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.screen; +package me.shedaniel.rei.impl.client.config.entries; import com.google.common.collect.Lists; import com.mojang.blaze3d.systems.RenderSystem; @@ -36,8 +36,6 @@ import me.shedaniel.clothconfig2.impl.EasingMethod; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.RoughlyEnoughItemsCore; -import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; @@ -148,8 +146,6 @@ public void init() { scroll.setTo(200, 450); } else if (allModsUsingJEI != null && jeiEnabled) { ConfigManagerInternal.getInstance().set("advanced.enableJeiCompatibilityLayer", jeiEnabled); - RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.clear(); - RoughlyEnoughItemsCoreClient.reloadPlugins(null, null); Minecraft.getInstance().setScreen(REIRuntime.getInstance().getPreviousScreen()); } else { callback.accept(original); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java rename to runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java rename to runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java diff --git a/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java index 39de487d9..6cd8ffb24 100644 --- a/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java +++ b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java @@ -107,8 +107,8 @@ public void startReload() { @Override public void endReload() { if (ConfigObject.getInstance().isFavoritesEnabled()) { - FavoritesEntriesManager.INSTANCE.getConfigFavoriteEntries().removeIf(FavoriteEntry::isInvalid); - FavoritesEntriesManager.INSTANCE.getConfigHiddenFavoriteEntries().removeIf(FavoriteEntry::isInvalid); + FavoritesEntriesManager.getConfigFavoriteEntries().removeIf(FavoriteEntry::isInvalid); + FavoritesEntriesManager.getConfigHiddenFavoriteEntries().removeIf(FavoriteEntry::isInvalid); ConfigManager.getInstance().saveConfig(); } diff --git a/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java index 2f92bc197..40f1de3a7 100644 --- a/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java +++ b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java @@ -30,6 +30,7 @@ import me.shedaniel.rei.api.client.overlay.OverlayListWidget; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.ClientInternals; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.favorites.MutableFavoritesList; @@ -40,25 +41,24 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -public class FavoritesEntriesManager { - public static final FavoritesEntriesManager INSTANCE = new FavoritesEntriesManager(); +public class FavoritesEntriesManager implements ClientInternals.FavoritesEntriesListProvider { - public List getConfigFavoriteEntries() { + public static List getConfigFavoriteEntries() { ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); return (List) manager.get("basics.favorites"); } - public List getConfigHiddenFavoriteEntries() { + public static List getConfigHiddenFavoriteEntries() { ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); return (List) manager.get("basics.hiddenFavorites"); } - private Stream getDefaultFavorites() { + private static Stream getDefaultFavorites() { return StreamSupport.stream(FavoriteEntryType.registry().sections().spliterator(), false) .flatMap(section -> section.getDefaultEntries().stream()); } - public List getFavorites() { + public static List getFavorites() { List defaultFavorites = getDefaultFavorites().collect(Collectors.toList()); defaultFavorites.removeAll(getConfigHiddenFavoriteEntries()); @@ -69,7 +69,7 @@ public List getFavorites() { return favorites; } - public void remove(FavoriteEntry entry) { + public static void remove(FavoriteEntry entry) { getConfigFavoriteEntries().remove(entry); if (getDefaultFavorites().anyMatch(e -> e.equals(entry)) && !getConfigHiddenFavoriteEntries().contains(entry)) { getConfigHiddenFavoriteEntries().add(entry); @@ -79,7 +79,7 @@ public void remove(FavoriteEntry entry) { REIRuntime.getInstance().getOverlay().flatMap(ScreenOverlay::getFavoritesList).ifPresent(OverlayListWidget::queueReloadSearch); } - public void add(FavoriteEntry entry) { + public static void add(FavoriteEntry entry) { List defaultFavorites = getDefaultFavorites().toList(); getConfigFavoriteEntries().remove(entry); @@ -103,7 +103,7 @@ public void add(FavoriteEntry entry) { REIRuntime.getInstance().getOverlay().flatMap(ScreenOverlay::getFavoritesList).ifPresent(OverlayListWidget::queueReloadSearch); } - public void setEntries(List entries) { + public static void setEntries(List entries) { List defaultFavorites = getDefaultFavorites().toList(); List hiddenDefaultFavorites = new ArrayList<>(defaultFavorites); hiddenDefaultFavorites.removeAll(entries); @@ -116,11 +116,12 @@ public void setEntries(List entries) { REIRuntime.getInstance().getOverlay().flatMap(ScreenOverlay::getFavoritesList).ifPresent(OverlayListWidget::queueReloadSearch); } - public List asListView() { + @Override + public List get() { return new ListView(); } - private class ListView extends AbstractList implements MutableFavoritesList { + private static class ListView extends AbstractList implements MutableFavoritesList { @Override public FavoriteEntry get(int index) { return getFavorites().get(index); @@ -133,13 +134,13 @@ public int size() { @Override public void add(int index, FavoriteEntry entry) { - FavoritesEntriesManager.this.add(entry); + FavoritesEntriesManager.add(entry); } @Override public boolean remove(Object o) { if (o instanceof FavoriteEntry) { - FavoritesEntriesManager.this.remove((FavoriteEntry) o); + FavoritesEntriesManager.remove((FavoriteEntry) o); return true; } else { return false; @@ -148,7 +149,7 @@ public boolean remove(Object o) { @Override public void setAll(List entries) { - FavoritesEntriesManager.this.setEntries(entries); + FavoritesEntriesManager.setEntries(entries); } } } diff --git a/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$FavoritesEntriesListProvider b/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$FavoritesEntriesListProvider new file mode 100644 index 000000000..6b97f7540 --- /dev/null +++ b/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$FavoritesEntriesListProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesEntriesManager \ No newline at end of file diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java index 61f16508f..abb5653ae 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java @@ -25,8 +25,10 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule; -import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleInternal; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleType; +import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRuleType; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -65,9 +67,9 @@ public void init() { })); } rulesList = addWidget(new RulesList(minecraft, width, height, 30, height, BACKGROUND_LOCATION)); - for (FilteringRule rule : FilteringRule.REGISTRY.values()) { - if (!(rule instanceof ManualFilteringRule)) - rulesList.addItem(new DefaultRuleEntry(parent, entry, rule.createNew(), null)); + for (FilteringRuleType type : FilteringRuleType.REGISTRY.values()) { + if (!(type instanceof ManualFilteringRuleType)) + rulesList.addItem(new DefaultRuleEntry(parent, entry, type.createNew(), null)); } rulesList.selectItem(rulesList.children().get(0)); } @@ -124,13 +126,13 @@ protected int getScrollbarPosition() { } public static abstract class RuleEntry extends DynamicElementListWidget.ElementEntry { - private final FilteringRule rule; + private final FilteringRuleInternal rule; - public RuleEntry(FilteringRule rule) { + public RuleEntry(FilteringRuleInternal rule) { this.rule = rule; } - public FilteringRule getRule() { + public FilteringRuleInternal getRule() { return rule; } @@ -149,9 +151,9 @@ public static class DefaultRuleEntry extends RuleEntry { private final Button addButton; private final BiFunction screenFunction; - public DefaultRuleEntry(Screen parent, FilteringEntry entry, FilteringRule rule, BiFunction screenFunction) { + public DefaultRuleEntry(Screen parent, FilteringEntry entry, FilteringRuleInternal rule, BiFunction screenFunction) { super(rule); - this.screenFunction = (screenFunction == null ? rule.createEntryScreen().orElse(null) : screenFunction); + this.screenFunction = (screenFunction == null ? rule.getType().createEntryScreen().orElse(null) : screenFunction); addButton = new Button(0, 0, 20, 20, Component.nullToEmpty(" + "), button -> { entry.edited = true; Minecraft.getInstance().setScreen(this.screenFunction.apply(entry, parent)); @@ -164,7 +166,7 @@ public DefaultRuleEntry(Screen parent, FilteringEntry entry, FilteringRule ru public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta) { Minecraft client = Minecraft.getInstance(); { - Component title = getRule().getTitle(); + Component title = getRule().getType().getTitle(); int i = client.font.width(title); if (i > entryWidth - 28) { FormattedText titleTrimmed = FormattedText.composite(client.font.substrByWidth(title, entryWidth - 28 - client.font.width("...")), FormattedText.of("...")); @@ -174,7 +176,7 @@ public void render(PoseStack matrices, int index, int y, int x, int entryWidth, } } { - Component subtitle = getRule().getSubtitle(); + Component subtitle = getRule().getType().getSubtitle(); int i = client.font.width(subtitle); if (i > entryWidth - 28) { FormattedText subtitleTrimmed = FormattedText.composite(client.font.substrByWidth(subtitle, entryWidth - 28 - client.font.width("...")), FormattedText.of("...")); diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringConfigEntries.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringConfigEntries.java new file mode 100644 index 000000000..cfb2ed8da --- /dev/null +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringConfigEntries.java @@ -0,0 +1,79 @@ +package me.shedaniel.rei.impl.client.config.entries; + +import com.google.common.collect.Lists; +import me.shedaniel.autoconfig.gui.registry.GuiRegistry; +import me.shedaniel.autoconfig.util.Utils; +import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.Jankson; +import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.JsonNull; +import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.entry.EntryStackProvider; +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleInternal; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleType; +import net.minecraft.client.Minecraft; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; +import net.minecraft.nbt.TagParser; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Consumer; + +import static me.shedaniel.autoconfig.util.Utils.setUnsafely; + +public class FilteringConfigEntries implements ConfigManagerInternal.SystemSetup { + @Override + public void setup(GuiRegistry registry) { + registry.registerPredicateProvider((i13n, field, config, defaults, guiProvider) -> { + List> value = CollectionUtils.map(Utils.>>getUnsafely(field, config, new ArrayList<>()), EntryStackProvider::provide); + List> defaultValue = CollectionUtils.map(Utils.>>getUnsafely(field, defaults), EntryStackProvider::provide); + Consumer>> saveConsumer = (newValue) -> { + setUnsafely(field, config, CollectionUtils.map(newValue, EntryStackProvider::ofStack)); + }; + try { + Field filteringRules = config.getClass().getDeclaredField("filteringRules"); + return REIRuntime.getInstance().getPreviousContainerScreen() == null || Minecraft.getInstance().getConnection() == null || Minecraft.getInstance().getConnection().getRecipeManager() == null ? + Collections.singletonList(new NoFilteringEntry(220, value, defaultValue, saveConsumer)) + : + Collections.singletonList(new FilteringEntry(220, value, Utils.getUnsafely(filteringRules, config), defaultValue, saveConsumer, list -> setUnsafely(filteringRules, config, Lists.newArrayList(list)))); + } catch (NoSuchFieldException e) { + throw new RuntimeException(e); + } + } + , (field) -> field.getType() == List.class && field.getName().equals("filteredStacks")); + } + + @Override + public void setup(Jankson.Builder builder) { + // FilteringRule + builder.registerSerializer(FilteringRule.class, (value, marshaller) -> { + try { + return marshaller.serialize(FilteringRuleType.save((FilteringRuleInternal) value, new CompoundTag())); + } catch (Exception e) { + e.printStackTrace(); + return JsonNull.INSTANCE; + } + }); + builder.registerDeserializer(Tag.class, FilteringRule.class, (value, marshaller) -> { + try { + return FilteringRuleType.read((CompoundTag) value); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + }); + builder.registerDeserializer(String.class, FilteringRule.class, (value, marshaller) -> { + try { + return FilteringRuleType.read(TagParser.parseTag(value)); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + }); + } +} diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java index 403f1e94d..12bc5dc00 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringEntry.java @@ -30,7 +30,7 @@ import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleInternal; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.components.AbstractWidget; @@ -47,10 +47,10 @@ public class FilteringEntry extends AbstractConfigListEntry>> { private int width; Consumer>> saveConsumer; - Consumer>> rulesSaveConsumer; + Consumer> rulesSaveConsumer; List> defaultValue; Set> configFiltered; - List> rules; + List rules; boolean edited = false; final FilteringScreen filteringScreen = new FilteringScreen(this); final FilteringRulesScreen filteringRulesScreen = new FilteringRulesScreen(this); @@ -60,7 +60,7 @@ public class FilteringEntry extends AbstractConfigListEntry>> }); private final List children = ImmutableList.of(buttonWidget); - public FilteringEntry(int width, List> configFiltered, List> rules, List> defaultValue, Consumer>> saveConsumer, Consumer>> rulesSaveConsumer) { + public FilteringEntry(int width, List> configFiltered, List rules, List> defaultValue, Consumer>> saveConsumer, Consumer> rulesSaveConsumer) { super(NarratorChatListener.NO_TITLE, false); this.width = width; this.configFiltered = new TreeSet<>(Comparator.comparing(EntryStacks::hashExact)); diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java index fac731ecf..8e471556e 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRuleOptionsScreen.java @@ -23,13 +23,12 @@ package me.shedaniel.rei.impl.client.config.entries; -import com.google.common.collect.Collections2; -import com.google.common.collect.Lists; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule; +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleInternal; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.EditBox; @@ -52,7 +51,7 @@ import java.util.function.Function; import java.util.function.Supplier; -public abstract class FilteringRuleOptionsScreen> extends Screen { +public abstract class FilteringRuleOptionsScreen extends Screen { private final FilteringEntry entry; private RulesList rulesList; Screen parent; @@ -124,13 +123,13 @@ protected int getScrollbarPosition() { } public static abstract class RuleEntry extends DynamicElementListWidget.ElementEntry { - private final FilteringRule rule; + private final FilteringRule rule; - public RuleEntry(FilteringRule rule) { + public RuleEntry(FilteringRule rule) { this.rule = rule; } - public FilteringRule getRule() { + public FilteringRule getRule() { return rule; } } @@ -138,7 +137,7 @@ public FilteringRule getRule() { public static class TextRuleEntry extends RuleEntry { private final FormattedCharSequence text; - public TextRuleEntry(FilteringRule rule, FormattedCharSequence text) { + public TextRuleEntry(FilteringRuleInternal rule, FormattedCharSequence text) { super(rule); this.text = text; } @@ -167,7 +166,7 @@ public List narratables() { public static class EmptyRuleEntry extends RuleEntry { private final int height; - public EmptyRuleEntry(FilteringRule rule, int height) { + public EmptyRuleEntry(FilteringRuleInternal rule, int height) { super(rule); this.height = height; } @@ -195,7 +194,7 @@ public List narratables() { public static class TextFieldRuleEntry extends RuleEntry { private final EditBox widget; - public TextFieldRuleEntry(int width, FilteringRule rule, Consumer widgetConsumer) { + public TextFieldRuleEntry(int width, FilteringRuleInternal rule, Consumer widgetConsumer) { super(rule); this.widget = new EditBox(Minecraft.getInstance().font, 0, 0, width, 18, Component.nullToEmpty("")); widgetConsumer.accept(widget); @@ -232,7 +231,7 @@ public static class BooleanRuleEntry extends RuleEntry { private boolean b; private final Button widget; - public BooleanRuleEntry(int width, boolean b, FilteringRule rule, Function textFunction) { + public BooleanRuleEntry(int width, boolean b, FilteringRuleInternal rule, Function textFunction) { super(rule); this.b = b; this.widget = new Button(0, 0, 100, 20, textFunction.apply(b), button -> { @@ -276,7 +275,7 @@ public static class SubRulesEntry extends RuleEntry { private boolean expanded; private Supplier name; - public SubRulesEntry(FilteringRule rule, Supplier name, List rules) { + public SubRulesEntry(FilteringRuleInternal rule, Supplier name, List rules) { super(rule); this.rules = rules; this.widget = new CategoryLabelWidget(); diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java index 0ed9f7129..419ccb036 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java @@ -26,8 +26,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule; -import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleInternal; +import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRuleType; import me.shedaniel.rei.impl.client.gui.InternalTextures; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; @@ -78,8 +78,8 @@ public void init() { } rulesList = addWidget(new RulesList(minecraft, width, height, 30, height, BACKGROUND_LOCATION)); for (int i = entry.rules.size() - 1; i >= 0; i--) { - FilteringRule rule = entry.rules.get(i); - if (rule instanceof ManualFilteringRule) + FilteringRuleInternal rule = entry.rules.get(i); + if (rule instanceof ManualFilteringRuleType) rulesList.addItem(new DefaultRuleEntry(rule, entry, (entry, screen) -> { entry.filteringScreen.parent = screen; return entry.filteringScreen; @@ -156,13 +156,13 @@ protected int getScrollbarPosition() { } public static abstract class RuleEntry extends DynamicElementListWidget.ElementEntry { - private final FilteringRule rule; + private final FilteringRuleInternal rule; - public RuleEntry(FilteringRule rule) { + public RuleEntry(FilteringRuleInternal rule) { this.rule = rule; } - public FilteringRule getRule() { + public FilteringRuleInternal getRule() { return rule; } @@ -182,9 +182,9 @@ public static class DefaultRuleEntry extends RuleEntry { private final Button deleteButton; private final BiFunction screenFunction; - public DefaultRuleEntry(FilteringRule rule, FilteringEntry entry, BiFunction screenFunction) { + public DefaultRuleEntry(FilteringRuleInternal rule, FilteringEntry entry, BiFunction screenFunction) { super(rule); - this.screenFunction = (screenFunction == null ? rule.createEntryScreen().orElse(null) : screenFunction); + this.screenFunction = (screenFunction == null ? rule.getType().createEntryScreen().orElse(null) : screenFunction); configureButton = new Button(0, 0, 20, 20, Component.nullToEmpty(null), button -> { entry.edited = true; Minecraft.getInstance().setScreen(this.screenFunction.apply(entry, Minecraft.getInstance().screen)); @@ -206,14 +206,14 @@ protected void renderBg(PoseStack matrices, Minecraft client, int mouseX, int mo }); } configureButton.active = this.screenFunction != null; - deleteButton.active = !(rule instanceof ManualFilteringRule); + deleteButton.active = !(rule instanceof ManualFilteringRuleType); } @Override public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta) { Minecraft client = Minecraft.getInstance(); { - Component title = getRule().getTitle(); + Component title = getRule().getType().getTitle(); int i = client.font.width(title); if (i > entryWidth - 28) { FormattedText titleTrimmed = FormattedText.composite(client.font.substrByWidth(title, entryWidth - 28 - client.font.width("...")), FormattedText.of("...")); @@ -223,7 +223,7 @@ public void render(PoseStack matrices, int index, int y, int x, int entryWidth, } } { - Component subtitle = getRule().getSubtitle(); + Component subtitle = getRule().getType().getSubtitle(); int i = client.font.width(subtitle); if (i > entryWidth - 28) { FormattedText subtitleTrimmed = FormattedText.composite(client.font.substrByWidth(subtitle, entryWidth - 28 - client.font.width("...")), FormattedText.of("...")); diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/AbstractFilteringRule.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/AbstractFilteringRule.java index 4ab670fbc..0035c4054 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/AbstractFilteringRule.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/AbstractFilteringRule.java @@ -23,11 +23,12 @@ package me.shedaniel.rei.impl.client.entry.filtering; +import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @Environment(EnvType.CLIENT) -public abstract class AbstractFilteringRule> implements FilteringRule { +public abstract class AbstractFilteringRule implements FilteringRuleInternal { @Override public boolean equals(Object obj) { return getClass() == obj.getClass(); @@ -37,4 +38,9 @@ public boolean equals(Object obj) { public int hashCode() { return getClass().hashCode(); } + + @Override + public boolean isManual() { + return this instanceof ManualFilteringRule; + } } diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java index 388652210..bb80560f6 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCache.java @@ -23,9 +23,12 @@ package me.shedaniel.rei.impl.client.entry.filtering; +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +@ApiStatus.Experimental public interface FilteringCache { @Nullable - Object getCache(FilteringRule rule); + Object getCache(FilteringRule rule); } diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCacheImpl.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCacheImpl.java index 6befc1b5d..5c62631b1 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCacheImpl.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringCacheImpl.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.client.entry.filtering; +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; import org.jetbrains.annotations.Nullable; import java.util.HashMap; @@ -30,15 +31,15 @@ import java.util.Optional; public class FilteringCacheImpl implements FilteringCache { - private final Map, Optional> CACHE = new HashMap<>(); + private final Map> CACHE = new HashMap<>(); @Override @Nullable - public Object getCache(FilteringRule rule) { + public Object getCache(FilteringRule rule) { return CACHE.getOrDefault(rule, Optional.empty()).orElse(null); } - public void setCache(FilteringRule rule, @Nullable Object value) { + public void setCache(FilteringRule rule, @Nullable Object value) { CACHE.put(rule, Optional.ofNullable(value)); } } diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java index 59b2ce647..aa19e89b1 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContext.java @@ -28,7 +28,6 @@ import java.util.Collection; -@ApiStatus.Internal @ApiStatus.Experimental public interface FilteringContext { Collection> getStacks(FilteringContextType type); diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextType.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextType.java index 0c69dc0e9..b9e00cd88 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextType.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringContextType.java @@ -23,6 +23,9 @@ package me.shedaniel.rei.impl.client.entry.filtering; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental public enum FilteringContextType { SHOWN, DEFAULT, diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResult.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResult.java index 55fb39f01..71d768511 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResult.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringResult.java @@ -36,7 +36,6 @@ import java.util.Set; @Environment(EnvType.CLIENT) -@ApiStatus.Internal @ApiStatus.Experimental public interface FilteringResult { static FilteringResult create() { diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java deleted file mode 100644 index e18d2e4ea..000000000 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.entry.filtering; - -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import me.shedaniel.rei.impl.client.config.entries.FilteringEntry; -import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; -import me.shedaniel.rei.impl.client.entry.filtering.rules.SearchFilteringRule; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.Util; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.ApiStatus; - -import java.util.Optional; -import java.util.function.BiFunction; - -@ApiStatus.Internal -@ApiStatus.Experimental -@Environment(EnvType.CLIENT) -public interface FilteringRule> { - BiMap> REGISTRY = Util.make(HashBiMap.create(), registry -> { - registry.put(new ResourceLocation("roughlyenoughitems", "search"), new SearchFilteringRule()); - registry.put(new ResourceLocation("roughlyenoughitems", "manual"), new ManualFilteringRule()); - }); - - static CompoundTag save(FilteringRule rule, CompoundTag tag) { - tag.putString("id", REGISTRY.inverse().get(rule).toString()); - tag.put("rule", rule.save(new CompoundTag())); - return tag; - } - - static FilteringRule read(CompoundTag tag) { - return REGISTRY.get(ResourceLocation.tryParse(tag.getString("id"))).createFromTag(tag.getCompound("rule")); - } - - CompoundTag save(CompoundTag tag); - - T createFromTag(CompoundTag tag); - - FilteringResult processFilteredStacks(FilteringContext context, FilteringCache cache, boolean async); - - @ApiStatus.Internal - default Optional> createEntryScreen() { - return Optional.empty(); - } - - default Component getTitle() { - return Component.nullToEmpty(FilteringRule.REGISTRY.inverse().get(this).toString()); - } - - default Component getSubtitle() { - return Component.nullToEmpty(null); - } - - default Object prepareCache(boolean async) { - return null; - } - - T createNew(); -} diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleInternal.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleInternal.java new file mode 100644 index 000000000..ab5dd38f3 --- /dev/null +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleInternal.java @@ -0,0 +1,18 @@ +package me.shedaniel.rei.impl.client.entry.filtering; + +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +@Environment(EnvType.CLIENT) +public interface FilteringRuleInternal extends FilteringRule { + FilteringRuleType getType(); + + default Object prepareCache(boolean async) { + return null; + } + + FilteringResult processFilteredStacks(FilteringContext context, FilteringCache cache, boolean async); +} diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleType.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleType.java new file mode 100644 index 000000000..6a7d76937 --- /dev/null +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleType.java @@ -0,0 +1,54 @@ +package me.shedaniel.rei.impl.client.entry.filtering; + +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; +import me.shedaniel.rei.impl.client.config.entries.FilteringEntry; +import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRuleType; +import me.shedaniel.rei.impl.client.entry.filtering.rules.SearchFilteringRuleType; +import net.minecraft.Util; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.ApiStatus; + +import java.util.Optional; +import java.util.function.BiFunction; + +@ApiStatus.Experimental +public interface FilteringRuleType { + BiMap> REGISTRY = Util.make(HashBiMap.create(), registry -> { + registry.put(new ResourceLocation("roughlyenoughitems", "search"), SearchFilteringRuleType.INSTANCE); + registry.put(new ResourceLocation("roughlyenoughitems", "manual"), ManualFilteringRuleType.INSTANCE); + }); + + static CompoundTag save(FilteringRuleInternal rule, CompoundTag tag) { + tag.putString("id", REGISTRY.inverse().get(rule.getType()).toString()); + tag.put("rule", ((FilteringRuleType) rule.getType()).saveTo(rule, new CompoundTag())); + return tag; + } + + CompoundTag saveTo(T rule, CompoundTag tag); + + static FilteringRule read(CompoundTag tag) { + return REGISTRY.get(ResourceLocation.tryParse(tag.getString("id"))).createFromTag(tag.getCompound("rule")); + } + + T createFromTag(CompoundTag tag); + + @ApiStatus.Internal + default Optional> createEntryScreen() { + return Optional.empty(); + } + + default Component getTitle() { + return Component.nullToEmpty(FilteringRuleType.REGISTRY.inverse().get(this).toString()); + } + + default Component getSubtitle() { + return Component.nullToEmpty(null); + } + + T createNew(); +} diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java index d960a9834..7fe5a684b 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java @@ -1,26 +1,3 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.entry.filtering.rules; import com.google.common.collect.Lists; @@ -28,16 +5,14 @@ import it.unimi.dsi.fastutil.longs.LongSet; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.config.entry.EntryStackProvider; -import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.client.entry.filtering.AbstractFilteringRule; import me.shedaniel.rei.impl.client.entry.filtering.FilteringCache; import me.shedaniel.rei.impl.client.entry.filtering.FilteringContext; import me.shedaniel.rei.impl.client.entry.filtering.FilteringResult; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TranslatableComponent; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleType; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.api.common.util.EntryStacks; +import me.shedaniel.rei.impl.client.entry.filtering.*; import java.util.Collection; import java.util.List; @@ -47,15 +22,10 @@ import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; -public class ManualFilteringRule extends AbstractFilteringRule { - @Override - public CompoundTag save(CompoundTag tag) { - return tag; - } - +public class ManualFilteringRule extends AbstractFilteringRule { @Override - public ManualFilteringRule createFromTag(CompoundTag tag) { - return new ManualFilteringRule(); + public FilteringRuleType getType() { + return ManualFilteringRuleType.INSTANCE; } @Override @@ -103,19 +73,4 @@ public FilteringResult processFilteredStacks(FilteringContext context, Filtering private void processList(Collection> stacks, FilteringResult result, boolean async, LongSet filteredStacks) { result.hide((async ? stacks.parallelStream() : stacks.stream()).filter(stack -> filteredStacks.contains(EntryStacks.hashExact(stack))).collect(Collectors.toList())); } - - @Override - public Component getTitle() { - return new TranslatableComponent("rule.roughlyenoughitems.filtering.manual"); - } - - @Override - public Component getSubtitle() { - return new TranslatableComponent("rule.roughlyenoughitems.filtering.manual.subtitle"); - } - - @Override - public ManualFilteringRule createNew() { - throw new UnsupportedOperationException(); - } } diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRuleType.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRuleType.java new file mode 100644 index 000000000..c98525816 --- /dev/null +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRuleType.java @@ -0,0 +1,58 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.entry.filtering.rules; + +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleType; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; + +public class ManualFilteringRuleType implements FilteringRuleType { + public static final ManualFilteringRuleType INSTANCE = new ManualFilteringRuleType(); + + @Override + public CompoundTag saveTo(ManualFilteringRule rule, CompoundTag tag) { + return tag; + } + + @Override + public ManualFilteringRule createFromTag(CompoundTag tag) { + return new ManualFilteringRule(); + } + + @Override + public Component getTitle() { + return new TranslatableComponent("rule.roughlyenoughitems.filtering.manual"); + } + + @Override + public Component getSubtitle() { + return new TranslatableComponent("rule.roughlyenoughitems.filtering.manual.subtitle"); + } + + @Override + public ManualFilteringRule createNew() { + throw new UnsupportedOperationException(); + } +} diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java index 06ff75f53..d9d35677a 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java @@ -1,76 +1,30 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.entry.filtering.rules; import com.google.common.base.Suppliers; import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.client.gui.widgets.Slot; -import me.shedaniel.rei.api.client.gui.widgets.Widgets; -import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringCache; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringContext; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringResult; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleType; import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.config.entries.FilteringEntry; -import me.shedaniel.rei.impl.client.config.entries.FilteringRuleOptionsScreen; -import me.shedaniel.rei.impl.client.entry.filtering.AbstractFilteringRule; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringCache; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringContext; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringResult; -import me.shedaniel.rei.impl.client.gui.widget.BatchedEntryRendererManager; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.ChatFormatting; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.gui.narration.NarratableEntry; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TranslatableComponent; +import me.shedaniel.rei.impl.client.entry.filtering.*; import net.minecraft.util.StringUtil; -import java.util.*; +import java.util.Collection; +import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; import java.util.function.Supplier; -import java.util.stream.Collectors; - -import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; -@Environment(EnvType.CLIENT) -public class SearchFilteringRule extends AbstractFilteringRule { - private String filterStr; - private Supplier filter; - private boolean show; +public class SearchFilteringRule extends AbstractFilteringRule { + String filterStr; + Supplier filter; + boolean show; public SearchFilteringRule() { } @@ -86,17 +40,8 @@ public void setFilter(String filter) { } @Override - public CompoundTag save(CompoundTag tag) { - tag.putString("filter", filterStr); - tag.putBoolean("show", show); - return tag; - } - - @Override - public SearchFilteringRule createFromTag(CompoundTag tag) { - String filter = tag.getString("filter"); - boolean show = tag.getBoolean("show"); - return new SearchFilteringRule(filter, show); + public FilteringRuleType getType() { + return SearchFilteringRuleType.INSTANCE; } @Override @@ -124,11 +69,6 @@ public FilteringResult processFilteredStacks(FilteringContext context, Filtering return result; } - @Override - public SearchFilteringRule createNew() { - return new SearchFilteringRule("", false); - } - private void processList(Collection> stacks, List>>> completableFutures) { for (Iterable> partitionStacks : CollectionUtils.partition((List>) stacks, 100)) { completableFutures.add(CompletableFuture.supplyAsync(() -> { @@ -142,99 +82,4 @@ private void processList(Collection> stacks, List> createEntryScreen() { - return Optional.of((entry, screen) -> new FilteringRuleOptionsScreen(entry, this, screen) { - TextFieldRuleEntry entry = null; - BooleanRuleEntry show = null; - List entryStacks = new ArrayList<>(); - - @Override - public void addEntries(Consumer entryConsumer) { - addEmpty(entryConsumer, 10); - addText(entryConsumer, new TranslatableComponent("rule.roughlyenoughitems.filtering.search.filter").withStyle(ChatFormatting.GRAY)); - entryConsumer.accept(entry = new TextFieldRuleEntry(width - 36, rule, widget -> { - widget.setMaxLength(9999); - widget.setResponder(searchTerm -> { - SearchFilter filter = SearchProvider.getInstance().createFilter(searchTerm); - entryStacks = EntryRegistry.getInstance().getEntryStacks().parallel() - .filter(filter) - .map(EntryStack::normalize) - .map(stack -> Widgets.createSlot(new Rectangle(0, 0, 18,18)).disableBackground().entry(stack)) - .collect(Collectors.toList()); - }); - if (entry != null) widget.setValue(entry.getWidget().getValue()); - else widget.setValue(rule.filterStr); - })); - addEmpty(entryConsumer, 10); - addText(entryConsumer, new TranslatableComponent("rule.roughlyenoughitems.filtering.search.show").withStyle(ChatFormatting.GRAY)); - Function function = bool -> { - return new TranslatableComponent("rule.roughlyenoughitems.filtering.search.show." + bool); - }; - entryConsumer.accept(show = new BooleanRuleEntry(width - 36, show == null ? rule.show : show.getBoolean(), rule, function)); - addEmpty(entryConsumer, 10); - entryConsumer.accept(new SubRulesEntry(rule, () -> function.apply(show == null ? rule.show : show.getBoolean()), - Collections.singletonList(new EntryStacksRuleEntry(rule, () -> entryStacks, entry, show)))); - } - - @Override - public void save() { - rule.setFilter(entry.getWidget().getValue()); - rule.show = show.getBoolean(); - } - }); - } - - public static class EntryStacksRuleEntry extends FilteringRuleOptionsScreen.RuleEntry { - private final Supplier> entryStacks; - private int totalHeight; - - public EntryStacksRuleEntry(SearchFilteringRule rule, Supplier> entryStacks, FilteringRuleOptionsScreen.TextFieldRuleEntry entry, FilteringRuleOptionsScreen.BooleanRuleEntry show) { - super(rule); - this.entryStacks = entryStacks; - } - - @Override - public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta) { - BatchedEntryRendererManager manager = new BatchedEntryRendererManager(); - int entrySize = EntryListWidget.entrySize(); - int width = entryWidth / entrySize; - int i = 0; - for (Slot stack : entryStacks.get()) { - stack.getBounds().setLocation(x + (i % width) * entrySize, y + (i / width) * entrySize); - if (stack.getBounds().getMaxY() >= 0 && stack.getBounds().getY() <= Minecraft.getInstance().getWindow().getGuiScaledHeight()) { - manager.add(stack); - } - i++; - } - manager.render(matrices, mouseX, mouseY, delta); - totalHeight = (i / width + 1) * entrySize; - } - - @Override - public int getItemHeight() { - return totalHeight; - } - - @Override - public List narratables() { - return Lists.newArrayList(); - } - - @Override - public List children() { - return Lists.newArrayList(); - } - } } diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java new file mode 100644 index 000000000..1fece30f3 --- /dev/null +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java @@ -0,0 +1,179 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.entry.filtering.rules; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.widgets.Slot; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; +import me.shedaniel.rei.api.client.search.SearchFilter; +import me.shedaniel.rei.api.client.search.SearchProvider; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.impl.client.config.entries.FilteringEntry; +import me.shedaniel.rei.impl.client.config.entries.FilteringRuleOptionsScreen; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleType; +import me.shedaniel.rei.impl.client.gui.widget.BatchedEntryRendererManager; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.ChatFormatting; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TranslatableComponent; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; + +@Environment(EnvType.CLIENT) +public class SearchFilteringRuleType implements FilteringRuleType { + public static final SearchFilteringRuleType INSTANCE = new SearchFilteringRuleType(); + + @Override + public CompoundTag saveTo(SearchFilteringRule rule, CompoundTag tag) { + tag.putString("filter", rule.filterStr); + tag.putBoolean("show", rule.show); + return tag; + } + + @Override + public SearchFilteringRule createFromTag(CompoundTag tag) { + String filter = tag.getString("filter"); + boolean show = tag.getBoolean("show"); + return new SearchFilteringRule(filter, show); + } + + @Override + public SearchFilteringRule createNew() { + return new SearchFilteringRule("", false); + } + + @Override + public Component getTitle() { + return new TranslatableComponent("rule.roughlyenoughitems.filtering.search"); + } + + @Override + public Component getSubtitle() { + return new TranslatableComponent("rule.roughlyenoughitems.filtering.search.subtitle"); + } + + @Override + public Optional> createEntryScreen() { + return Optional.of((entry, screen) -> new FilteringRuleOptionsScreen(entry, this, screen) { + TextFieldRuleEntry entry = null; + BooleanRuleEntry show = null; + List entryStacks = new ArrayList<>(); + + @Override + public void addEntries(Consumer entryConsumer) { + addEmpty(entryConsumer, 10); + addText(entryConsumer, new TranslatableComponent("rule.roughlyenoughitems.filtering.search.filter").withStyle(ChatFormatting.GRAY)); + entryConsumer.accept(entry = new TextFieldRuleEntry(width - 36, rule, widget -> { + widget.setMaxLength(9999); + widget.setResponder(searchTerm -> { + SearchFilter filter = SearchProvider.getInstance().createFilter(searchTerm); + entryStacks = EntryRegistry.getInstance().getEntryStacks().parallel() + .filter(filter) + .map(EntryStack::normalize) + .map(stack -> Widgets.createSlot(new Rectangle(0, 0, 18, 18)).disableBackground().entry(stack)) + .collect(Collectors.toList()); + }); + if (entry != null) widget.setValue(entry.getWidget().getValue()); + else widget.setValue(rule.filterStr); + })); + addEmpty(entryConsumer, 10); + addText(entryConsumer, new TranslatableComponent("rule.roughlyenoughitems.filtering.search.show").withStyle(ChatFormatting.GRAY)); + Function function = bool -> { + return new TranslatableComponent("rule.roughlyenoughitems.filtering.search.show." + bool); + }; + entryConsumer.accept(show = new BooleanRuleEntry(width - 36, show == null ? rule.show : show.getBoolean(), rule, function)); + addEmpty(entryConsumer, 10); + entryConsumer.accept(new SubRulesEntry(rule, () -> function.apply(show == null ? rule.show : show.getBoolean()), + Collections.singletonList(new EntryStacksRuleEntry(rule, () -> entryStacks, entry, show)))); + } + + @Override + public void save() { + rule.setFilter(entry.getWidget().getValue()); + rule.show = show.getBoolean(); + } + }); + } + + public static class EntryStacksRuleEntry extends FilteringRuleOptionsScreen.RuleEntry { + private final Supplier> entryStacks; + private int totalHeight; + + public EntryStacksRuleEntry(SearchFilteringRule rule, Supplier> entryStacks, FilteringRuleOptionsScreen.TextFieldRuleEntry entry, FilteringRuleOptionsScreen.BooleanRuleEntry show) { + super(rule); + this.entryStacks = entryStacks; + } + + @Override + public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta) { + BatchedEntryRendererManager manager = new BatchedEntryRendererManager(); + int entrySize = EntryListWidget.entrySize(); + int width = entryWidth / entrySize; + int i = 0; + for (Slot stack : entryStacks.get()) { + stack.getBounds().setLocation(x + (i % width) * entrySize, y + (i / width) * entrySize); + if (stack.getBounds().getMaxY() >= 0 && stack.getBounds().getY() <= Minecraft.getInstance().getWindow().getGuiScaledHeight()) { + manager.add(stack); + } + i++; + } + manager.render(matrices, mouseX, mouseY, delta); + totalHeight = (i / width + 1) * entrySize; + } + + @Override + public int getItemHeight() { + return totalHeight; + } + + @Override + public List narratables() { + return Lists.newArrayList(); + } + + @Override + public List children() { + return Lists.newArrayList(); + } + } +} diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java index 109b39dfa..29c212350 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java @@ -39,7 +39,8 @@ import me.shedaniel.rei.impl.client.entry.filtering.FilteringCacheImpl; import me.shedaniel.rei.impl.client.entry.filtering.FilteringContextImpl; import me.shedaniel.rei.impl.client.entry.filtering.FilteringContextType; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule; +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleType; import me.shedaniel.rei.impl.common.InternalLogger; import me.shedaniel.rei.impl.common.util.HashedEntryStackWrapper; import org.apache.commons.lang3.mutable.MutableLong; @@ -146,7 +147,7 @@ public void onReFilter(List> stacks) { FilteringRule rule = rules.get(i); cache.setCache(rule, rule.prepareCache(true)); context.handleResult(rule.processFilteredStacks(context, cache, true)); - InternalLogger.getInstance().debug("Refiltered rule [%s] in %s.", FilteringRule.REGISTRY.inverse().get(rule).toString(), innerStopwatch.stop().toString()); + InternalLogger.getInstance().debug("Refiltered rule [%s] in %s.", FilteringRuleType.REGISTRY.inverse().get(rule).toString(), innerStopwatch.stop().toString()); } Set hiddenStacks = context.stacks.get(FilteringContextType.HIDDEN); diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java index a85e6b6a8..9618e9171 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java @@ -29,6 +29,9 @@ import it.unimi.dsi.fastutil.objects.Reference2BooleanMaps; import it.unimi.dsi.fastutil.objects.Reference2BooleanOpenHashMap; import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringCache; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringContextType; +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; diff --git a/runtime-engine/filtering-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.config.ConfigManagerInternal$SystemSetup b/runtime-engine/filtering-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.config.ConfigManagerInternal$SystemSetup new file mode 100644 index 000000000..5815b20d8 --- /dev/null +++ b/runtime-engine/filtering-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.config.ConfigManagerInternal$SystemSetup @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.config.entries.FilteringConfigEntries \ No newline at end of file diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerInternal.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerInternal.java index 48d2aec3b..16863185c 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerInternal.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerInternal.java @@ -23,6 +23,8 @@ package me.shedaniel.rei.impl.client.config; +import me.shedaniel.autoconfig.gui.registry.GuiRegistry; +import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.Jankson; import me.shedaniel.rei.api.client.config.ConfigManager; import org.jetbrains.annotations.ApiStatus; @@ -38,4 +40,10 @@ static ConfigManagerInternal getInstance() { Object get(String fieldKey); boolean set(String fieldKey, Object value); + + interface SystemSetup { + default void setup(Jankson.Builder builder) {} + + default void setup(GuiRegistry registry) {} + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java rename to shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java rename to shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java From 8f5d3ef632f3d1a733c98ce5607c9fd5a0fd7567 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 31 Jul 2022 21:37:58 +0800 Subject: [PATCH 05/20] Add reload all to the api --- .../rei/api/common/plugins/PluginManager.java | 4 + .../java/me/shedaniel/rei/impl/Internals.java | 5 ++ .../impl/client/config/ConfigManagerImpl.java | 80 +++++++++---------- .../config/entries/ReloadPluginsEntry.java | 5 +- .../shedaniel/rei/RoughlyEnoughItemsCore.java | 24 ++++-- .../rei/RoughlyEnoughItemsCoreClient.java | 24 ++---- 6 files changed, 77 insertions(+), 65 deletions(-) diff --git a/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginManager.java b/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginManager.java index a5b84b570..f135fded3 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginManager.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginManager.java @@ -63,6 +63,10 @@ static boolean areAnyReloading() { return CollectionUtils.anyMatch(getActiveInstances(), PluginManager::isReloading); } + static void reloadAll() { + Internals.reloadREI(); + } + boolean isReloading(); > T get(Class reloadableClass); diff --git a/api/src/main/java/me/shedaniel/rei/impl/Internals.java b/api/src/main/java/me/shedaniel/rei/impl/Internals.java index dd24614e6..d5ad63e1b 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/Internals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/Internals.java @@ -62,6 +62,7 @@ public final class Internals { private static final NbtHasherProvider NBT_HASHER_PROVIDER = resolveService(NbtHasherProvider.class); private static final CategoryIdentifierConstructor CATEGORY_IDENTIFIER_CONSTRUCTOR = resolveService(CategoryIdentifierConstructor.class); private static Supplier logger = Internals::throwNotSetup; + private static Runnable reloadREI = Internals::throwNotSetup; private static T throwNotSetup() { throw new AssertionError("REI Internals have not been initialized!"); @@ -141,6 +142,10 @@ public static InternalLogger getInternalLogger() { return logger.get(); } + public static void reloadREI() { + reloadREI.run(); + } + public interface EntryStackProvider { EntryStack empty(); diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java index df956d185..25c4aeb16 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java @@ -289,48 +289,9 @@ public void toggleCraftableOnly() { craftableOnly = !craftableOnly; } - @SuppressWarnings("deprecation") + @SuppressWarnings({"deprecation", "rawtypes", "UnstableApiUsage"}) @Override public Screen getConfigScreen(Screen parent) { - class EmptyEntry extends AbstractConfigListEntry { - private final int height; - - public EmptyEntry(int height) { - super(new TextComponent(UUID.randomUUID().toString()), false); - this.height = height; - } - - public int getItemHeight() { - return this.height; - } - - public Object getValue() { - return null; - } - - public Optional getDefaultValue() { - return Optional.empty(); - } - - public boolean isMouseInside(int mouseX, int mouseY, int x, int y, int entryWidth, int entryHeight) { - return false; - } - - public void save() { - } - - public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta) { - } - - public List children() { - return Collections.emptyList(); - } - - public List narratables() { - return Collections.emptyList(); - } - } - try { ConfigScreenProvider provider = (ConfigScreenProvider) AutoConfig.getConfigScreen(ConfigObjectImpl.class, parent); provider.setI13nFunction(manager -> "config.roughlyenoughitems"); @@ -404,6 +365,45 @@ public List narratables() { return null; } + private static class EmptyEntry extends AbstractConfigListEntry { + private final int height; + + public EmptyEntry(int height) { + super(new TextComponent(UUID.randomUUID().toString()), false); + this.height = height; + } + + public int getItemHeight() { + return this.height; + } + + public Object getValue() { + return null; + } + + public Optional getDefaultValue() { + return Optional.empty(); + } + + public boolean isMouseInside(int mouseX, int mouseY, int x, int y, int entryWidth, int entryHeight) { + return false; + } + + public void save() { + } + + public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta) { + } + + public List children() { + return Collections.emptyList(); + } + + public List narratables() { + return Collections.emptyList(); + } + } + @Override public Object get(String fieldKey) { Pair, Field> pair = locateField(fieldKey); diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java index 45ab4ef4e..64da5ac42 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java @@ -27,8 +27,6 @@ import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; -import me.shedaniel.rei.RoughlyEnoughItemsCore; -import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.impl.client.gui.screen.ConfigReloadingScreen; @@ -50,8 +48,7 @@ public class ReloadPluginsEntry extends AbstractConfigListEntry { private int width; private AbstractWidget reloadPluginsButton = new Button(0, 0, 0, 20, NarratorChatListener.NO_TITLE, button -> { - RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.clear(); - RoughlyEnoughItemsCoreClient.reloadPlugins(null, null); + PluginManager.reloadAll(); }) { @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index 1cda29bf3..3e7bba901 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -27,7 +27,6 @@ import dev.architectury.registry.ReloadListenerRegistry; import dev.architectury.utils.Env; import dev.architectury.utils.EnvExecutor; -import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.annotation.Nullable; import me.shedaniel.rei.api.common.display.DisplaySerializerRegistry; import me.shedaniel.rei.api.common.entry.comparison.FluidComparatorRegistry; import me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry; @@ -40,6 +39,7 @@ import me.shedaniel.rei.api.common.registry.ReloadStage; import me.shedaniel.rei.api.common.transfer.info.MenuInfoRegistry; import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.InternalLogger; import me.shedaniel.rei.impl.common.logging.performance.PerformanceLogger; import me.shedaniel.rei.impl.common.logging.performance.PerformanceLoggerImpl; import me.shedaniel.rei.impl.init.PluginDetector; @@ -47,6 +47,7 @@ import net.minecraft.util.Unit; import org.apache.commons.lang3.mutable.MutableLong; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import java.util.List; @@ -71,6 +72,7 @@ public static void attachCommonInternals() { PluginManager.getInstance().registerReloadable(DisplaySerializerRegistry.class); PluginManager.getInstance().registerReloadable(FluidSupportProvider.class); PluginManager.getServerInstance().registerReloadable(MenuInfoRegistry.class); + Internals.attachInstanceSupplier((Runnable) () -> RoughlyEnoughItemsCore.reloadPlugins(null, null), "reloadREI"); } public static void _reloadPlugins(@Nullable ReloadStage stage) { @@ -95,6 +97,21 @@ public static void _reloadPlugins(@Nullable ReloadStage stage) { } } + public static void reloadPlugins(MutableLong lastReload, @Nullable ReloadStage start) { + if (lastReload != null) { + if (lastReload.getValue() > 0 && System.currentTimeMillis() - lastReload.getValue() <= 5000) { + InternalLogger.getInstance().warn("Suppressing Reload Plugins of stage " + start); + return; + } + lastReload.setValue(System.currentTimeMillis()); + } + if (start == null) PERFORMANCE_LOGGER.clear(); + if (Platform.getEnvironment() == Env.CLIENT) { + if (RoughlyEnoughItemsCoreClient.reloadPluginsClient(start)) return; + } + _reloadPlugins(start); + } + public void onInitialize() { for (PluginDetector detector : PLUGIN_DETECTORS) { detector.detectCommonPlugins(); @@ -105,10 +122,7 @@ public void onInitialize() { if (Platform.getEnvironment() == Env.SERVER) { MutableLong lastReload = new MutableLong(-1); ReloadListenerRegistry.register(PackType.SERVER_DATA, (preparationBarrier, resourceManager, profilerFiller, profilerFiller2, executor, executor2) -> { - return preparationBarrier.wait(Unit.INSTANCE).thenRunAsync(() -> { - PERFORMANCE_LOGGER.clear(); - RoughlyEnoughItemsCore._reloadPlugins(null); - }, executor2); + return preparationBarrier.wait(Unit.INSTANCE).thenRunAsync(PluginManager::reloadAll, executor2); }); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java index e2dba5a38..7c56d41d9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java @@ -102,7 +102,6 @@ import net.minecraft.world.item.crafting.Ingredient; import org.apache.commons.lang3.function.TriFunction; import org.apache.commons.lang3.mutable.MutableLong; -import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.lang.reflect.InvocationTargetException; @@ -303,11 +302,11 @@ private void registerEvents() { MutableLong startReload = new MutableLong(-1); MutableLong endReload = new MutableLong(-1); PRE_UPDATE_RECIPES.register(recipeManager -> { - RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.clear(); - reloadPlugins(startReload, ReloadStage.START); + PluginManager.reloadAll(); + RoughlyEnoughItemsCore.reloadPlugins(startReload, ReloadStage.START); }); ClientRecipeUpdateEvent.EVENT.register(recipeManager -> { - reloadPlugins(endReload, ReloadStage.END); + RoughlyEnoughItemsCore.reloadPlugins(endReload, ReloadStage.END); }); ClientGuiEvent.INIT_PRE.register((screen, access) -> { List stages = ((PluginManagerImpl>) PluginManager.getInstance()).getReloader().getObservedStages(); @@ -321,7 +320,7 @@ private void registerEvents() { } InternalLogger.getInstance().error("Detected missing stage: END! This is possibly due to issues during client recipe reload! REI will force a reload of the recipes now!"); - reloadPlugins(endReload, ReloadStage.END); + RoughlyEnoughItemsCore.reloadPlugins(endReload, ReloadStage.END); } return EventResult.pass(); @@ -449,15 +448,7 @@ private boolean resetFocused(Screen screen) { return true; } - @ApiStatus.Internal - public static void reloadPlugins(MutableLong lastReload, @Nullable ReloadStage start) { - if (lastReload != null) { - if (lastReload.getValue() > 0 && System.currentTimeMillis() - lastReload.getValue() <= 5000) { - InternalLogger.getInstance().warn("Suppressing Reload Plugins of stage " + start); - return; - } - lastReload.setValue(System.currentTimeMillis()); - } + static boolean reloadPluginsClient(@Nullable ReloadStage start) { if (ConfigObject.getInstance().doesRegisterRecipesInAnotherThread()) { Future[] futures = new Future[1]; CompletableFuture future = CompletableFuture.runAsync(() -> RoughlyEnoughItemsCore._reloadPlugins(start), RELOAD_PLUGINS) @@ -470,8 +461,9 @@ public static void reloadPlugins(MutableLong lastReload, @Nullable ReloadStage s }); futures[0] = future; RELOAD_TASKS.add(future); - } else { - RoughlyEnoughItemsCore._reloadPlugins(start); + return true; } + + return false; } } From 8c13c015031a0de865d2e767cd8e879754f803e2 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 5 Aug 2022 01:30:08 +0800 Subject: [PATCH 06/20] More work --- .../rei/api/client/ClientHelper.java | 2 +- .../shedaniel/rei/api/client/REIRuntime.java | 4 +- .../api/client/favorites/FavoriteEntry.java | 2 +- .../api/client/gui/widgets/BatchedSlots.java | 40 +++ .../rei/api/client/gui/widgets/Slot.java | 22 +- .../rei/api/client/gui/widgets/TextField.java | 51 +++- .../rei/api/client/gui/widgets/Tooltip.java | 2 +- .../client/gui/widgets/TooltipContext.java | 2 +- .../rei/api/client/gui/widgets/Widgets.java | 11 +- .../rei/api/client/overlay/ScreenOverlay.java | 7 + .../registry/entry/PreFilteredEntryList.java | 3 +- .../api/client/registry/screen/ClickArea.java | 2 +- .../registry/transfer/TransferHandler.java | 2 +- .../api/client/view/ViewSearchBuilder.java | 2 +- .../common/category/CategoryIdentifier.java | 2 +- .../rei/api/common/entry/EntryIngredient.java | 2 +- .../rei/api/common/entry/EntryStack.java | 2 +- .../entry/comparison/EntryComparator.java | 2 +- .../rei/api/common/entry/type/EntryType.java | 2 +- .../rei/api/common/plugins/PluginManager.java | 4 +- .../rei/api/common/plugins/PluginView.java | 13 +- .../api/common/registry/ParentReloadable.java | 2 +- .../rei/api/common/util/CollectionUtils.java | 9 +- .../impl/{ => client}/ClientInternals.java | 70 +---- .../DelegatingFavoriteEntryProvider.java | 34 +++ .../FavoritesEntriesListProvider.java | 13 +- .../MissingStacksTooltipProvider.java | 33 +++ .../impl/client/provider/WidgetsProvider.java | 82 ++++++ .../rei/impl/common/InternalLogger.java | 1 - .../rei/impl/{ => common}/Internals.java | 44 +-- .../CategoryIdentifierConstructor.java | 31 +++ .../provider/DeferringEntryTypeProvider.java | 31 +++ .../provider/EntryIngredientProvider.java | 41 +++ .../common/provider/EntryStackProvider.java | 34 +++ .../common/provider/NbtHasherProvider.java | 31 +++ .../provider/PluginManagerConstructor.java | 34 +++ build.gradle | 8 + .../plugin/client/BuiltinClientPlugin.java | 2 +- .../plugin/client/DefaultClientPlugin.java | 2 +- .../rei/fabric/PluginDetectorImpl.java | 2 +- .../gui/fabric/ScreenOverlayImplFabric.java | 6 +- .../rei/forge/PluginDetectorImpl.java | 2 +- .../CategoryIdentifierConstructorImpl.java | 4 +- ...on.provider.CategoryIdentifierConstructor} | 0 .../impl/client/config/ConfigManagerImpl.java | 11 +- .../impl/client/config/ConfigObjectImpl.java | 7 +- .../UncertainDisplayViewingScreen.java | 2 +- .../gui/credits/CreditsEntryListWidget.java | 2 +- .../method/unihan/BomopofoInputMethod.java | 0 .../method/unihan/JyutpingInputMethod.java | 0 .../method/unihan/PinyinInputMethod.java | 0 .../method/unihan/UniHanInputMethod.java | 0 .../search/method/unihan/UniHanManager.java | 0 .../client/entry/type/EntryRegistryImpl.java | 2 +- .../common/entry/EntryIngredientImpl.java | 4 +- .../entry/stack/EntryStackProviderImpl.java | 4 +- ...l.common.provider.EntryIngredientProvider} | 0 ...i.impl.common.provider.EntryStackProvider} | 0 .../comparison/NbtHasherProviderImpl.java | 4 +- .../types/DeferringEntryTypeProviderImpl.java | 4 +- ...ommon.provider.DeferringEntryTypeProvider} | 0 ...ei.impl.common.provider.NbtHasherProvider} | 0 .../DelegatingFavoriteEntryProviderImpl.java | 4 +- .../favorites/FavoritesEntriesManager.java | 4 +- .../entries/FilteringAddRuleScreen.java | 3 +- .../entries/FilteringConfigEntries.java | 23 ++ .../config/entries/FilteringRulesScreen.java | 3 +- .../config/entries/FilteringScreen.java | 116 ++++---- .../filtering/FilteringRuleInternal.java | 23 ++ .../entry/filtering/FilteringRuleType.java | 25 +- .../filtering/rules/ManualFilteringRule.java | 23 ++ .../filtering/rules/SearchFilteringRule.java | 23 ++ .../rules/SearchFilteringRuleType.java | 21 +- .../entry/type/PreFilteredEntryListImpl.java | 28 +- .../FilteredStacksVisibilityHandler.java | 44 +-- .../client/init/CoreClientInitialization.java | 159 +++++++++++ .../impl/common/init/CoreInitialization.java | 113 ++++++++ .../common/logging/LoggerInitializer.java | 2 +- .../common/transfer/InputSlotCrafter.java | 13 +- .../common/transfer/MenuInfoRegistryImpl.java | 0 .../autocrafting/DefaultCategoryHandler.java | 0 ....api.common.transfer.info.MenuInfoRegistry | 1 + .../gui/performance/PerformanceScreen.java | 4 +- .../entry/PerformanceConfigEntries.java | 37 +++ .../performance/entry/PerformanceEntry.java | 0 .../entry/PerformanceEntryImpl.java | 0 .../entry/SubCategoryListEntry.java | 0 .../common/plugins/PluginManagerImpl.java | 5 + .../common/plugins/PluginReloaderImpl.java | 15 +- .../performance/PerformanceLogger.java | 2 +- .../performance/PerformanceLoggerImpl.java | 2 +- ...t.config.ConfigManagerInternal$SystemSetup | 1 + .../transfer/TransferHandlerRegistryImpl.java | 8 - ....registry.transfer.TransferHandlerRegistry | 1 + .../view}/AbstractViewSearchBuilder.java | 2 +- .../view}/LegacyWrapperViewSearchBuilder.java | 2 +- .../client/view}/ViewSearchBuilderImpl.java | 3 +- .../rei/impl/client/view/ViewsImpl.java | 2 +- .../view}/craftable/CraftableFilter.java | 61 ++++- .../gui/tooltip}/MissingStacksTooltip.java | 9 +- .../tooltip/MissingStacksTooltipProvider.java | 27 ++ .../gui/widget/basewidgets/ArrowWidget.java | 2 +- .../BatchedEntryRendererManager.java | 248 ++++++++++++----- .../widget/basewidgets/BurningFireWidget.java | 2 +- .../gui/widget/basewidgets/ButtonWidget.java | 2 +- .../DelegateWidgetWithTranslate.java | 4 +- .../widget/basewidgets/DrawableWidget.java | 2 +- .../FillRectangleDrawableConsumer.java | 2 +- .../widget/basewidgets/ForwardingList.java | 166 ++++++++++++ .../gui/widget/basewidgets/LabelWidget.java | 4 +- .../gui/widget/basewidgets}/MergedWidget.java | 4 +- .../gui/widget/basewidgets}/NoOpWidget.java | 4 +- .../widget/basewidgets}/OverflowWidget.java | 7 +- .../basewidgets}/PaddedCenterWidget.java | 4 +- .../gui/widget/basewidgets}/PaddedWidget.java | 4 +- .../gui/widget/basewidgets/PanelWidget.java | 2 +- .../basewidgets}/RendererWrappedWidget.java | 4 +- .../widget/basewidgets/TextFieldWidget.java | 200 +++++++------- .../basewidgets/TexturedDrawableConsumer.java | 2 +- .../basewidgets}/VanillaWrappedWidget.java | 4 +- .../widget/basewidgets/WidgetsProvider.java | 166 ++++++++++++ .../gui/widget/basewidgets/package-info.java | 0 .../shedaniel/rei/RoughlyEnoughItemsCore.java | 79 +----- .../rei/RoughlyEnoughItemsCoreClient.java | 128 +-------- .../rei/impl/client/ClientHelperImpl.java | 84 +----- .../rei/impl/client/ErrorDisplayer.java | 2 +- .../rei/impl/client/REIRuntimeImpl.java | 16 +- .../impl/client/gui/ScreenOverlayImpl.java | 88 +++--- .../{modules => menu}/AbstractMenuEntry.java | 2 +- .../client/gui/{modules => menu}/Menu.java | 4 +- .../gui/{modules => menu}/MenuAccess.java | 2 +- .../MenuAccessImpl.java} | 4 +- .../gui/{modules => menu}/MenuEntry.java | 2 +- .../entries/EmptyMenuEntry.java | 4 +- .../entries/SeparatorMenuEntry.java | 4 +- .../entries/SubMenuEntry.java | 8 +- .../entries/TextMenuEntry.java | 4 +- .../entries/ToggleMenuEntry.java | 4 +- .../screen/AbstractDisplayViewingScreen.java | 8 +- .../screen/CompositeDisplayViewingScreen.java | 8 +- .../screen/DefaultDisplayViewingScreen.java | 9 +- .../DynamicErrorFreeEntryListWidget.java | 2 +- .../{ => error}/WarningAndErrorScreen.java | 3 +- .../gui/toast/CopyRecipeIdentifierToast.java | 1 - .../gui/widget/AutoCraftingButtonWidget.java | 134 ++++++++++ .../gui/widget/CatchingExceptionUtils.java | 2 +- .../client/gui/widget/ConfigButtonWidget.java | 6 +- .../widget/CraftableFilterButtonWidget.java | 13 +- .../DefaultDisplayChoosePageWidget.java | 16 +- .../gui/widget/DisplayedEntryWidget.java | 136 +++++++++- .../impl/client/gui/widget/EntryWidget.java | 250 ++---------------- .../client/gui/widget/InternalWidgets.java | 238 +---------------- .../{QueuedTooltip.java => TooltipImpl.java} | 10 +- .../widget/entrylist/EntryListStackEntry.java | 6 +- .../entrylist/PaginatedEntryListWidget.java | 20 +- .../entrylist/ScrolledEntryListWidget.java | 16 +- .../favorites/history/DisplayEntry.java | 2 +- .../panel/rows/FavoritesPanelEntriesRow.java | 2 +- .../region/EntryStacksRegionWidget.java | 8 +- .../gui/widget/region/RealRegionEntry.java | 2 +- .../gui/widget/region/RegionEntryWidget.java | 4 +- .../gui/widget/search/DelegateTextField.java | 153 +++++++++++ .../gui/widget/search/OverlaySearchField.java | 112 ++++---- .../init/RoughlyEnoughItemsInitializer.java | 3 +- .../impl/init/ServiceBasedPluginDetector.java | 2 +- .../client/runtime/InputMethodWatcher.java | 2 +- ...l.rei.impl.ClientInternals$WidgetsProvider | 2 +- runtime/src/test/java/InputMethodTest.java | 99 ------- settings.gradle | 9 + .../client/config/ConfigManagerInternal.java | 8 + .../impl/client/util/CrashReportUtils.java | 2 +- .../client/util}/TextTransformations.java | 2 +- 172 files changed, 2554 insertions(+), 1548 deletions(-) create mode 100644 api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/BatchedSlots.java rename api/src/main/java/me/shedaniel/rei/impl/{ => client}/ClientInternals.java (76%) create mode 100644 api/src/main/java/me/shedaniel/rei/impl/client/provider/DelegatingFavoriteEntryProvider.java rename runtime/src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java => api/src/main/java/me/shedaniel/rei/impl/client/provider/FavoritesEntriesListProvider.java (78%) create mode 100644 api/src/main/java/me/shedaniel/rei/impl/client/provider/MissingStacksTooltipProvider.java create mode 100644 api/src/main/java/me/shedaniel/rei/impl/client/provider/WidgetsProvider.java rename api/src/main/java/me/shedaniel/rei/impl/{ => common}/Internals.java (82%) create mode 100644 api/src/main/java/me/shedaniel/rei/impl/common/provider/CategoryIdentifierConstructor.java create mode 100644 api/src/main/java/me/shedaniel/rei/impl/common/provider/DeferringEntryTypeProvider.java create mode 100644 api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryIngredientProvider.java create mode 100644 api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryStackProvider.java create mode 100644 api/src/main/java/me/shedaniel/rei/impl/common/provider/NbtHasherProvider.java create mode 100644 api/src/main/java/me/shedaniel/rei/impl/common/provider/PluginManagerConstructor.java rename runtime-engine/categories/src/main/resources/META-INF/services/{me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor => me.shedaniel.rei.impl.common.provider.CategoryIdentifierConstructor} (100%) rename {runtime => runtime-engine/default-runtime-plugin}/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/BomopofoInputMethod.java (100%) rename {runtime => runtime-engine/default-runtime-plugin}/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/JyutpingInputMethod.java (100%) rename {runtime => runtime-engine/default-runtime-plugin}/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/PinyinInputMethod.java (100%) rename {runtime => runtime-engine/default-runtime-plugin}/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/UniHanInputMethod.java (100%) rename {runtime => runtime-engine/default-runtime-plugin}/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/UniHanManager.java (100%) rename runtime-engine/entry-stacks/src/main/resources/META-INF/services/{me.shedaniel.rei.impl.Internals$EntryIngredientProvider => me.shedaniel.rei.impl.common.provider.EntryIngredientProvider} (100%) rename runtime-engine/entry-stacks/src/main/resources/META-INF/services/{me.shedaniel.rei.impl.Internals$EntryStackProvider => me.shedaniel.rei.impl.common.provider.EntryStackProvider} (100%) rename runtime-engine/entry-types/src/main/resources/META-INF/services/{me.shedaniel.rei.impl.Internals$DeferringEntryTypeProvider => me.shedaniel.rei.impl.common.provider.DeferringEntryTypeProvider} (100%) rename runtime-engine/entry-types/src/main/resources/META-INF/services/{me.shedaniel.rei.impl.Internals$NbtHasherProvider => me.shedaniel.rei.impl.common.provider.NbtHasherProvider} (100%) create mode 100644 runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/client/init/CoreClientInitialization.java create mode 100644 runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java rename {runtime => runtime-engine/menu-info}/src/main/java/me/shedaniel/rei/impl/common/transfer/InputSlotCrafter.java (92%) rename {runtime => runtime-engine/menu-info}/src/main/java/me/shedaniel/rei/impl/common/transfer/MenuInfoRegistryImpl.java (100%) rename {runtime => runtime-engine/menu-info}/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java (100%) create mode 100644 runtime-engine/menu-info/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.transfer.info.MenuInfoRegistry rename {runtime => runtime-engine/plugins}/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java (98%) create mode 100644 runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceConfigEntries.java rename {runtime => runtime-engine/plugins}/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceEntry.java (100%) rename {runtime => runtime-engine/plugins}/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceEntryImpl.java (100%) rename {runtime => runtime-engine/plugins}/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/SubCategoryListEntry.java (100%) rename {runtime => runtime-engine/plugins}/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java (97%) rename {runtime => runtime-engine/plugins}/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java (94%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common/logging => runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins}/performance/PerformanceLogger.java (97%) rename {runtime/src/main/java/me/shedaniel/rei/impl/common/logging => runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins}/performance/PerformanceLoggerImpl.java (98%) create mode 100644 runtime-engine/plugins/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.config.ConfigManagerInternal$SystemSetup rename {runtime => runtime-engine/transfer-handlers}/src/main/java/me/shedaniel/rei/impl/client/transfer/TransferHandlerRegistryImpl.java (88%) create mode 100644 runtime-engine/transfer-handlers/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry rename {runtime/src/main/java/me/shedaniel/rei/impl/client => runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view}/AbstractViewSearchBuilder.java (98%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client => runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view}/LegacyWrapperViewSearchBuilder.java (99%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client => runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view}/ViewSearchBuilderImpl.java (97%) rename {runtime => runtime-engine/views}/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java (99%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui => runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view}/craftable/CraftableFilter.java (53%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/transfer => runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip}/MissingStacksTooltip.java (94%) create mode 100644 runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltipProvider.java rename {runtime => runtime-frontend/widgets}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java (98%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets}/BatchedEntryRendererManager.java (55%) rename {runtime => runtime-frontend/widgets}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java (98%) rename {runtime => runtime-frontend/widgets}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java (99%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets}/DelegateWidgetWithTranslate.java (97%) rename {runtime => runtime-frontend/widgets}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DrawableWidget.java (97%) rename {runtime => runtime-frontend/widgets}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/FillRectangleDrawableConsumer.java (97%) create mode 100644 runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ForwardingList.java rename {runtime => runtime-frontend/widgets}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java (98%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets}/MergedWidget.java (97%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets}/NoOpWidget.java (94%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets}/OverflowWidget.java (96%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets}/PaddedCenterWidget.java (94%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets}/PaddedWidget.java (94%) rename {runtime => runtime-frontend/widgets}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java (99%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets}/RendererWrappedWidget.java (95%) rename {runtime => runtime-frontend/widgets}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java (78%) rename {runtime => runtime-frontend/widgets}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TexturedDrawableConsumer.java (98%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets}/VanillaWrappedWidget.java (96%) create mode 100644 runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProvider.java rename {runtime => runtime-frontend/widgets}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/package-info.java (100%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/{modules => menu}/AbstractMenuEntry.java (98%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/{modules => menu}/Menu.java (98%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/{modules => menu}/MenuAccess.java (98%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/{modules/MenuHolder.java => menu/MenuAccessImpl.java} (97%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/{modules => menu}/MenuEntry.java (97%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/{modules => menu}/entries/EmptyMenuEntry.java (93%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/{modules => menu}/entries/SeparatorMenuEntry.java (93%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/{modules => menu}/entries/SubMenuEntry.java (96%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/{modules => menu}/entries/TextMenuEntry.java (95%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/{modules => menu}/entries/ToggleMenuEntry.java (97%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/{widget => screen/error}/DynamicErrorFreeEntryListWidget.java (99%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/{ => error}/WarningAndErrorScreen.java (99%) create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/{QueuedTooltip.java => TooltipImpl.java} (93%) create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java delete mode 100644 runtime/src/test/java/InputMethodTest.java rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/text => shared-internals/src/main/java/me/shedaniel/rei/impl/client/util}/TextTransformations.java (98%) diff --git a/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java b/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java index 2e1be6030..6b62994b1 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java @@ -28,7 +28,7 @@ import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.FormattingUtils; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; diff --git a/api/src/main/java/me/shedaniel/rei/api/client/REIRuntime.java b/api/src/main/java/me/shedaniel/rei/api/client/REIRuntime.java index a17751703..540dcc2ab 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/REIRuntime.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/REIRuntime.java @@ -134,7 +134,9 @@ default Optional getOverlay(boolean reset) { * @return the text field used for searching, or {@code null} if none */ @Nullable - TextField getSearchTextField(); + default TextField getSearchTextField() { + return getOverlay().map(ScreenOverlay::getSearchField).orElse(null); + } /** * Queues a tooltip to be displayed. diff --git a/api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntry.java b/api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntry.java index 6c5415910..e1f18684d 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntry.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/favorites/FavoriteEntry.java @@ -29,7 +29,7 @@ import me.shedaniel.rei.api.client.gui.Renderer; import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.nbt.CompoundTag; diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/BatchedSlots.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/BatchedSlots.java new file mode 100644 index 000000000..6cead07dd --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/BatchedSlots.java @@ -0,0 +1,40 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.api.client.gui.widgets; + +import org.apache.commons.lang3.mutable.MutableInt; +import org.apache.commons.lang3.mutable.MutableLong; + +import java.util.Collection; +import java.util.List; + +public abstract class BatchedSlots extends Widget implements List { + public abstract void addUnbatched(Slot slot); + + public abstract void addAllUnbatched(Collection slots); + + public abstract boolean isBatched(); + + public abstract void addDebugger(MutableInt size, MutableLong time); +} diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java index f0b2842e6..88220ecf2 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.api.client.gui.widgets; +import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.common.entry.EntryStack; @@ -30,13 +31,14 @@ import java.util.Collection; import java.util.List; +import java.util.function.UnaryOperator; public abstract class Slot extends WidgetWithBounds { public static final byte UN_MARKED = 0; public static final byte INPUT = 1; public static final byte OUTPUT = 2; - public Slot unmarkInputOrOutput() { + public final Slot unmarkInputOrOutput() { setNoticeMark(UN_MARKED); return this; } @@ -59,7 +61,7 @@ public final Slot markOutput() { public abstract boolean isInteractable(); - public Slot interactable(boolean interactable) { + public final Slot interactable(boolean interactable) { setInteractable(interactable); return this; } @@ -76,7 +78,7 @@ public final Slot notInteractable() { public abstract boolean isInteractableFavorites(); - public Slot interactableFavorites(boolean interactableFavorites) { + public final Slot interactableFavorites(boolean interactableFavorites) { setInteractableFavorites(interactableFavorites); return this; } @@ -140,8 +142,22 @@ public final Slot disableBackground() { public abstract Rectangle getInnerBounds(); + public abstract void drawBackground(PoseStack matrices, int mouseX, int mouseY, float delta); + @Nullable + @Deprecated(forRemoval = true) public Tooltip getCurrentTooltip(Point point) { + return getCurrentTooltip(TooltipContext.of(point)); + } + + public abstract void drawExtra(PoseStack matrices, int mouseX, int mouseY, float delta); + + @Nullable + public Tooltip getCurrentTooltip(TooltipContext context) { return null; } + + public abstract void drawHighlighted(PoseStack matrices, int mouseX, int mouseY, float delta); + + public abstract void tooltipProcessor(UnaryOperator operator); } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TextField.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TextField.java index 7002ad26f..803502972 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TextField.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TextField.java @@ -23,7 +23,23 @@ package me.shedaniel.rei.api.client.gui.widgets; -public interface TextField { +import com.mojang.blaze3d.vertex.PoseStack; +import it.unimi.dsi.fastutil.booleans.BooleanConsumer; +import me.shedaniel.clothconfig2.api.TickableWidget; +import net.minecraft.network.chat.Style; +import net.minecraft.util.FormattedCharSequence; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; +import java.util.function.Function; + +import static me.shedaniel.rei.api.client.gui.widgets.Widget.mouse; + +public interface TextField extends TickableWidget { + void setFormatter(TextFormatter formatter); + + void setSuggestionRenderer(SuggestionRenderer renderer); + String getText(); void setText(String text); @@ -57,4 +73,37 @@ public interface TextField { boolean isFocused(); void setFocused(boolean focused); + + void setResponder(Consumer responder); + + void setFocusedResponder(BooleanConsumer responder); + + void setTextTransformer(Function textTransformer); + + @Nullable + String getSuggestion(); + + void setSuggestion(@Nullable String suggestion); + + void setBorderColorProvider(BorderColorProvider borderColorProvider); + + WidgetWithBounds asWidget(); + + interface TextFormatter { + TextFormatter DEFAULT = (text, index) -> { + return FormattedCharSequence.forward(text, Style.EMPTY); + }; + + FormattedCharSequence format(String text, int index); + } + + interface SuggestionRenderer { + void renderSuggestion(PoseStack matrices, int x, int y, int color); + } + + interface BorderColorProvider { + BorderColorProvider DEFAULT = textField -> textField.asWidget().containsMouse(mouse()) || textField.isFocused() ? 0xffffffff : 0xffa0a0a0; + + int getBorderColor(TextField textField); + } } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java index dad0e9d59..550c9b226 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java @@ -29,7 +29,7 @@ import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipContext.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipContext.java index 598bbc292..cb20f2bd2 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipContext.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipContext.java @@ -25,7 +25,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.impl.PointHelper; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.world.item.TooltipFlag; diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java index 028947c34..4e7e2d336 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java @@ -31,7 +31,7 @@ import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.DrawableConsumer; import me.shedaniel.rei.api.client.gui.Renderer; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -327,6 +327,15 @@ public static WidgetWithBounds padded(int padLeft, int padRight, int padTop, int return ClientInternals.getWidgetsProvider().wrapPadded(padLeft, padRight, padTop, padBottom, widget); } + public static TextField createTextField(Rectangle bounds) { + return ClientInternals.getWidgetsProvider().createTextField(bounds); + } + + @ApiStatus.Experimental + public static BatchedSlots createBatchedSlots() { + return ClientInternals.getWidgetsProvider().createBatchedSlots(); + } + public static Widget delegate(Supplier supplier) { return new DelegateWidget(Widgets.noOp()) { @Override diff --git a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java index f7f5c481e..944755f61 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java @@ -23,7 +23,10 @@ package me.shedaniel.rei.api.client.overlay; +import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; +import me.shedaniel.rei.api.client.gui.widgets.TextField; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -43,4 +46,8 @@ public abstract class ScreenOverlay extends WidgetWithBounds { public abstract OverlayListWidget getEntryList(); public abstract Optional getFavoritesList(); + + public abstract TextField getSearchField(); + + public abstract void renderTooltip(PoseStack matrices, Tooltip tooltip); } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/PreFilteredEntryList.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/PreFilteredEntryList.java index f9bd53422..f05db2347 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/PreFilteredEntryList.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/entry/PreFilteredEntryList.java @@ -26,8 +26,7 @@ import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.registry.Reloadable; -import me.shedaniel.rei.impl.ClientInternals; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.client.ClientInternals; import org.jetbrains.annotations.ApiStatus; import java.util.Collection; diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/screen/ClickArea.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/screen/ClickArea.java index 3f6803d97..8b6aad935 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/registry/screen/ClickArea.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/screen/ClickArea.java @@ -25,7 +25,7 @@ import me.shedaniel.math.Point; import me.shedaniel.rei.api.common.category.CategoryIdentifier; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.screens.Screen; diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java index ec32d75aa..3945e9c63 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/transfer/TransferHandler.java @@ -27,7 +27,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryIngredient; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; diff --git a/api/src/main/java/me/shedaniel/rei/api/client/view/ViewSearchBuilder.java b/api/src/main/java/me/shedaniel/rei/api/client/view/ViewSearchBuilder.java index 1afa8f04d..5f7a2c1a4 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/view/ViewSearchBuilder.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/view/ViewSearchBuilder.java @@ -31,7 +31,7 @@ import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.display.DisplaySpec; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; diff --git a/api/src/main/java/me/shedaniel/rei/api/common/category/CategoryIdentifier.java b/api/src/main/java/me/shedaniel/rei/api/common/category/CategoryIdentifier.java index 8fd2136c0..001517a5c 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/category/CategoryIdentifier.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/category/CategoryIdentifier.java @@ -25,7 +25,7 @@ import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.util.Identifiable; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.Internals; import net.minecraft.ResourceLocationException; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.ApiStatus; diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryIngredient.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryIngredient.java index fd6302218..27f37f620 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryIngredient.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryIngredient.java @@ -24,7 +24,7 @@ package me.shedaniel.rei.api.common.entry; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.Internals; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import org.jetbrains.annotations.ApiStatus; diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java index 0dcb10eda..2d2f3ca15 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/EntryStack.java @@ -37,7 +37,7 @@ import me.shedaniel.rei.api.common.entry.type.EntryType; import me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry; import me.shedaniel.rei.api.common.util.TextRepresentable; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.Internals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.nbt.CompoundTag; diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/comparison/EntryComparator.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/comparison/EntryComparator.java index e24d41327..c30fb7aa7 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/entry/comparison/EntryComparator.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/comparison/EntryComparator.java @@ -24,7 +24,7 @@ package me.shedaniel.rei.api.common.entry.comparison; import dev.architectury.fluid.FluidStack; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.Internals; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryType.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryType.java index 6db72c191..69834c070 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryType.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/type/EntryType.java @@ -25,7 +25,7 @@ import me.shedaniel.rei.api.client.entry.type.BuiltinClientEntryTypes; import me.shedaniel.rei.api.common.util.Identifiable; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.Internals; import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.ApiStatus; diff --git a/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginManager.java b/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginManager.java index f135fded3..b42a5d8f5 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginManager.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginManager.java @@ -28,8 +28,8 @@ import me.shedaniel.rei.api.common.registry.ParentReloadable; import me.shedaniel.rei.api.common.registry.Reloadable; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.ClientInternals; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.client.ClientInternals; +import me.shedaniel.rei.impl.common.Internals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import org.jetbrains.annotations.ApiStatus; diff --git a/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginView.java b/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginView.java index ff5584789..bda9797ca 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginView.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/plugins/PluginView.java @@ -25,12 +25,14 @@ import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.common.registry.ReloadStage; -import me.shedaniel.rei.impl.ClientInternals; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.client.ClientInternals; +import me.shedaniel.rei.impl.common.Internals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import org.jetbrains.annotations.ApiStatus; +import java.util.List; + @ApiStatus.Internal public interface PluginView

> { @Environment(EnvType.CLIENT) @@ -70,10 +72,17 @@ public void pre(ReloadStage stage) { public void post(ReloadStage stage) { PluginView.this.post(stage); } + + @Override + public List getObservedStages() { + return PluginView.this.getObservedStages(); + } }; } void pre(ReloadStage stage); void post(ReloadStage stage); + + List getObservedStages(); } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/registry/ParentReloadable.java b/api/src/main/java/me/shedaniel/rei/api/common/registry/ParentReloadable.java index e91f19245..a6bfcea38 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/registry/ParentReloadable.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/registry/ParentReloadable.java @@ -24,7 +24,7 @@ package me.shedaniel.rei.api.common.registry; import me.shedaniel.rei.api.common.plugins.REIPlugin; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.Internals; import java.util.List; diff --git a/api/src/main/java/me/shedaniel/rei/api/common/util/CollectionUtils.java b/api/src/main/java/me/shedaniel/rei/api/common/util/CollectionUtils.java index d657e0c4e..5680b4ab4 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/util/CollectionUtils.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/util/CollectionUtils.java @@ -424,6 +424,10 @@ public static Ingredient toIngredient(Iterable stacks) { @SafeVarargs public static List concatUnmodifiable(List... lists) { + return new ListConcatenationView<>(Arrays.asList(lists)); + } + + public static List concatUnmodifiable(Iterable> lists) { return new ListConcatenationView<>(lists); } @@ -431,10 +435,9 @@ public static List concatUnmodifiable(List... lists) { * A list which acts as view of the concatenation of a number of lists. */ private static class ListConcatenationView extends AbstractList { - private final List[] lists; + private final Iterable> lists; - @SafeVarargs - public ListConcatenationView(List... lists) { + public ListConcatenationView(Iterable> lists) { this.lists = lists; } diff --git a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java b/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java similarity index 76% rename from api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java rename to api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java index df5e4938e..b684d3554 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/ClientInternals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java @@ -21,30 +21,28 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl; +package me.shedaniel.rei.impl.client; -import com.mojang.math.Matrix4f; import com.mojang.serialization.DataResult; import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; -import me.shedaniel.rei.api.client.gui.DrawableConsumer; -import me.shedaniel.rei.api.client.gui.Renderer; -import me.shedaniel.rei.api.client.gui.widgets.*; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.entry.PreFilteredEntryList; import me.shedaniel.rei.api.client.registry.screen.ClickArea; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.impl.client.provider.DelegatingFavoriteEntryProvider; +import me.shedaniel.rei.impl.client.provider.FavoritesEntriesListProvider; +import me.shedaniel.rei.impl.client.provider.MissingStacksTooltipProvider; +import me.shedaniel.rei.impl.client.provider.WidgetsProvider; +import me.shedaniel.rei.impl.common.Internals; import net.minecraft.ReportedException; -import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.FormattedText; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.TooltipFlag; import org.apache.commons.lang3.function.TriFunction; @@ -74,7 +72,7 @@ public final class ClientInternals { private static Function tooltipEntryProvider = (component) -> throwNotSetup(); private static Supplier> jeiCompatMods = ClientInternals::throwNotSetup; private static Supplier builtinClientPlugin = ClientInternals::throwNotSetup; - private static Function, TooltipComponent> missingTooltip = (stacks) -> throwNotSetup(); + private static final MissingStacksTooltipProvider MISSING_TOOLTIP = resolveService(MissingStacksTooltipProvider.class); private static BiConsumer crashHandler = (exception, component) -> throwNotSetup(); private static Supplier preFilteredEntryList = ClientInternals::throwNotSetup; @@ -172,7 +170,7 @@ public static PluginManager getPluginManager() { } public static TooltipComponent createMissingTooltip(List stacks) { - return missingTooltip.apply(stacks); + return MISSING_TOOLTIP.provide(stacks); } public static PreFilteredEntryList getPreFilteredEntryList() { @@ -182,52 +180,4 @@ public static PreFilteredEntryList getPreFilteredEntryList() { public static void crash(ReportedException exception, String component) { crashHandler.accept(exception, component); } - - public interface WidgetsProvider { - boolean isRenderingPanel(Panel panel); - - Widget wrapVanillaWidget(GuiEventListener element); - - WidgetWithBounds wrapRenderer(Supplier bounds, Renderer renderer); - - WidgetWithBounds withTranslate(WidgetWithBounds widget, Supplier translate); - - Widget createDrawableWidget(DrawableConsumer drawable); - - Slot createSlot(Point point); - - Slot createSlot(Rectangle bounds); - - Button createButton(Rectangle bounds, Component text); - - Panel createPanelWidget(Rectangle bounds); - - Label createLabel(Point point, FormattedText text); - - Arrow createArrow(Rectangle rectangle); - - BurningFire createBurningFire(Rectangle rectangle); - - DrawableConsumer createTexturedConsumer(ResourceLocation texture, int x, int y, int width, int height, float u, float v, int uWidth, int vHeight, int textureWidth, int textureHeight); - - DrawableConsumer createFillRectangleConsumer(Rectangle rectangle, int color); - - Widget createShapelessIcon(Point point); - - Widget concatWidgets(List widgets); - - WidgetWithBounds noOp(); - - WidgetWithBounds wrapOverflow(Rectangle bounds, WidgetWithBounds widget); - - WidgetWithBounds wrapPadded(int padLeft, int padRight, int padTop, int padBottom, WidgetWithBounds widget); - } - - public interface DelegatingFavoriteEntryProvider { - FavoriteEntry delegate(Supplier> result, Supplier tag); - } - - public interface FavoritesEntriesListProvider { - List get(); - } } diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/provider/DelegatingFavoriteEntryProvider.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/DelegatingFavoriteEntryProvider.java new file mode 100644 index 000000000..2eec919f8 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/DelegatingFavoriteEntryProvider.java @@ -0,0 +1,34 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.provider; + +import com.mojang.serialization.DataResult; +import me.shedaniel.rei.api.client.favorites.FavoriteEntry; +import net.minecraft.nbt.CompoundTag; + +import java.util.function.Supplier; + +public interface DelegatingFavoriteEntryProvider { + FavoriteEntry delegate(Supplier> result, Supplier tag); +} diff --git a/runtime/src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/FavoritesEntriesListProvider.java similarity index 78% rename from runtime/src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java rename to api/src/main/java/me/shedaniel/rei/impl/client/provider/FavoritesEntriesListProvider.java index cba2abecc..d2c1ec23c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/REIModMenuEntryPoint.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/FavoritesEntriesListProvider.java @@ -21,13 +21,12 @@ * SOFTWARE. */ -package me.shedaniel.rei; +package me.shedaniel.rei.impl.client.provider; -import dev.architectury.platform.Platform; -import me.shedaniel.rei.api.client.config.ConfigManager; +import me.shedaniel.rei.api.client.favorites.FavoriteEntry; -public class REIModMenuEntryPoint { - public void onInitializeClient() { - Platform.getMod("roughlyenoughitems").registerConfigurationScreen(ConfigManager.getInstance()::getConfigScreen); - } +import java.util.List; + +public interface FavoritesEntriesListProvider { + List get(); } diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/provider/MissingStacksTooltipProvider.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/MissingStacksTooltipProvider.java new file mode 100644 index 000000000..b10675f1f --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/MissingStacksTooltipProvider.java @@ -0,0 +1,33 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.provider; + +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import net.minecraft.world.inventory.tooltip.TooltipComponent; + +import java.util.List; + +public interface MissingStacksTooltipProvider { + TooltipComponent provide(List stacks); +} diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/provider/WidgetsProvider.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/WidgetsProvider.java new file mode 100644 index 000000000..6d985e4a2 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/WidgetsProvider.java @@ -0,0 +1,82 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.provider; + +import com.mojang.math.Matrix4f; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.DrawableConsumer; +import me.shedaniel.rei.api.client.gui.Renderer; +import me.shedaniel.rei.api.client.gui.widgets.*; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.FormattedText; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; +import java.util.function.Supplier; + +public interface WidgetsProvider { + boolean isRenderingPanel(Panel panel); + + Widget wrapVanillaWidget(GuiEventListener element); + + WidgetWithBounds wrapRenderer(Supplier bounds, Renderer renderer); + + WidgetWithBounds withTranslate(WidgetWithBounds widget, Supplier translate); + + Widget createDrawableWidget(DrawableConsumer drawable); + + Slot createSlot(Point point); + + Slot createSlot(Rectangle bounds); + + Button createButton(Rectangle bounds, Component text); + + Panel createPanelWidget(Rectangle bounds); + + Label createLabel(Point point, FormattedText text); + + Arrow createArrow(Rectangle rectangle); + + BurningFire createBurningFire(Rectangle rectangle); + + DrawableConsumer createTexturedConsumer(ResourceLocation texture, int x, int y, int width, int height, float u, float v, int uWidth, int vHeight, int textureWidth, int textureHeight); + + DrawableConsumer createFillRectangleConsumer(Rectangle rectangle, int color); + + Widget createShapelessIcon(Point point); + + Widget concatWidgets(List widgets); + + WidgetWithBounds noOp(); + + WidgetWithBounds wrapOverflow(Rectangle bounds, WidgetWithBounds widget); + + WidgetWithBounds wrapPadded(int padLeft, int padRight, int padTop, int padBottom, WidgetWithBounds widget); + + TextField createTextField(Rectangle bounds); + + BatchedSlots createBatchedSlots(); +} diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/InternalLogger.java b/api/src/main/java/me/shedaniel/rei/impl/common/InternalLogger.java index 40f81129c..02cd5e4f2 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/common/InternalLogger.java +++ b/api/src/main/java/me/shedaniel/rei/impl/common/InternalLogger.java @@ -23,7 +23,6 @@ package me.shedaniel.rei.impl.common; -import me.shedaniel.rei.impl.Internals; import org.apache.logging.log4j.Level; import org.jetbrains.annotations.ApiStatus; diff --git a/api/src/main/java/me/shedaniel/rei/impl/Internals.java b/api/src/main/java/me/shedaniel/rei/impl/common/Internals.java similarity index 82% rename from api/src/main/java/me/shedaniel/rei/impl/Internals.java rename to api/src/main/java/me/shedaniel/rei/impl/common/Internals.java index d5ad63e1b..b874aa7a2 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/Internals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/common/Internals.java @@ -21,23 +21,19 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl; +package me.shedaniel.rei.impl.common; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.api.common.entry.EntryIngredient; -import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.comparison.EntryComparator; -import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.EntryType; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.plugins.PluginView; import me.shedaniel.rei.api.common.plugins.REIPlugin; import me.shedaniel.rei.api.common.plugins.REIServerPlugin; -import me.shedaniel.rei.impl.common.InternalLogger; +import me.shedaniel.rei.impl.common.provider.*; import net.minecraft.nbt.Tag; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Unit; import org.jetbrains.annotations.ApiStatus; import java.lang.reflect.Field; @@ -145,40 +141,4 @@ public static InternalLogger getInternalLogger() { public static void reloadREI() { reloadREI.run(); } - - public interface EntryStackProvider { - EntryStack empty(); - - EntryStack of(EntryDefinition definition, T value); - } - - public interface EntryIngredientProvider { - EntryIngredient empty(); - - EntryIngredient of(EntryStack stack); - - EntryIngredient of(EntryStack... stacks); - - EntryIngredient of(Iterable> stacks); - - EntryIngredient.Builder builder(); - - EntryIngredient.Builder builder(int initialCapacity); - } - - public interface PluginManagerConstructor { -

> PluginManager

create(Class

clazz, UnaryOperator> constructor); - } - - public interface NbtHasherProvider { - EntryComparator provide(String... ignoredKeys); - } - - public interface DeferringEntryTypeProvider { - EntryType get(ResourceLocation id); - } - - public interface CategoryIdentifierConstructor { - CategoryIdentifier create(String location); - } } diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/provider/CategoryIdentifierConstructor.java b/api/src/main/java/me/shedaniel/rei/impl/common/provider/CategoryIdentifierConstructor.java new file mode 100644 index 000000000..11b3b4928 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/impl/common/provider/CategoryIdentifierConstructor.java @@ -0,0 +1,31 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.provider; + +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; + +public interface CategoryIdentifierConstructor { + CategoryIdentifier create(String location); +} diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/provider/DeferringEntryTypeProvider.java b/api/src/main/java/me/shedaniel/rei/impl/common/provider/DeferringEntryTypeProvider.java new file mode 100644 index 000000000..3abf02a90 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/impl/common/provider/DeferringEntryTypeProvider.java @@ -0,0 +1,31 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.provider; + +import me.shedaniel.rei.api.common.entry.type.EntryType; +import net.minecraft.resources.ResourceLocation; + +public interface DeferringEntryTypeProvider { + EntryType get(ResourceLocation id); +} diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryIngredientProvider.java b/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryIngredientProvider.java new file mode 100644 index 000000000..2a0ead5ab --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryIngredientProvider.java @@ -0,0 +1,41 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.provider; + +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.api.common.entry.EntryStack; + +public interface EntryIngredientProvider { + EntryIngredient empty(); + + EntryIngredient of(EntryStack stack); + + EntryIngredient of(EntryStack... stacks); + + EntryIngredient of(Iterable> stacks); + + EntryIngredient.Builder builder(); + + EntryIngredient.Builder builder(int initialCapacity); +} diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryStackProvider.java b/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryStackProvider.java new file mode 100644 index 000000000..cc01fc8ff --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryStackProvider.java @@ -0,0 +1,34 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.provider; + +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.entry.type.EntryDefinition; +import net.minecraft.util.Unit; + +public interface EntryStackProvider { + EntryStack empty(); + + EntryStack of(EntryDefinition definition, T value); +} diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/provider/NbtHasherProvider.java b/api/src/main/java/me/shedaniel/rei/impl/common/provider/NbtHasherProvider.java new file mode 100644 index 000000000..b12d6910d --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/impl/common/provider/NbtHasherProvider.java @@ -0,0 +1,31 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.provider; + +import me.shedaniel.rei.api.common.entry.comparison.EntryComparator; +import net.minecraft.nbt.Tag; + +public interface NbtHasherProvider { + EntryComparator provide(String... ignoredKeys); +} diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/provider/PluginManagerConstructor.java b/api/src/main/java/me/shedaniel/rei/impl/common/provider/PluginManagerConstructor.java new file mode 100644 index 000000000..b31d4bc45 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/impl/common/provider/PluginManagerConstructor.java @@ -0,0 +1,34 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.provider; + +import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.api.common.plugins.PluginView; +import me.shedaniel.rei.api.common.plugins.REIPlugin; + +import java.util.function.UnaryOperator; + +public interface PluginManagerConstructor { +

> PluginManager

create(Class

clazz, UnaryOperator> constructor); +} diff --git a/build.gradle b/build.gradle index 4f44dac96..51f426fba 100755 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,15 @@ allprojects { ":runtime-engine:search", ":runtime-engine:subsets", ":runtime-engine:transfer-handlers", + ":runtime-engine:menu-info", + ":runtime-engine:plugins", + ":runtime-engine:views", ":runtime-engine:default-runtime-plugin", + ":runtime-engine:initialization", + ":runtime-frontend:widgets", + ":runtime-frontend:filtering", + ":runtime-frontend:display", + ":runtime-frontend:overlay", ] depProjects = [ ":api", diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/BuiltinClientPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/BuiltinClientPlugin.java index 74c3f3440..0b5ff391f 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/BuiltinClientPlugin.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/BuiltinClientPlugin.java @@ -25,7 +25,7 @@ import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.plugin.common.BuiltinPlugin; import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java index 38390e4c9..cc39f9e3a 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java @@ -44,7 +44,7 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.EntryIngredients; import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.plugin.autocrafting.recipebook.DefaultRecipeBookHandler; import me.shedaniel.rei.plugin.client.categories.*; import me.shedaniel.rei.plugin.client.categories.anvil.DefaultAnvilCategory; diff --git a/fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java b/fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java index b4c410f00..c1abbce5f 100644 --- a/fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java +++ b/fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java @@ -29,7 +29,7 @@ import me.shedaniel.rei.RoughlyEnoughItemsState; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.common.plugins.*; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.init.PluginDetector; import me.shedaniel.rei.impl.init.PrimitivePlatformAdapter; import net.fabricmc.api.EnvType; diff --git a/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplFabric.java b/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplFabric.java index 9c2ba36f3..10c3865ae 100644 --- a/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplFabric.java +++ b/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplFabric.java @@ -25,9 +25,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.widget.QueuedTooltip; +import me.shedaniel.rei.impl.client.gui.widget.TooltipImpl; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; @@ -51,7 +51,7 @@ public void renderTooltipInner(Screen screen, PoseStack matrices, Tooltip toolti Stream sequenceStream = texts.isEmpty() ? Stream.of(component.getAsText().getVisualOrderText()) : texts.stream().map(Language.getInstance()::getVisualOrder); return sequenceStream.map(ClientTooltipComponent::create); - } else if (((QueuedTooltip.TooltipEntryImpl) component).isClientComponent()) { + } else if (((TooltipImpl.TooltipEntryImpl) component).isClientComponent()) { return Stream.of(component.getAsComponent()); } else { return Stream.empty(); diff --git a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java index 4f0fa051b..ce6b594c3 100644 --- a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java +++ b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java @@ -29,7 +29,7 @@ import me.shedaniel.rei.api.common.plugins.PluginView; import me.shedaniel.rei.api.common.plugins.REIPluginProvider; import me.shedaniel.rei.api.common.plugins.REIServerPlugin; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.init.PluginDetector; import me.shedaniel.rei.jeicompat.JEIExtraClientPlugin; import me.shedaniel.rei.jeicompat.JEIExtraPlugin; diff --git a/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java b/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java index a4246ccec..a3eb2ae2f 100644 --- a/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java +++ b/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierConstructorImpl.java @@ -25,13 +25,13 @@ import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.provider.CategoryIdentifierConstructor; import net.minecraft.resources.ResourceLocation; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -public class CategoryIdentifierConstructorImpl implements Internals.CategoryIdentifierConstructor { +public class CategoryIdentifierConstructorImpl implements CategoryIdentifierConstructor { private static final Map> CACHE = new ConcurrentHashMap<>(); @Override diff --git a/runtime-engine/categories/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor b/runtime-engine/categories/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.CategoryIdentifierConstructor similarity index 100% rename from runtime-engine/categories/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals.CategoryIdentifierConstructor rename to runtime-engine/categories/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.CategoryIdentifierConstructor diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java index 25c4aeb16..4f8e6bd62 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java @@ -50,7 +50,6 @@ import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry; import me.shedaniel.rei.api.client.config.entry.EntryStackProvider; -import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.config.CheatingMode; import me.shedaniel.rei.api.client.gui.config.DisplayScreenType; @@ -58,13 +57,12 @@ import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.Internals; import me.shedaniel.rei.impl.client.config.addon.ConfigAddonRegistryImpl; import me.shedaniel.rei.impl.client.config.entries.*; -import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; import me.shedaniel.rei.impl.client.gui.credits.CreditsScreen; -import me.shedaniel.rei.impl.client.gui.performance.entry.PerformanceEntry; import me.shedaniel.rei.impl.common.InternalLogger; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -260,9 +258,6 @@ public static ConfigManagerImpl getInstance() { @Override public void saveConfig() { - if (getConfig().getFilteringRules().stream().noneMatch(FilteringRule::isManual)) { - getConfig().getFilteringRules().add(new ManualFilteringRule()); - } AutoConfig.getConfigHolder(ConfigObjectImpl.class).registerLoadListener((configHolder, configObject) -> { object = configObject; return InteractionResult.PASS; @@ -313,7 +308,7 @@ public Screen getConfigScreen(Screen parent) { ).build(); builder.getOrCreateCategory(new TranslatableComponent("config.roughlyenoughitems.advanced")).getEntries().add(0, feedbackEntry); builder.getOrCreateCategory(new TranslatableComponent("config.roughlyenoughitems.advanced")).getEntries().add(0, new ReloadPluginsEntry(220)); - builder.getOrCreateCategory(new TranslatableComponent("config.roughlyenoughitems.advanced")).getEntries().add(0, new PerformanceEntry(220)); + builder.getOrCreateCategory(new TranslatableComponent("config.roughlyenoughitems.advanced")).getEntries().addAll(0, CollectionUtils.flatMap(Internals.resolveServices(SystemSetup.class), SystemSetup::collectAdvanced)); } return builder.setAfterInitConsumer(screen -> { ConfigAddonRegistryImpl addonRegistry = (ConfigAddonRegistryImpl) ConfigAddonRegistry.getInstance(); diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java index ae2008f0a..e13b0e54d 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java @@ -36,7 +36,7 @@ import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.config.*; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -367,11 +367,6 @@ public boolean shouldFilterDisplays() { return advanced.filtering.shouldFilterDisplays; } - @ApiStatus.Internal - public List getFilteringRules() { - return advanced.filtering.filteringRules; - } - @Override @ApiStatus.Experimental public boolean shouldAsyncSearch() { diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/UncertainDisplayViewingScreen.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/UncertainDisplayViewingScreen.java index 96c3542c6..21ce7ac95 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/UncertainDisplayViewingScreen.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/UncertainDisplayViewingScreen.java @@ -45,7 +45,7 @@ import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java index 9a576014c..58cca6382 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java @@ -25,7 +25,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.gui.widget.DynamicSmoothScrollingEntryListWidget; -import me.shedaniel.rei.impl.client.gui.text.TextTransformations; +import me.shedaniel.rei.impl.client.util.TextTransformations; import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.client.Minecraft; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/BomopofoInputMethod.java b/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/BomopofoInputMethod.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/BomopofoInputMethod.java rename to runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/BomopofoInputMethod.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/JyutpingInputMethod.java b/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/JyutpingInputMethod.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/JyutpingInputMethod.java rename to runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/JyutpingInputMethod.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/PinyinInputMethod.java b/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/PinyinInputMethod.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/PinyinInputMethod.java rename to runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/PinyinInputMethod.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/UniHanInputMethod.java b/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/UniHanInputMethod.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/UniHanInputMethod.java rename to runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/UniHanInputMethod.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/UniHanManager.java b/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/UniHanManager.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/UniHanManager.java rename to runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/impl/client/search/method/unihan/UniHanManager.java diff --git a/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryImpl.java b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryImpl.java index be1ed5225..29c3ae419 100644 --- a/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryImpl.java +++ b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryImpl.java @@ -39,7 +39,7 @@ import me.shedaniel.rei.api.common.registry.ReloadStage; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.Internals; import me.shedaniel.rei.impl.common.InternalLogger; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; diff --git a/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java index 017fc7cf0..4da98dd58 100644 --- a/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java +++ b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/EntryIngredientImpl.java @@ -26,7 +26,7 @@ import com.google.common.collect.Iterators; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.provider.EntryIngredientProvider; import net.minecraft.nbt.ListTag; import org.jetbrains.annotations.ApiStatus; @@ -37,7 +37,7 @@ import java.util.stream.StreamSupport; @ApiStatus.Internal -public class EntryIngredientImpl implements Internals.EntryIngredientProvider { +public class EntryIngredientImpl implements EntryIngredientProvider { @Override public EntryIngredient empty() { return EmptyEntryIngredient.EMPTY; diff --git a/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/EntryStackProviderImpl.java b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/EntryStackProviderImpl.java index 3de5102f6..3cf510df6 100644 --- a/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/EntryStackProviderImpl.java +++ b/runtime-engine/entry-stacks/src/main/java/me/shedaniel/rei/impl/common/entry/stack/EntryStackProviderImpl.java @@ -26,14 +26,14 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.BuiltinEntryTypes; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.provider.EntryStackProvider; import net.minecraft.util.Unit; import org.jetbrains.annotations.ApiStatus; import java.util.Objects; @ApiStatus.Internal -public class EntryStackProviderImpl implements Internals.EntryStackProvider { +public class EntryStackProviderImpl implements EntryStackProvider { @Override public EntryStack empty() { return EmptyEntryStack.EMPTY; diff --git a/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$EntryIngredientProvider b/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.EntryIngredientProvider similarity index 100% rename from runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$EntryIngredientProvider rename to runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.EntryIngredientProvider diff --git a/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$EntryStackProvider b/runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.EntryStackProvider similarity index 100% rename from runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$EntryStackProvider rename to runtime-engine/entry-stacks/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.EntryStackProvider diff --git a/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/NbtHasherProviderImpl.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/NbtHasherProviderImpl.java index 2b7dbe68a..4e5d02b2f 100644 --- a/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/NbtHasherProviderImpl.java +++ b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/NbtHasherProviderImpl.java @@ -26,7 +26,7 @@ import com.google.common.base.Predicates; import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext; import me.shedaniel.rei.api.common.entry.comparison.EntryComparator; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.provider.NbtHasherProvider; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; @@ -35,7 +35,7 @@ import java.util.*; import java.util.function.Predicate; -public class NbtHasherProviderImpl implements Internals.NbtHasherProvider { +public class NbtHasherProviderImpl implements NbtHasherProvider { private final EntryComparator defaultHasher = _provide(); @Override diff --git a/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/DeferringEntryTypeProviderImpl.java b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/DeferringEntryTypeProviderImpl.java index f47dd9e94..bf671635a 100644 --- a/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/DeferringEntryTypeProviderImpl.java +++ b/runtime-engine/entry-types/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/DeferringEntryTypeProviderImpl.java @@ -30,7 +30,7 @@ import me.shedaniel.rei.api.common.entry.type.BuiltinEntryTypes; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.EntryType; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.provider.DeferringEntryTypeProvider; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.resources.ResourceLocation; @@ -42,7 +42,7 @@ import java.util.function.Supplier; @ApiStatus.Internal -public class DeferringEntryTypeProviderImpl implements Internals.DeferringEntryTypeProvider { +public class DeferringEntryTypeProviderImpl implements DeferringEntryTypeProvider { private static final ResourceLocation RENDERING_ID = new ResourceLocation("rendering"); private final Map> typeCache = new ConcurrentHashMap<>(); private final Supplier> empty = Suppliers.memoize(() -> emptyType(BuiltinEntryTypes.EMPTY_ID)); diff --git a/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$DeferringEntryTypeProvider b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.DeferringEntryTypeProvider similarity index 100% rename from runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$DeferringEntryTypeProvider rename to runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.DeferringEntryTypeProvider diff --git a/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$NbtHasherProvider b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.NbtHasherProvider similarity index 100% rename from runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.Internals$NbtHasherProvider rename to runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.NbtHasherProvider diff --git a/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/DelegatingFavoriteEntryProviderImpl.java b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/DelegatingFavoriteEntryProviderImpl.java index 97ede0acf..39b866599 100644 --- a/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/DelegatingFavoriteEntryProviderImpl.java +++ b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/favorites/DelegatingFavoriteEntryProviderImpl.java @@ -27,7 +27,7 @@ import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.client.gui.Renderer; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.provider.DelegatingFavoriteEntryProvider; import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; @@ -37,7 +37,7 @@ import java.util.UUID; import java.util.function.Supplier; -public class DelegatingFavoriteEntryProviderImpl implements ClientInternals.DelegatingFavoriteEntryProvider { +public class DelegatingFavoriteEntryProviderImpl implements DelegatingFavoriteEntryProvider { @Override public FavoriteEntry delegate(Supplier> result, Supplier tag) { return new DelegatedFavoriteEntry(result, tag); diff --git a/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java index 40f1de3a7..6f01cb29b 100644 --- a/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java +++ b/runtime-engine/favorites/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesEntriesManager.java @@ -30,9 +30,9 @@ import me.shedaniel.rei.api.client.overlay.OverlayListWidget; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.ClientInternals; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.favorites.MutableFavoritesList; +import me.shedaniel.rei.impl.client.provider.FavoritesEntriesListProvider; import java.util.AbstractList; import java.util.ArrayList; @@ -41,7 +41,7 @@ import java.util.stream.Stream; import java.util.stream.StreamSupport; -public class FavoritesEntriesManager implements ClientInternals.FavoritesEntriesListProvider { +public class FavoritesEntriesManager implements FavoritesEntriesListProvider { public static List getConfigFavoriteEntries() { ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java index abb5653ae..50580d118 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringAddRuleScreen.java @@ -25,7 +25,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget; -import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleInternal; import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleType; import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRuleType; @@ -153,7 +152,7 @@ public static class DefaultRuleEntry extends RuleEntry { public DefaultRuleEntry(Screen parent, FilteringEntry entry, FilteringRuleInternal rule, BiFunction screenFunction) { super(rule); - this.screenFunction = (screenFunction == null ? rule.getType().createEntryScreen().orElse(null) : screenFunction); + this.screenFunction = (screenFunction == null ? ((FilteringRuleType) rule.getType()).createEntryScreen(rule).orElse(null) : screenFunction); addButton = new Button(0, 0, 20, 20, Component.nullToEmpty(" + "), button -> { entry.edited = true; Minecraft.getInstance().setScreen(this.screenFunction.apply(entry, parent)); diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringConfigEntries.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringConfigEntries.java index cfb2ed8da..133cf2fb1 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringConfigEntries.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringConfigEntries.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.config.entries; import com.google.common.collect.Lists; diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java index 419ccb036..32a13038a 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringRulesScreen.java @@ -27,6 +27,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget; import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleInternal; +import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleType; import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRuleType; import me.shedaniel.rei.impl.client.gui.InternalTextures; import net.minecraft.client.Minecraft; @@ -184,7 +185,7 @@ public static class DefaultRuleEntry extends RuleEntry { public DefaultRuleEntry(FilteringRuleInternal rule, FilteringEntry entry, BiFunction screenFunction) { super(rule); - this.screenFunction = (screenFunction == null ? rule.getType().createEntryScreen().orElse(null) : screenFunction); + this.screenFunction = (screenFunction == null ? ((FilteringRuleType) rule.getType()).createEntryScreen(rule).orElse(null) : screenFunction); configureButton = new Button(0, 0, 20, 20, Component.nullToEmpty(null), button -> { entry.edited = true; Minecraft.getInstance().setScreen(this.screenFunction.apply(entry, Minecraft.getInstance().screen)); diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java index 168b9a19d..1e4df400b 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java @@ -35,16 +35,12 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.REIRuntime; -import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.entry.EntrySerializer; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.widget.BatchedEntryRendererManager; -import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.Button; @@ -64,15 +60,13 @@ import java.util.Set; import java.util.function.Predicate; -import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; - @ApiStatus.Internal public class FilteringScreen extends Screen { protected List> selected = Lists.newArrayList(); protected final ScrollingContainer scrolling = new ScrollingContainer() { @Override public int getMaxScrollHeight() { - return Mth.ceil(entryStacks.size() / (innerBounds.width / (float) EntryListWidget.entrySize())) * EntryListWidget.entrySize() + 28; + return Mth.ceil(entryStacks.size() / (innerBounds.width / 18.0F)) * 18 + 28; } @Override @@ -98,7 +92,7 @@ private record PointPair(Point firstPoint, @Nullable Point secondPoint) {} private List points = new ArrayList<>(); - private OverlaySearchField searchField; + private TextField searchField; private Button selectAllButton; private Button selectNoneButton; private Button hideButton; @@ -111,7 +105,7 @@ private record PointPair(Point firstPoint, @Nullable Point secondPoint) {} public FilteringScreen(FilteringEntry filteringEntry) { super(new TranslatableComponent("config.roughlyenoughitems.filteringScreen")); this.filteringEntry = filteringEntry; - this.searchField = new OverlaySearchField(0, 0, 0, 0); + this.searchField = Widgets.createTextField(new Rectangle()); { Component selectAllText = new TranslatableComponent("config.roughlyenoughitems.filteredEntries.selectAll"); this.selectAllButton = new Button(0, 0, Minecraft.getInstance().font.width(selectAllText) + 10, 20, selectAllText, button -> { @@ -161,12 +155,11 @@ public FilteringScreen(FilteringEntry filteringEntry) { this.parent = null; }); } - this.searchField.isMain = false; } private static Rectangle updateInnerBounds(Rectangle bounds) { - int width = Math.max(Mth.floor((bounds.width - 2 - 6) / (float) EntryListWidget.entrySize()), 1); - return new Rectangle((int) (bounds.getCenterX() - width * EntryListWidget.entrySize() / 2f), bounds.y + 5, width * EntryListWidget.entrySize(), bounds.height); + int width = Math.max(Mth.floor((bounds.width - 2 - 6) / 18.0F), 1); + return new Rectangle((int) (bounds.getCenterX() - width * 18 / 2f), bounds.y + 5, width * 18, bounds.height); } public Rectangle getBounds() { @@ -183,7 +176,7 @@ public void init() { this.selectNoneButton.x = 4 + selectAllButton.getWidth(); this.selectNoneButton.y = bounds.getMaxY() - 22; int searchFieldWidth = Math.max(bounds.width - (selectNoneButton.x + selectNoneButton.getWidth() + hideButton.getWidth() + showButton.getWidth() + 12), 100); - this.searchField.getBounds().setBounds(selectNoneButton.x + selectNoneButton.getWidth() + 4, bounds.getMaxY() - 21, searchFieldWidth, 18); + this.searchField.asWidget().getBounds().setBounds(selectNoneButton.x + selectNoneButton.getWidth() + 4, bounds.getMaxY() - 21, searchFieldWidth, 18); this.hideButton.x = bounds.getMaxX() - hideButton.getWidth() - showButton.getWidth() - 4; this.hideButton.y = bounds.getMaxY() - 22; this.showButton.x = bounds.getMaxX() - showButton.getWidth() - 2; @@ -219,27 +212,27 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { return; ScissorsHandler.INSTANCE.scissor(bounds); for (FilteringListEntry entry : entries) - entry.clearStacks(); - int skip = Math.max(0, Mth.floor(scrolling.scrollAmount() / (float) EntryListWidget.entrySize())); - int nextIndex = skip * innerBounds.width / EntryListWidget.entrySize(); + entry.slot.clearEntries(); + int skip = Math.max(0, Mth.floor(scrolling.scrollAmount() / 18.0F)); + int nextIndex = skip * innerBounds.width / 18; int i = nextIndex; - BatchedEntryRendererManager manager = new BatchedEntryRendererManager(); + BatchedSlots slots = Widgets.createBatchedSlots(); for (; i < entryStacks.size(); i++) { EntryStack stack = entryStacks.get(i); FilteringListEntry entry = entries.get(nextIndex); entry.getBounds().y = entry.backupY - scrolling.scrollAmountInt(); if (entry.getBounds().y > bounds.getMaxY()) break; - entry.entry(stack); - manager.add(entry); + entry.slot.entry(stack); + slots.add(entry.slot); nextIndex++; } - manager.render(matrices, mouseX, mouseY, delta); + slots.render(matrices, mouseX, mouseY, delta); updatePosition(delta); scrolling.renderScrollBar(0, 1.0F, REIRuntime.getInstance().isDarkThemeEnabled() ? 0.8F : 1F); matrices.pushPose(); matrices.translate(0, 0, 300); - this.searchField.laterRender(matrices, mouseX, mouseY, delta); + this.searchField.asWidget().render(matrices, mouseX, mouseY, delta); this.selectAllButton.render(matrices, mouseX, mouseY, delta); this.selectNoneButton.render(matrices, mouseX, mouseY, delta); this.hideButton.render(matrices, mouseX, mouseY, delta); @@ -267,7 +260,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { this.backButton.render(matrices, mouseX, mouseY, delta); if (tooltip != null) { - ((ScreenOverlayImpl) REIRuntime.getInstance().getOverlay().get()).renderTooltip(matrices, tooltip); + REIRuntime.getInstance().getOverlay().get().renderTooltip(matrices, tooltip); } this.font.drawShadow(matrices, this.title.getVisualOrderText(), this.width / 2.0F - this.font.width(this.title) / 2.0F, 12.0F, -1); @@ -331,18 +324,17 @@ public boolean matches(EntryStack stack) { } public void updateEntriesPosition() { - int entrySize = EntryListWidget.entrySize(); this.innerBounds = updateInnerBounds(getBounds()); - int width = innerBounds.width / entrySize; - int pageHeight = innerBounds.height / entrySize; + int width = innerBounds.width / 18; + int pageHeight = innerBounds.height / 18; int slotsToPrepare = Math.max(entryStacks.size() * 3, width * pageHeight * 3); int currentX = 0; int currentY = 0; List entries = Lists.newArrayList(); for (int i = 0; i < slotsToPrepare; i++) { - int xPos = currentX * entrySize + innerBounds.x; - int yPos = currentY * entrySize + innerBounds.y; - entries.add(new FilteringListEntry(xPos, yPos, entrySize)); + int xPos = currentX * 18 + innerBounds.x; + int yPos = currentY * 18 + innerBounds.y; + entries.add(new FilteringListEntry(xPos, yPos)); currentX++; if (currentX >= width) { currentX = 0; @@ -351,7 +343,7 @@ public void updateEntriesPosition() { } this.entries = entries; this.elements = Lists.newArrayList(entries); - this.elements.add(searchField); + this.elements.add(searchField.asWidget()); } @Override @@ -365,7 +357,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { return true; if (getBounds().contains(mouseX, mouseY)) { - if (searchField.mouseClicked(mouseX, mouseY, button)) { + if (searchField.asWidget().mouseClicked(mouseX, mouseY, button)) { this.points.clear(); return true; } else if (selectAllButton.mouseClicked(mouseX, mouseY, button)) { @@ -450,32 +442,36 @@ public boolean mouseScrolled(double double_1, double double_2, double double_3) return true; } - private class FilteringListEntry extends EntryWidget { + private class FilteringListEntry extends DelegateWidget { + private final Slot slot; private int backupY; private boolean filtered = false; private boolean dirty = true; - private FilteringListEntry(int x, int y, int entrySize) { - super(new Point(x, y)); + private FilteringListEntry(int x, int y) { + super(Widgets.createSlot(new Point(x, y)) + .noFavoritesInteractable() + .noInteractable() + .disableBackground() + .disableTooltips() + .disableHighlight()); + this.slot = (Slot) widget; this.backupY = y; - getBounds().width = getBounds().height = entrySize; - interactableFavorites(false); - interactable(false); - noHighlight(); - } - - @Override - public boolean containsMouse(double mouseX, double mouseY) { - return super.containsMouse(mouseX, mouseY) && FilteringScreen.this.getBounds().contains(mouseX, mouseY); } @Override - protected void drawExtra(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (isSelected()) { - Rectangle bounds = getBounds(); - RenderSystem.disableDepthTest(); - fillGradient(matrices, bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), 0x896b70fa, 0x896b70fa); - RenderSystem.enableDepthTest(); + public void render(PoseStack poseStack, int mouseX, int mouseY, float delta) { + drawBackground(poseStack, mouseX, mouseY, delta); + super.render(poseStack, mouseX, mouseY, delta); + drawExtra(poseStack, mouseX, mouseY, delta); + + if (searchField.asWidget().containsMouse(mouseX, mouseY)) + return; + if (containsMouse(mouseX, mouseY)) { + Tooltip tooltip = slot.getCurrentTooltip(new Point(mouseX, mouseY)); + if (tooltip != null) { + FilteringScreen.this.tooltip = tooltip; + } } } @@ -485,29 +481,27 @@ public boolean isSelected() { public boolean isFiltered() { if (dirty) { - filtered = filteringEntry.configFiltered.contains(getCurrentEntry()); + filtered = filteringEntry.configFiltered.contains(slot.getCurrentEntry()); dirty = false; } return filtered; } - @Override - protected void drawBackground(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (isFiltered()) { + private void drawExtra(PoseStack matrices, int mouseX, int mouseY, float delta) { + if (isSelected()) { Rectangle bounds = getBounds(); RenderSystem.disableDepthTest(); - fillGradient(matrices, bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), 0xffff0000, 0xffff0000); + fillGradient(matrices, bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), 0x896b70fa, 0x896b70fa); RenderSystem.enableDepthTest(); } } - @Override - protected void queueTooltip(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (searchField.containsMouse(mouseX, mouseY)) - return; - Tooltip tooltip = getCurrentTooltip(new Point(mouseX, mouseY)); - if (tooltip != null) { - FilteringScreen.this.tooltip = tooltip; + private void drawBackground(PoseStack matrices, int mouseX, int mouseY, float delta) { + if (isFiltered()) { + Rectangle bounds = getBounds(); + RenderSystem.disableDepthTest(); + fillGradient(matrices, bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), 0xffff0000, 0xffff0000); + RenderSystem.enableDepthTest(); } } } diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleInternal.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleInternal.java index ab5dd38f3..3f1636136 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleInternal.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleInternal.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.entry.filtering; import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleType.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleType.java index 6a7d76937..40e665d89 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleType.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRuleType.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.entry.filtering; import com.google.common.collect.BiMap; @@ -38,7 +61,7 @@ static FilteringRule read(CompoundTag tag) { T createFromTag(CompoundTag tag); @ApiStatus.Internal - default Optional> createEntryScreen() { + default Optional> createEntryScreen(T rule) { return Optional.empty(); } diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java index 7fe5a684b..2ed30f93b 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.entry.filtering.rules; import com.google.common.collect.Lists; diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java index d9d35677a..398739b08 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.entry.filtering.rules; import com.google.common.base.Suppliers; diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java index 1fece30f3..b1f932022 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java @@ -26,6 +26,7 @@ import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.widgets.BatchedSlots; import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; @@ -35,7 +36,6 @@ import me.shedaniel.rei.impl.client.config.entries.FilteringEntry; import me.shedaniel.rei.impl.client.config.entries.FilteringRuleOptionsScreen; import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleType; -import me.shedaniel.rei.impl.client.gui.widget.BatchedEntryRendererManager; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.ChatFormatting; @@ -57,8 +57,6 @@ import java.util.function.Supplier; import java.util.stream.Collectors; -import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; - @Environment(EnvType.CLIENT) public class SearchFilteringRuleType implements FilteringRuleType { public static final SearchFilteringRuleType INSTANCE = new SearchFilteringRuleType(); @@ -93,8 +91,8 @@ public Component getSubtitle() { } @Override - public Optional> createEntryScreen() { - return Optional.of((entry, screen) -> new FilteringRuleOptionsScreen(entry, this, screen) { + public Optional> createEntryScreen(SearchFilteringRule rule) { + return Optional.of((entry, screen) -> new FilteringRuleOptionsScreen(entry, rule, screen) { TextFieldRuleEntry entry = null; BooleanRuleEntry show = null; List entryStacks = new ArrayList<>(); @@ -146,19 +144,18 @@ public EntryStacksRuleEntry(SearchFilteringRule rule, Supplier> entry @Override public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean isHovered, float delta) { - BatchedEntryRendererManager manager = new BatchedEntryRendererManager(); - int entrySize = EntryListWidget.entrySize(); - int width = entryWidth / entrySize; + BatchedSlots slots = Widgets.createBatchedSlots(); + int width = entryWidth / 18; int i = 0; for (Slot stack : entryStacks.get()) { - stack.getBounds().setLocation(x + (i % width) * entrySize, y + (i / width) * entrySize); + stack.getBounds().setLocation(x + (i % width) * 18, y + (i / width) * 18); if (stack.getBounds().getMaxY() >= 0 && stack.getBounds().getY() <= Minecraft.getInstance().getWindow().getGuiScaledHeight()) { - manager.add(stack); + slots.add(stack); } i++; } - manager.render(matrices, mouseX, mouseY, delta); - totalHeight = (i / width + 1) * entrySize; + slots.render(matrices, mouseX, mouseY, delta); + totalHeight = (i / width + 1) * 18; } @Override diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java index 29c212350..f7bcc5ac3 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java @@ -29,18 +29,16 @@ import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.config.entry.EntryStackProvider; +import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.registry.entry.PreFilteredEntryList; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.ClientInternals; -import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringCacheImpl; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringContextImpl; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringContextType; -import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringRuleType; +import me.shedaniel.rei.impl.client.ClientInternals; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; +import me.shedaniel.rei.impl.client.entry.filtering.*; +import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; import me.shedaniel.rei.impl.common.InternalLogger; import me.shedaniel.rei.impl.common.util.HashedEntryStackWrapper; import org.apache.commons.lang3.mutable.MutableLong; @@ -140,14 +138,17 @@ public void onReFilter(List> stacks) { FilteringContextImpl context = new FilteringContextImpl(stacks); FilteringCacheImpl cache = new FilteringCacheImpl(); - List> rules = ((ConfigObjectImpl) ConfigObject.getInstance()).getFilteringRules(); + List rules = CollectionUtils.concatUnmodifiable( + List.of(new ManualFilteringRule()), + (List) ConfigManagerInternal.getInstance().get("advanced.filtering.filteringRules") + ); Stopwatch innerStopwatch = Stopwatch.createStarted(); for (int i = rules.size() - 1; i >= 0; i--) { innerStopwatch.reset().start(); - FilteringRule rule = rules.get(i); + FilteringRuleInternal rule = (FilteringRuleInternal) rules.get(i); cache.setCache(rule, rule.prepareCache(true)); context.handleResult(rule.processFilteredStacks(context, cache, true)); - InternalLogger.getInstance().debug("Refiltered rule [%s] in %s.", FilteringRuleType.REGISTRY.inverse().get(rule).toString(), innerStopwatch.stop().toString()); + InternalLogger.getInstance().debug("Refiltered rule [%s] in %s.", FilteringRuleType.REGISTRY.inverse().get(rule.getType()).toString(), innerStopwatch.stop().toString()); } Set hiddenStacks = context.stacks.get(FilteringContextType.HIDDEN); @@ -175,9 +176,12 @@ public Collection> refilterNew(boolean warn, Collection> rules = ((ConfigObjectImpl) ConfigObject.getInstance()).getFilteringRules(); + List rules = CollectionUtils.concatUnmodifiable( + List.of(new ManualFilteringRule()), + (List) ConfigManagerInternal.getInstance().get("advanced.filtering.filteringRules") + ); for (int i = rules.size() - 1; i >= 0; i--) { - FilteringRule rule = rules.get(i); + FilteringRuleInternal rule = (FilteringRuleInternal) rules.get(i); cache.setCache(rule, rule.prepareCache(true)); context.handleResult(rule.processFilteredStacks(context, cache, true)); } diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java index 9618e9171..c5c835b19 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/plugin/client/runtime/FilteredStacksVisibilityHandler.java @@ -29,8 +29,6 @@ import it.unimi.dsi.fastutil.objects.Reference2BooleanMaps; import it.unimi.dsi.fastutil.objects.Reference2BooleanOpenHashMap; import me.shedaniel.rei.api.client.config.ConfigObject; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringCache; -import me.shedaniel.rei.impl.client.entry.filtering.FilteringContextType; import me.shedaniel.rei.api.client.entry.filtering.FilteringRule; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; @@ -39,39 +37,35 @@ import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.client.config.ConfigObjectImpl; +import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.entry.filtering.*; +import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule; import me.shedaniel.rei.impl.client.entry.type.EntryRegistryListener; import me.shedaniel.rei.impl.common.InternalLogger; import java.util.List; import java.util.function.Predicate; -public class FilteredStacksVisibilityHandler implements REIClientPlugin, EntryRegistryListener, DisplayVisibilityPredicate { +public class FilteredStacksVisibilityHandler implements REIClientPlugin, EntryRegistryListener { private static boolean checkHiddenStacks; private static Reference2BooleanMap visible = Reference2BooleanMaps.synchronize(new Reference2BooleanOpenHashMap<>()); - private static List> filteringRules; + private static List filteringRules; private static FilteringCacheImpl cache; private static final Predicate displayPredicate = FilteredStacksVisibilityHandler::checkHiddenStacks; - @Override - public EventResult handleDisplay(DisplayCategory category, Display display) { - if (checkHiddenStacks) { - return visible.computeIfAbsent(display, displayPredicate) ? EventResult.pass() : EventResult.interruptFalse(); - } - - return EventResult.pass(); - } - public static void reset() { checkHiddenStacks = ConfigObject.getInstance().shouldFilterDisplays(); visible = Reference2BooleanMaps.synchronize(new Reference2BooleanOpenHashMap<>()); if (checkHiddenStacks) { - filteringRules = ((ConfigObjectImpl) ConfigObject.getInstance()).getFilteringRules(); + filteringRules = CollectionUtils.concatUnmodifiable( + List.of(new ManualFilteringRule()), + (List) ConfigManagerInternal.getInstance().get("advanced.filtering.filteringRules") + ); cache = new FilteringCacheImpl(); for (int i = filteringRules.size() - 1; i >= 0; i--) { - FilteringRule rule = filteringRules.get(i); + FilteringRuleInternal rule = (FilteringRuleInternal) filteringRules.get(i); cache.setCache(rule, rule.prepareCache(false)); } @@ -111,10 +105,10 @@ private static boolean checkHiddenStacks(Display display) { return true; } - private static boolean isEntryIngredientAllHidden(EntryIngredient ingredient, FilteringCache cache, List> rules) { + private static boolean isEntryIngredientAllHidden(EntryIngredient ingredient, FilteringCache cache, List rules) { FilteringContextImpl context = new FilteringContextImpl(false, ingredient); for (int i = rules.size() - 1; i >= 0; i--) { - FilteringRule rule = rules.get(i); + FilteringRuleInternal rule = (FilteringRuleInternal) rules.get(i); context.handleResult(rule.processFilteredStacks(context, cache, false)); } return context.stacks.get(FilteringContextType.SHOWN).isEmpty() && context.stacks.get(FilteringContextType.DEFAULT).isEmpty(); @@ -128,11 +122,17 @@ public void onReFilter(List> stacks) { @Override public void registerDisplays(DisplayRegistry registry) { reset(); - registry.registerVisibilityPredicate(this); + registry.registerVisibilityPredicate(new DisplayPredicate()); } - @Override - public double getPriority() { - return 0; + private class DisplayPredicate implements DisplayVisibilityPredicate { + @Override + public EventResult handleDisplay(DisplayCategory category, Display display) { + if (checkHiddenStacks) { + return visible.computeIfAbsent(display, displayPredicate) ? EventResult.pass() : EventResult.interruptFalse(); + } + + return EventResult.pass(); + } } } diff --git a/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/client/init/CoreClientInitialization.java b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/client/init/CoreClientInitialization.java new file mode 100644 index 000000000..44df96bc4 --- /dev/null +++ b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/client/init/CoreClientInitialization.java @@ -0,0 +1,159 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.init; + +import dev.architectury.event.Event; +import dev.architectury.event.EventFactory; +import dev.architectury.event.EventResult; +import dev.architectury.event.events.client.ClientGuiEvent; +import dev.architectury.event.events.client.ClientRecipeUpdateEvent; +import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigManager; +import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry; +import me.shedaniel.rei.api.client.entry.renderer.EntryRendererRegistry; +import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; +import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; +import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; +import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry; +import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; +import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; +import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry; +import me.shedaniel.rei.api.client.search.SearchProvider; +import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; +import me.shedaniel.rei.api.client.subsets.SubsetsRegistry; +import me.shedaniel.rei.api.client.view.Views; +import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.api.common.plugins.PluginView; +import me.shedaniel.rei.api.common.plugins.REIPluginProvider; +import me.shedaniel.rei.api.common.registry.ReloadStage; +import me.shedaniel.rei.impl.client.ClientInternals; +import me.shedaniel.rei.impl.common.InternalLogger; +import me.shedaniel.rei.impl.common.init.CoreInitialization; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import org.apache.commons.lang3.mutable.MutableLong; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +import java.lang.reflect.InvocationTargetException; +import java.util.List; +import java.util.concurrent.*; + +@ApiStatus.Internal +public class CoreClientInitialization { + public static final Event PRE_UPDATE_RECIPES = EventFactory.createLoop(); + private static final ExecutorService RELOAD_PLUGINS = Executors.newSingleThreadScheduledExecutor(task -> { + Thread thread = new Thread(task, "REI-ReloadPlugins"); + thread.setDaemon(true); + thread.setUncaughtExceptionHandler(($, exception) -> { + InternalLogger.getInstance().throwException(exception); + }); + return thread; + }); + private static final List> RELOAD_TASKS = new CopyOnWriteArrayList<>(); + + public void onInitializeClient() { + attachClientInternals(); + loadTestPlugins(); + + MutableLong startReload = new MutableLong(-1); + MutableLong endReload = new MutableLong(-1); + PRE_UPDATE_RECIPES.register(recipeManager -> { + PluginReloaderImpl.PERFORMANCE_LOGGER.clear(); + CoreInitialization.reloadPlugins(startReload, ReloadStage.START); + }); + ClientRecipeUpdateEvent.EVENT.register(recipeManager -> { + CoreInitialization.reloadPlugins(endReload, ReloadStage.END); + }); + ClientGuiEvent.INIT_PRE.register((screen, access) -> { + List stages = PluginManager.getInstance().view().getObservedStages(); + + if (Minecraft.getInstance().level != null && Minecraft.getInstance().player != null && stages.contains(ReloadStage.START) + && !stages.contains(ReloadStage.END) && !PluginManager.areAnyReloading() && screen instanceof AbstractContainerScreen) { + for (Future task : RELOAD_TASKS) { + if (!task.isDone()) { + return EventResult.pass(); + } + } + + InternalLogger.getInstance().error("Detected missing stage: END! This is possibly due to issues during client recipe reload! REI will force a reload of the recipes now!"); + CoreInitialization.reloadPlugins(endReload, ReloadStage.END); + } + + return EventResult.pass(); + }); + } + + public static void attachClientInternals() { + PluginManager manager = ClientInternals.getPluginManager(); + manager.registerReloadable(EntryRendererRegistry.class); + manager.registerReloadable(Views.class); + manager.registerReloadable(InputMethodRegistry.class); + manager.registerReloadable(SearchProvider.class); + manager.registerReloadable(ConfigManager.class); + manager.registerReloadable(EntryRegistry.class); + manager.registerReloadable(CollapsibleEntryRegistry.class); + manager.registerReloadable(CategoryRegistry.class); + manager.registerReloadable(DisplayRegistry.class); + manager.registerReloadable(ScreenRegistry.class); + manager.registerReloadable(FavoriteEntryType.Registry.class); + manager.registerReloadable(SubsetsRegistry.class); + manager.registerReloadable(TransferHandlerRegistry.class); + manager.registerReloadable(REIRuntime.class); + manager.registerReloadable(ConfigAddonRegistry.class); + } + + private void loadTestPlugins() { + if (System.getProperty("rei.test", "false").equals("true")) { + try { + PluginView.getClientInstance().registerPlugin((REIPluginProvider) Class.forName("me.shedaniel.rei.plugin.test.REITestPlugin") + .getDeclaredConstructor() + .newInstance()); + } catch (InstantiationException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } + } + + public static boolean reloadPluginsClient(@Nullable ReloadStage start) { + if (ConfigObject.getInstance().doesRegisterRecipesInAnotherThread()) { + Future[] futures = new Future[1]; + CompletableFuture future = CompletableFuture.runAsync(() -> CoreInitialization._reloadPlugins(start), RELOAD_PLUGINS) + .whenComplete((unused, throwable) -> { + // Remove the future from the list of futures + if (futures[0] != null) { + RELOAD_TASKS.remove(futures[0]); + futures[0] = null; + } + }); + futures[0] = future; + RELOAD_TASKS.add(future); + return true; + } + + return false; + } +} diff --git a/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java new file mode 100644 index 000000000..c5945ead1 --- /dev/null +++ b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java @@ -0,0 +1,113 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.init; + +import dev.architectury.platform.Platform; +import dev.architectury.registry.ReloadListenerRegistry; +import dev.architectury.utils.Env; +import me.shedaniel.rei.api.common.display.DisplaySerializerRegistry; +import me.shedaniel.rei.api.common.entry.comparison.FluidComparatorRegistry; +import me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry; +import me.shedaniel.rei.api.common.entry.settings.EntrySettingsAdapterRegistry; +import me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry; +import me.shedaniel.rei.api.common.fluid.FluidSupportProvider; +import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.api.common.plugins.REIPlugin; +import me.shedaniel.rei.api.common.plugins.REIServerPlugin; +import me.shedaniel.rei.api.common.registry.RecipeManagerContext; +import me.shedaniel.rei.api.common.registry.ReloadStage; +import me.shedaniel.rei.api.common.transfer.info.MenuInfoRegistry; +import me.shedaniel.rei.impl.common.Internals; +import me.shedaniel.rei.impl.client.init.CoreClientInitialization; +import me.shedaniel.rei.impl.common.InternalLogger; +import net.minecraft.server.packs.PackType; +import net.minecraft.util.Unit; +import org.apache.commons.lang3.mutable.MutableLong; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +@ApiStatus.Internal +public class CoreInitialization { + public void onInitialize() { + attachCommonInternals(); + + if (Platform.getEnvironment() == Env.SERVER) { + MutableLong lastReload = new MutableLong(-1); + ReloadListenerRegistry.register(PackType.SERVER_DATA, (preparationBarrier, resourceManager, profilerFiller, profilerFiller2, executor, executor2) -> { + return preparationBarrier.wait(Unit.INSTANCE).thenRunAsync(PluginManager::reloadAll, executor2); + }); + } + } + + public static void attachCommonInternals() { + PluginManager> manager = PluginManager.getInstance(); + manager.registerReloadable(EntryTypeRegistry.class); + manager.registerReloadable(EntrySettingsAdapterRegistry.class); + manager.registerReloadable(RecipeManagerContext.class); + manager.registerReloadable(ItemComparatorRegistry.class); + manager.registerReloadable(FluidComparatorRegistry.class); + manager.registerReloadable(DisplaySerializerRegistry.class); + manager.registerReloadable(FluidSupportProvider.class); + PluginManager serverManager = PluginManager.getServerInstance(); + serverManager.registerReloadable(MenuInfoRegistry.class); + Internals.attachInstanceSupplier((Runnable) () -> reloadPlugins(null, null), "reloadREI"); + } + + public static void _reloadPlugins(@Nullable ReloadStage stage) { + if (stage == null) { + for (ReloadStage reloadStage : ReloadStage.values()) { + _reloadPlugins(reloadStage); + } + return; + } + try { + for (PluginManager> instance : PluginManager.getActiveInstances()) { + instance.view().pre(stage); + } + for (PluginManager> instance : PluginManager.getActiveInstances()) { + instance.startReload(stage); + } + for (PluginManager> instance : PluginManager.getActiveInstances()) { + instance.view().post(stage); + } + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + + public static void reloadPlugins(MutableLong lastReload, @Nullable ReloadStage start) { + if (lastReload != null) { + if (lastReload.getValue() > 0 && System.currentTimeMillis() - lastReload.getValue() <= 5000) { + InternalLogger.getInstance().warn("Suppressing Reload Plugins of stage " + start); + return; + } + lastReload.setValue(System.currentTimeMillis()); + } + if (start == null) PluginReloaderImpl.PERFORMANCE_LOGGER.clear(); + if (Platform.getEnvironment() == Env.CLIENT) { + if (CoreClientInitialization.reloadPluginsClient(start)) return; + } + _reloadPlugins(start); + } +} diff --git a/runtime-engine/logging/src/main/java/me/shedaniel/rei/impl/common/logging/LoggerInitializer.java b/runtime-engine/logging/src/main/java/me/shedaniel/rei/impl/common/logging/LoggerInitializer.java index 88ad97977..78b3f447a 100644 --- a/runtime-engine/logging/src/main/java/me/shedaniel/rei/impl/common/logging/LoggerInitializer.java +++ b/runtime-engine/logging/src/main/java/me/shedaniel/rei/impl/common/logging/LoggerInitializer.java @@ -25,7 +25,7 @@ import com.google.common.collect.ImmutableList; import dev.architectury.platform.Platform; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.Internals; import me.shedaniel.rei.impl.common.InternalLogger; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/InputSlotCrafter.java b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/InputSlotCrafter.java similarity index 92% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/InputSlotCrafter.java rename to runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/InputSlotCrafter.java index bb195a8f5..e8a252389 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/InputSlotCrafter.java +++ b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/InputSlotCrafter.java @@ -27,6 +27,7 @@ import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; +import me.shedaniel.rei.api.common.entry.InputIngredient; import me.shedaniel.rei.api.common.transfer.RecipeFinder; import me.shedaniel.rei.api.common.transfer.info.MenuInfo; import me.shedaniel.rei.api.common.transfer.info.MenuInfoContext; @@ -36,17 +37,15 @@ import net.minecraft.core.NonNullList; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; -import net.minecraft.world.Container; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; import org.jetbrains.annotations.Nullable; import java.util.Iterator; -import java.util.List; import java.util.Objects; -public class InputSlotCrafter implements MenuInfoContext { +public class InputSlotCrafter implements MenuInfoContext { protected CategoryIdentifier category; protected T container; protected MenuInfo menuInfo; @@ -63,8 +62,8 @@ public void setMenuInfo(MenuInfo menuInfo) { this.menuInfo = menuInfo; } - public static InputSlotCrafter start(CategoryIdentifier category, T menu, ServerPlayer player, CompoundTag display, boolean hasShift) { - InputSlotCrafter crafter = new InputSlotCrafter<>(category, menu); + public static InputSlotCrafter start(CategoryIdentifier category, T menu, ServerPlayer player, CompoundTag display, boolean hasShift) { + InputSlotCrafter crafter = new InputSlotCrafter<>(category, menu); MenuInfo menuInfo = Objects.requireNonNull(MenuInfoRegistry.getInstance().get(category, menu, crafter, display), "Container Info does not exist on the server!"); crafter.setMenuInfo(menuInfo); crafter.fillInputSlots(player, hasShift); @@ -82,8 +81,8 @@ private void fillInputSlots(ServerPlayer player, boolean hasShift) { RecipeFinder recipeFinder = new RecipeFinder(); this.menuInfo.getRecipeFinderPopulator().populate(this, recipeFinder); NonNullList ingredients = NonNullList.create(); - for (List itemStacks : this.menuInfo.getInputs(this, true)) { - ingredients.add(CollectionUtils.toIngredient(itemStacks)); + for (InputIngredient itemStacks : this.menuInfo.getInputsIndexed(this, true)) { + ingredients.add(CollectionUtils.toIngredient(itemStacks.get())); } if (recipeFinder.findRecipe(ingredients, null)) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/MenuInfoRegistryImpl.java b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/MenuInfoRegistryImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/transfer/MenuInfoRegistryImpl.java rename to runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/MenuInfoRegistryImpl.java diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java rename to runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java diff --git a/runtime-engine/menu-info/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.transfer.info.MenuInfoRegistry b/runtime-engine/menu-info/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.transfer.info.MenuInfoRegistry new file mode 100644 index 000000000..da0b762f6 --- /dev/null +++ b/runtime-engine/menu-info/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.transfer.info.MenuInfoRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.transfer.MenuInfoRegistryImpl \ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java rename to runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java index 048a20bce..bdbd7f02e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java +++ b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/PerformanceScreen.java @@ -26,11 +26,11 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.datafixers.util.Pair; import me.shedaniel.clothconfig2.gui.widget.DynamicElementListWidget; -import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.common.plugins.REIPlugin; import me.shedaniel.rei.api.common.plugins.REIPluginProvider; import me.shedaniel.rei.impl.client.gui.performance.entry.PerformanceEntryImpl; import me.shedaniel.rei.impl.client.gui.performance.entry.SubCategoryListEntry; +import me.shedaniel.rei.impl.common.plugins.PluginReloaderImpl; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -146,7 +146,7 @@ public void init() { } list = new PerformanceEntryListWidget(); long[] totalTime = {0}; - RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.getStages().forEach((stage, inner) -> { + PluginReloaderImpl.PERFORMANCE_LOGGER.getStages().forEach((stage, inner) -> { List entries = new ArrayList<>(); inner.times().forEach((obj, time) -> { entries.add(new PerformanceEntryImpl(new TextComponent(obj instanceof Pair ? ((Pair, REIPlugin>) obj).getFirst().getPluginProviderName() : Objects.toString(obj)), time)); diff --git a/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceConfigEntries.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceConfigEntries.java new file mode 100644 index 000000000..56c47c7d9 --- /dev/null +++ b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceConfigEntries.java @@ -0,0 +1,37 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.performance.entry; + +import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; + +import java.util.Collection; +import java.util.List; + +public class PerformanceConfigEntries implements ConfigManagerInternal.SystemSetup { + @Override + public Collection> collectAdvanced() { + return List.of(new PerformanceEntry(200)); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceEntry.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceEntry.java rename to runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceEntryImpl.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceEntryImpl.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceEntryImpl.java rename to runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/PerformanceEntryImpl.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/SubCategoryListEntry.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/SubCategoryListEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/SubCategoryListEntry.java rename to runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/client/gui/performance/entry/SubCategoryListEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java rename to runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java index cb0472283..a4af54642 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java +++ b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java @@ -131,6 +131,11 @@ public FluentIterable> getPluginWrapped() { plugin -> new PluginWrapper<>(plugin, input)))); } + @Override + public List getObservedStages() { + return Collections.unmodifiableList(reloader.getObservedStages()); + } + public PluginReloaderImpl

getReloader() { return reloader; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java similarity index 94% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java rename to runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java index 52bcae1f5..8078879ac 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java +++ b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java @@ -29,14 +29,14 @@ import dev.architectury.utils.Env; import dev.architectury.utils.EnvExecutor; import dev.architectury.utils.GameInstance; -import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.plugins.REIPlugin; import me.shedaniel.rei.api.common.registry.ReloadStage; import me.shedaniel.rei.api.common.registry.Reloadable; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.common.InternalLogger; -import me.shedaniel.rei.impl.common.logging.performance.PerformanceLogger; +import me.shedaniel.rei.impl.common.plugins.performance.PerformanceLogger; +import me.shedaniel.rei.impl.common.plugins.performance.PerformanceLoggerImpl; import net.minecraft.client.Minecraft; import net.minecraft.server.MinecraftServer; import org.apache.commons.lang3.tuple.MutablePair; @@ -50,6 +50,7 @@ import java.util.function.BiConsumer; public class PluginReloaderImpl

> { + public static final PerformanceLogger PERFORMANCE_LOGGER = new PerformanceLoggerImpl(); @Nullable private ReloadStage reloading = null; private List observedStages = new ArrayList<>(); @@ -139,7 +140,7 @@ public void pre(PluginManager

manager, Class

pluginClass, List::getPriority).reversed()); Collections.reverse(plugins); try (SectionClosable preRegister = section(stage, "pre-register/"); - PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage("Pre Registration")) { + PerformanceLogger.Plugin perfLogger = PERFORMANCE_LOGGER.stage("Pre Registration")) { pluginSection(stage, "pre-register/", plugins, null, (plugin, sink) -> { try (PerformanceLogger.Plugin.Inner inner = perfLogger.plugin(new Pair<>(plugin.provider(), plugin.plugin()))) { sink.accept(false, () -> { @@ -159,7 +160,7 @@ public void post(PluginManager

manager, Class

pluginClass, List::getPriority).reversed()); Collections.reverse(plugins); try (SectionClosable postRegister = section(stage, "post-register/"); - PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage("Post Registration")) { + PerformanceLogger.Plugin perfLogger = PERFORMANCE_LOGGER.stage("Post Registration")) { pluginSection(stage, "post-register/", plugins, null, (plugin, sink) -> { try (PerformanceLogger.Plugin.Inner inner = perfLogger.plugin(new Pair<>(plugin.provider(), plugin.plugin()))) { sink.accept(false, () -> { @@ -184,7 +185,7 @@ public void startReload(PluginManager

manager, Class

pluginClass, List reloadable : manager.getReloadables()) { Class reloadableClass = reloadable.getClass(); try (SectionClosable startReload = section(stage, "start-reload/" + name(reloadableClass) + "/"); @@ -206,7 +207,7 @@ public void startReload(PluginManager

manager, Class

pluginClass, List reloadable : manager.getReloadables()) { Class reloadableClass = reloadable.getClass(); try (SectionClosable reloadablePlugin = section(stage, "reloadable-plugin/" + name(reloadableClass) + "/"); - PerformanceLogger.Plugin perfLogger = RoughlyEnoughItemsCore.PERFORMANCE_LOGGER.stage(name(reloadableClass))) { + PerformanceLogger.Plugin perfLogger = PERFORMANCE_LOGGER.stage(name(reloadableClass))) { try (PerformanceLogger.Plugin.Inner inner = perfLogger.stage("reloadable-plugin/" + name(reloadableClass) + "/prompt-others-before")) { for (Reloadable

listener : manager.getReloadables()) { try { @@ -257,7 +258,7 @@ public void startReload(PluginManager

manager, Class

pluginClass, List reloadable : manager.getReloadables()) { Class reloadableClass = reloadable.getClass(); try (SectionClosable endReload = section(stage, "end-reload/" + name(reloadableClass) + "/"); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/performance/PerformanceLogger.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/performance/PerformanceLogger.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/logging/performance/PerformanceLogger.java rename to runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/performance/PerformanceLogger.java index 94832a20d..1a620d1c8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/performance/PerformanceLogger.java +++ b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/performance/PerformanceLogger.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.logging.performance; +package me.shedaniel.rei.impl.common.plugins.performance; import com.mojang.datafixers.util.Pair; import me.shedaniel.rei.api.common.plugins.REIPlugin; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/performance/PerformanceLoggerImpl.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/performance/PerformanceLoggerImpl.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/logging/performance/PerformanceLoggerImpl.java rename to runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/performance/PerformanceLoggerImpl.java index 25a0dfc87..fc4e7a68f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/logging/performance/PerformanceLoggerImpl.java +++ b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/performance/PerformanceLoggerImpl.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.logging.performance; +package me.shedaniel.rei.impl.common.plugins.performance; import com.google.common.base.Stopwatch; import com.google.common.collect.Maps; diff --git a/runtime-engine/plugins/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.config.ConfigManagerInternal$SystemSetup b/runtime-engine/plugins/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.config.ConfigManagerInternal$SystemSetup new file mode 100644 index 000000000..b758181a9 --- /dev/null +++ b/runtime-engine/plugins/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.config.ConfigManagerInternal$SystemSetup @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.gui.performance.entry.PerformanceConfigEntries \ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/transfer/TransferHandlerRegistryImpl.java b/runtime-engine/transfer-handlers/src/main/java/me/shedaniel/rei/impl/client/transfer/TransferHandlerRegistryImpl.java similarity index 88% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/transfer/TransferHandlerRegistryImpl.java rename to runtime-engine/transfer-handlers/src/main/java/me/shedaniel/rei/impl/client/transfer/TransferHandlerRegistryImpl.java index 93cffb1fe..e0b9fe05d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/transfer/TransferHandlerRegistryImpl.java +++ b/runtime-engine/transfer-handlers/src/main/java/me/shedaniel/rei/impl/client/transfer/TransferHandlerRegistryImpl.java @@ -27,17 +27,13 @@ import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.transfer.TransferHandler; import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry; -import me.shedaniel.rei.api.common.entry.EntryIngredient; -import me.shedaniel.rei.impl.ClientInternals; import me.shedaniel.rei.impl.common.InternalLogger; -import net.minecraft.world.inventory.tooltip.TooltipComponent; import org.jetbrains.annotations.ApiStatus; import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; import java.util.List; -import java.util.function.Function; @ApiStatus.Internal public class TransferHandlerRegistryImpl implements TransferHandlerRegistry { @@ -69,8 +65,4 @@ public void register(TransferHandler handler) { public Iterator iterator() { return Iterators.unmodifiableIterator(handlers.iterator()); } - - static { - ClientInternals.attachInstance((Function, TooltipComponent>) MissingStacksTooltip::new, "missingTooltip"); - } } diff --git a/runtime-engine/transfer-handlers/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry b/runtime-engine/transfer-handlers/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry new file mode 100644 index 000000000..606fb61d4 --- /dev/null +++ b/runtime-engine/transfer-handlers/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.transfer.TransferHandlerRegistryImpl \ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/AbstractViewSearchBuilder.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/AbstractViewSearchBuilder.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/AbstractViewSearchBuilder.java rename to runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/AbstractViewSearchBuilder.java index b0cc20251..f814bf078 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/AbstractViewSearchBuilder.java +++ b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/AbstractViewSearchBuilder.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client; +package me.shedaniel.rei.impl.client.view; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/LegacyWrapperViewSearchBuilder.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/LegacyWrapperViewSearchBuilder.java similarity index 99% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/LegacyWrapperViewSearchBuilder.java rename to runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/LegacyWrapperViewSearchBuilder.java index c199f94e9..406787e9f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/LegacyWrapperViewSearchBuilder.java +++ b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/LegacyWrapperViewSearchBuilder.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client; +package me.shedaniel.rei.impl.client.view; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ViewSearchBuilderImpl.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewSearchBuilderImpl.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/ViewSearchBuilderImpl.java rename to runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewSearchBuilderImpl.java index 3db7d31a9..35ed31b39 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ViewSearchBuilderImpl.java +++ b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewSearchBuilderImpl.java @@ -21,13 +21,14 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client; +package me.shedaniel.rei.impl.client.view; import com.google.common.base.Suppliers; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.impl.client.view.AbstractViewSearchBuilder; import me.shedaniel.rei.impl.client.view.ViewsImpl; import me.shedaniel.rei.impl.display.DisplaySpec; import org.jetbrains.annotations.Nullable; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java similarity index 99% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java rename to runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java index 1c579e2e5..c0e6381e9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java +++ b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java @@ -53,7 +53,7 @@ import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryIngredients; import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.client.gui.craftable.CraftableFilter; +import me.shedaniel.rei.impl.client.view.craftable.CraftableFilter; import me.shedaniel.rei.impl.client.gui.widget.AutoCraftingEvaluator; import me.shedaniel.rei.impl.client.util.CrashReportUtils; import me.shedaniel.rei.impl.common.InternalLogger; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/craftable/CraftableFilter.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/craftable/CraftableFilter.java similarity index 53% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/craftable/CraftableFilter.java rename to runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/craftable/CraftableFilter.java index 1996dc5ef..f81d0c385 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/craftable/CraftableFilter.java +++ b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/craftable/CraftableFilter.java @@ -21,12 +21,20 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.craftable; +package me.shedaniel.rei.impl.client.view.craftable; import it.unimi.dsi.fastutil.longs.Long2LongMap; import it.unimi.dsi.fastutil.longs.Long2LongMaps; import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap; -import me.shedaniel.rei.impl.client.ClientHelperImpl; +import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext; +import me.shedaniel.rei.api.common.entry.type.EntryDefinition; +import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; +import net.minecraft.client.Minecraft; +import net.minecraft.core.NonNullList; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.ApiStatus; public class CraftableFilter { public static final CraftableFilter INSTANCE = new CraftableFilter(); @@ -51,7 +59,7 @@ public void tick() { if (dirty) return; Long2LongMap currentStacks; try { - currentStacks = ClientHelperImpl.getInstance()._getInventoryItemsTypes(); + currentStacks = getInventoryItemsTypes(); } catch (Throwable throwable) { throwable.printStackTrace(); currentStacks = Long2LongMaps.EMPTY_MAP; @@ -61,9 +69,9 @@ public void tick() { markDirty(); } if (dirty) return; - + try { - currentStacks = ClientHelperImpl.getInstance()._getContainerItemsTypes(); + currentStacks = getContainerItemsTypes(); } catch (Throwable throwable) { throwable.printStackTrace(); currentStacks = Long2LongMaps.EMPTY_MAP; @@ -77,4 +85,47 @@ public void tick() { public Long2LongMap getInvStacks() { return invStacks; } + + @ApiStatus.Internal + public Long2LongMap getInventoryItemsTypes() { + EntryDefinition definition; + try { + definition = VanillaEntryTypes.ITEM.getDefinition(); + } catch (NullPointerException e) { + return Long2LongMaps.EMPTY_MAP; + } + Long2LongOpenHashMap map = new Long2LongOpenHashMap(); + for (NonNullList compartment : Minecraft.getInstance().player.getInventory().compartments) { + for (ItemStack stack : compartment) { + long hash = definition.hash(null, stack, ComparisonContext.FUZZY); + long newCount = map.getOrDefault(hash, 0) + Math.max(0, stack.getCount()); + map.put(hash, newCount); + } + } + return map; + } + + @ApiStatus.Internal + public Long2LongMap getContainerItemsTypes() { + EntryDefinition definition; + try { + definition = VanillaEntryTypes.ITEM.getDefinition(); + } catch (NullPointerException e) { + return Long2LongMaps.EMPTY_MAP; + } + Long2LongOpenHashMap map = new Long2LongOpenHashMap(); + AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; + if (menu != null) { + for (Slot slot : menu.slots) { + ItemStack stack = slot.getItem(); + + if (!stack.isEmpty()) { + long hash = definition.hash(null, stack, ComparisonContext.FUZZY); + long newCount = map.getOrDefault(hash, 0) + Math.max(0, stack.getCount()); + map.put(hash, newCount); + } + } + } + return map; + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/transfer/MissingStacksTooltip.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltip.java similarity index 94% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/transfer/MissingStacksTooltip.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltip.java index 1a6868104..696384d03 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/transfer/MissingStacksTooltip.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltip.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.transfer; +package me.shedaniel.rei.impl.client.gui.tooltip; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; @@ -30,7 +30,6 @@ import me.shedaniel.rei.api.client.gui.SimpleDisplayRenderer; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; @@ -54,7 +53,7 @@ public MissingStacksTooltip(List stacks) { @Override public int getHeight() { - int entrySize = EntryListWidget.entrySize(); + int entrySize = 18; int w = Math.max(1, MAX_WIDTH / entrySize); int height = Math.min(6, Mth.ceil(stacks.size() / (float) w)) * entrySize + 2; height += 12; @@ -63,7 +62,7 @@ public int getHeight() { @Override public int getWidth(Font font) { - int entrySize = EntryListWidget.entrySize(); + int entrySize = 18; int w = Math.max(1, MAX_WIDTH / entrySize); int size = stacks.size(); int width = Math.min(size, w) * entrySize; @@ -73,7 +72,7 @@ public int getWidth(Font font) { @Override public void renderImage(Font font, int x, int y, PoseStack poses, ItemRenderer renderer, int z) { - int entrySize = EntryListWidget.entrySize(); + int entrySize = 18; int w = Math.max(1, MAX_WIDTH / entrySize); int i = 0; poses.pushPose(); diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltipProvider.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltipProvider.java new file mode 100644 index 000000000..19ed4dfc1 --- /dev/null +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltipProvider.java @@ -0,0 +1,27 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.tooltip; + +public class MissingStacksTooltipProvider { +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java index bbaaa6e9c..aba9ae7b8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java @@ -37,7 +37,7 @@ import java.util.List; import java.util.Objects; -public final class ArrowWidget extends Arrow { +final class ArrowWidget extends Arrow { private Rectangle bounds; private double animationDuration = -1; private final NumberAnimator darkBackgroundAlpha = ValueAnimator.ofFloat() diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java similarity index 55% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java index 66f5c546c..2a0e46726 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/BatchedEntryRendererManager.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java @@ -21,37 +21,48 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.widget.basewidgets; import com.google.common.collect.AbstractIterator; import com.google.common.collect.Iterables; import com.mojang.blaze3d.vertex.PoseStack; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; +import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.entry.renderer.BatchedEntryRenderer; import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; +import me.shedaniel.rei.api.client.gui.widgets.BatchedSlots; +import me.shedaniel.rei.api.client.gui.widgets.Slot; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.util.CrashReportUtils; import net.minecraft.CrashReport; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.renderer.MultiBufferSource; import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.lang3.mutable.MutableLong; +import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; -public class BatchedEntryRendererManager { +final class BatchedEntryRendererManager extends BatchedSlots implements ForwardingList { private boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); private Int2ObjectMap> grouping = new Int2ObjectOpenHashMap<>(); - private List toRender = new ArrayList<>(); + private List toRender = new ArrayList<>(); + private List delegateList = new DelegatedSlotList(); + private int size; + public boolean debug; + public MutableInt debugSize = new MutableInt(); + public MutableLong debugTime = new MutableLong(); public BatchedEntryRendererManager() { } - public BatchedEntryRendererManager(Collection widgets) { + public BatchedEntryRendererManager(Collection widgets) { addAll(widgets); } @@ -59,58 +70,42 @@ public boolean isFastEntryRendering() { return fastEntryRendering; } - public void addAll(Collection widgets) { - if (fastEntryRendering) { - for (EntryWidget widget : widgets) { - add(widget); - } - } else { - addAllSlow(widgets); - } + @Override + public List delegate() { + return delegateList; } - public void add(EntryWidget widget) { - if (fastEntryRendering) { - EntryStack currentEntry = widget.getCurrentEntry(); - try { - EntryRenderer renderer = currentEntry.getRenderer(); - if (renderer instanceof BatchedEntryRenderer) { - BatchedEntryRenderer batchedRenderer = (BatchedEntryRenderer) renderer; - EntryStack cast = currentEntry.cast(); - if (batchedRenderer.isBatched(cast)) { - Object extraData = batchedRenderer.getExtraData(cast); - int hash = batchedRenderer.getBatchIdentifier(cast, widget.getBounds(), extraData) - ^ widget.getCurrentEntry().getType().hashCode(); - List entries = grouping.get(hash); - if (entries == null) { - grouping.put(hash, entries = new ArrayList<>()); - } - entries.add(widget); - entries.add(extraData); - return; - } - } - } catch (Throwable throwable) { - CrashReport report = CrashReportUtils.essential(throwable, "Adding entry"); - CrashReportUtils.renderer(report, currentEntry); - CrashReportUtils.catchReport(report); - return; - } - } - - addSlow(widget); + @Override + public void addAllUnbatched(Collection slots) { + this.toRender.addAll(slots); + this.size += slots.size(); } - public void addAllSlow(Collection widgets) { - toRender.addAll(widgets); + @Override + public boolean isBatched() { + return isFastEntryRendering(); } - public void addSlow(EntryWidget widget) { - toRender.add(widget); + @Override + public void addDebugger(MutableInt size, MutableLong time) { + this.debug = true; + this.debugSize = size; + this.debugTime = time; } + @Override + public void addUnbatched(Slot slot) { + this.toRender.add(slot); + this.size++; + } + + @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - render(false, null, null, matrices, mouseX, mouseY, delta); + if (this.debug) { + render(false, null, null, matrices, mouseX, mouseY, delta); + } else { + render(true, debugSize, debugTime, matrices, mouseX, mouseY, delta); + } } public void render(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta) { @@ -120,36 +115,70 @@ public void render(boolean debugTime, MutableInt size, MutableLong time, PoseSta for (int i = 0; i < extraData.length; i++) { extraData[i] = entries.get(i * 2 + 1); } - renderBatched(debugTime, size, time, matrices, mouseX, mouseY, delta, () -> new AbstractIterator<>() { + renderBatched(debugTime, size, time, matrices, mouseX, mouseY, delta, groupingsAsList(), extraData); + } + } + if (!toRender.isEmpty()) { + renderSlow(debugTime, size, time, matrices, mouseX, mouseY, delta, toRender); + } + } + + public List groupingsAsList() { + return CollectionUtils.concatUnmodifiable((Iterable>) () -> new AbstractIterator<>() { + Iterator> groups = grouping.values().iterator(); + + @Nullable + @Override + protected List computeNext() { + if (groups.hasNext()) { + return groupingAsList(groups.next()); + } + return endOfData(); + } + }); + } + + public List groupingAsList(List entries) { + return new AbstractList<>() { + @Override + public Slot get(int index) { + return (Slot) entries.get(index * 2); + } + + @Override + public Iterator iterator() { + return new AbstractIterator<>() { public int i = 0; @Override - protected EntryWidget computeNext() { + protected Slot computeNext() { if (i >= entries.size()) { return endOfData(); } - EntryWidget widget = (EntryWidget) entries.get(i); + Slot widget = (Slot) entries.get(i); i += 2; return widget; } - }, extraData); + }; } - } - if (!toRender.isEmpty()) { - renderSlow(debugTime, size, time, matrices, mouseX, mouseY, delta, toRender); - } + + @Override + public int size() { + return entries.size() / 2; + } + }; } - public static void renderEntries(boolean debugTime, MutableInt size, MutableLong time, boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta, Collection entries) { + public static void renderEntries(boolean debugTime, MutableInt size, MutableLong time, boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta, Collection entries) { if (fastEntryRendering) { - T firstWidget = Iterables.getFirst(entries, null); + Slot firstWidget = Iterables.getFirst(entries, null); if (firstWidget == null) return; EntryRenderer renderer = firstWidget.getCurrentEntry().getRenderer(); if (renderer instanceof BatchedEntryRenderer) { BatchedEntryRenderer firstRenderer = (BatchedEntryRenderer) renderer; Object[] extraData = new Object[entries.size()]; int i = 0; - for (T entry : entries) { + for (Slot entry : entries) { EntryStack currentEntry = entry.getCurrentEntry(); extraData[i++] = ((BatchedEntryRenderer) currentEntry.getRenderer()).getExtraData(currentEntry.cast()); } @@ -160,8 +189,8 @@ public static void renderEntries(boolean debugTime, Muta renderSlow(debugTime, size, time, matrices, mouseX, mouseY, delta, entries); } - private static void renderBatched(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable entries, Object[] extraData) { - T firstWidget = Iterables.getFirst(entries, null); + private static void renderBatched(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable entries, Object[] extraData) { + Slot firstWidget = Iterables.getFirst(entries, null); if (firstWidget == null) return; @SuppressWarnings("rawtypes") EntryStack first = firstWidget.getCurrentEntry(); @@ -171,7 +200,7 @@ private static void renderBatched(boolean debugTime, Mut long l = debugTime ? System.nanoTime() : 0; MultiBufferSource.BufferSource immediate = Minecraft.getInstance().renderBuffers().bufferSource(); int i = 0; - for (T entry : entries) { + for (Slot entry : entries) { try { entry.drawBackground(matrices, mouseX, mouseY, delta); } catch (Throwable throwable) { @@ -182,7 +211,7 @@ private static void renderBatched(boolean debugTime, Mut } } firstRenderer.startBatch(first, extraData[0], matrices, delta); - for (T entry : entries) { + for (Slot entry : entries) { try { @SuppressWarnings("rawtypes") EntryStack currentEntry = entry.getCurrentEntry(); @@ -199,7 +228,7 @@ private static void renderBatched(boolean debugTime, Mut immediate.endBatch(); firstRenderer.afterBase(first, extraData[0], matrices, delta); i = 0; - for (T entry : entries) { + for (Slot entry : entries) { try { @SuppressWarnings("rawtypes") EntryStack currentEntry = entry.getCurrentEntry(); @@ -212,15 +241,19 @@ private static void renderBatched(boolean debugTime, Mut } } immediate.endBatch(); - for (T entry : entries) { + for (Slot entry : entries) { try { if (entry.containsMouse(mouseX, mouseY)) { - entry.queueTooltip(matrices, mouseX, mouseY, delta); + Tooltip tooltip = entry.getCurrentTooltip(TooltipContext.of(new Point(mouseX, mouseY))); + if (tooltip != null) { + tooltip.queue(); + } - if (entry.hasHighlight()) { + if (entry.isHighlightEnabled()) { entry.drawHighlighted(matrices, mouseX, mouseY, delta); } } + entry.drawExtra(matrices, mouseX, mouseY, delta); } catch (Throwable throwable) { CrashReport report = CrashReportUtils.essential(throwable, "Rendering entry extra"); @@ -233,8 +266,8 @@ private static void renderBatched(boolean debugTime, Mut firstRenderer.endBatch(first, extraData[0], matrices, delta); } - public static void renderSlow(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable entries) { - for (T entry : entries) { + public static void renderSlow(boolean debugTime, MutableInt size, MutableLong time, PoseStack matrices, int mouseX, int mouseY, float delta, Iterable entries) { + for (Slot entry : entries) { if (entry.getCurrentEntry().isEmpty()) continue; try { @@ -252,4 +285,77 @@ public static void renderSlow(boolean debugTime, Mutable } } } + + @Override + public List children() { + return null; + } + + private class DelegatedSlotList extends AbstractList { + private final List unmodifiable = CollectionUtils.concatUnmodifiable(toRender, + groupingsAsList()); + + @Override + public void add(int index, Slot element) { + add(element); + } + + @Override + public int size() { + return size; + } + + @Override + public boolean add(Slot widget) { + if (fastEntryRendering) { + EntryStack currentEntry = widget.getCurrentEntry(); + try { + EntryRenderer renderer = currentEntry.getRenderer(); + if (renderer instanceof BatchedEntryRenderer) { + BatchedEntryRenderer batchedRenderer = (BatchedEntryRenderer) renderer; + EntryStack cast = currentEntry.cast(); + if (batchedRenderer.isBatched(cast)) { + Object extraData = batchedRenderer.getExtraData(cast); + int hash = batchedRenderer.getBatchIdentifier(cast, widget.getBounds(), extraData) + ^ widget.getCurrentEntry().getType().hashCode(); + List entries = grouping.get(hash); + if (entries == null) { + grouping.put(hash, entries = new ArrayList<>()); + } + entries.add(widget); + entries.add(extraData); + size++; + return true; + } + } + } catch (Throwable throwable) { + CrashReport report = CrashReportUtils.essential(throwable, "Adding entry"); + CrashReportUtils.renderer(report, currentEntry); + CrashReportUtils.catchReport(report); + return false; + } + } + + addUnbatched(widget); + return true; + } + + @Override + public Slot get(int index) { + return unmodifiable.get(index); + } + + @Override + public boolean addAll(Collection widgets) { + if (fastEntryRendering) { + for (Slot widget : widgets) { + add(widget); + } + } else { + addAllUnbatched(widgets); + } + + return true; + } + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java index 3f0a998d2..550f98626 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java @@ -37,7 +37,7 @@ import java.util.List; import java.util.Objects; -public final class BurningFireWidget extends BurningFire { +final class BurningFireWidget extends BurningFire { private Rectangle bounds; private double animationDuration = -1; private final NumberAnimator darkBackgroundAlpha = ValueAnimator.ofFloat() diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java similarity index 99% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java index a6b1689d2..f7efdc712 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java @@ -51,7 +51,7 @@ import java.util.function.Consumer; import java.util.function.Function; -public class ButtonWidget extends Button { +final class ButtonWidget extends Button { private static final ResourceLocation BUTTON_LOCATION = new ResourceLocation("roughlyenoughitems", "textures/gui/button.png"); private static final ResourceLocation BUTTON_LOCATION_DARK = new ResourceLocation("roughlyenoughitems", "textures/gui/button_dark.png"); private Rectangle bounds; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DelegateWidgetWithTranslate.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DelegateWidgetWithTranslate.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DelegateWidgetWithTranslate.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DelegateWidgetWithTranslate.java index e90c1cb19..e9f4b1b59 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DelegateWidgetWithTranslate.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DelegateWidgetWithTranslate.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.widget.basewidgets; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix4f; @@ -34,7 +34,7 @@ import java.util.function.Supplier; -public class DelegateWidgetWithTranslate extends DelegateWidget { +final class DelegateWidgetWithTranslate extends DelegateWidget { private final Supplier translate; public DelegateWidgetWithTranslate(WidgetWithBounds widget, Supplier translate) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DrawableWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DrawableWidget.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DrawableWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DrawableWidget.java index 18afa3696..2fc13d483 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DrawableWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DrawableWidget.java @@ -31,7 +31,7 @@ import java.util.Collections; import java.util.List; -public final class DrawableWidget extends Widget { +final class DrawableWidget extends Widget { private DrawableConsumer drawable; public DrawableWidget(DrawableConsumer drawable) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/FillRectangleDrawableConsumer.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/FillRectangleDrawableConsumer.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/FillRectangleDrawableConsumer.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/FillRectangleDrawableConsumer.java index 685d4619a..6957c14f3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/FillRectangleDrawableConsumer.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/FillRectangleDrawableConsumer.java @@ -31,7 +31,7 @@ import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.renderer.GameRenderer; -public final class FillRectangleDrawableConsumer implements DrawableConsumer { +final class FillRectangleDrawableConsumer implements DrawableConsumer { private Rectangle rectangle; private int color; diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ForwardingList.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ForwardingList.java new file mode 100644 index 000000000..5e3093bf8 --- /dev/null +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ForwardingList.java @@ -0,0 +1,166 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.widget.basewidgets; + +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +interface ForwardingList extends List { + @Override + default int size() { + return delegate().size(); + } + + @Override + default boolean isEmpty() { + return delegate().isEmpty(); + } + + @Override + default boolean contains(Object o) { + return delegate().contains(o); + } + + @NotNull + @Override + default Iterator iterator() { + return delegate().iterator(); + } + + @NotNull + @Override + default Object[] toArray() { + return delegate().toArray(); + } + + @NotNull + @Override + default T[] toArray(@NotNull T[] a) { + return delegate().toArray(a); + } + + @Override + default boolean add(E e) { + return delegate().add(e); + } + + @Override + default boolean remove(Object o) { + return delegate().remove(o); + } + + @Override + default boolean containsAll(@NotNull Collection c) { + return delegate().containsAll(c); + } + + @Override + default boolean addAll(@NotNull Collection c) { + return delegate().addAll(c); + } + + @Override + default boolean addAll(int index, @NotNull Collection c) { + return delegate().addAll(index, c); + } + + @Override + default boolean removeAll(@NotNull Collection c) { + return delegate().removeAll(c); + } + + @Override + default boolean retainAll(@NotNull Collection c) { + return delegate().retainAll(c); + } + + @Override + default void clear() { + delegate().clear(); + } + + @Override + default boolean equals(Object o) { + return delegate().equals(o); + } + + @Override + default int hashCode() { + return delegate().hashCode(); + } + + @Override + default E get(int index) { + return delegate().get(index); + } + + @Override + default E set(int index, E element) { + return delegate().set(index, element); + } + + @Override + default void add(int index, E element) { + delegate().add(index, element); + } + + @Override + default E remove(int index) { + return delegate().remove(index); + } + + @Override + default int indexOf(Object o) { + return delegate().indexOf(o); + } + + @Override + default int lastIndexOf(Object o) { + return delegate().lastIndexOf(o); + } + + @NotNull + @Override + default ListIterator listIterator() { + return delegate().listIterator(); + } + + @NotNull + @Override + default ListIterator listIterator(int index) { + return delegate().listIterator(index); + } + + @NotNull + @Override + default List subList(int fromIndex, int toIndex) { + return delegate().subList(fromIndex, toIndex); + } + + List delegate(); +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java index f81f98165..b38e3b7fa 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java @@ -34,7 +34,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Label; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.Widgets; -import me.shedaniel.rei.impl.client.gui.text.TextTransformations; +import me.shedaniel.rei.impl.client.util.TextTransformations; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.locale.Language; import net.minecraft.network.chat.Component; @@ -49,7 +49,7 @@ import java.util.function.Consumer; import java.util.function.Function; -public final class LabelWidget extends Label { +final class LabelWidget extends Label { private boolean hovered = false; private boolean focused = false; private boolean clickable = false; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/MergedWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/MergedWidget.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/MergedWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/MergedWidget.java index 59e9607c7..dc037f954 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/MergedWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/MergedWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.widget.basewidgets; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; @@ -33,7 +33,7 @@ import java.util.List; import java.util.Objects; -public class MergedWidget extends Widget { +final class MergedWidget extends Widget { private final List widgets; public MergedWidget(Widget widget1, Widget widget2) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/NoOpWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/NoOpWidget.java similarity index 94% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/NoOpWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/NoOpWidget.java index b31c61532..804dfc738 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/NoOpWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/NoOpWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.widget.basewidgets; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Rectangle; @@ -31,7 +31,7 @@ import java.util.Collections; import java.util.List; -public class NoOpWidget extends WidgetWithBounds { +final class NoOpWidget extends WidgetWithBounds { public static final NoOpWidget INSTANCE = new NoOpWidget(); private NoOpWidget() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/OverflowWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/OverflowWidget.java similarity index 96% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/OverflowWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/OverflowWidget.java index b47eac3df..998a905f5 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/OverflowWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/OverflowWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.widget.basewidgets; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix4f; @@ -32,10 +32,11 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; import me.shedaniel.rei.api.client.gui.widgets.CloseableScissors; +import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; @SuppressWarnings("UnstableApiUsage") -public class OverflowWidget extends DelegateWidgetWithTranslate { +final class OverflowWidget extends DelegateWidgetWithTranslate { private final Rectangle bounds; private final NumberAnimator scale; private final ValueAnimator translate; @@ -86,7 +87,7 @@ public void render(PoseStack poseStack, int mouseX, int mouseY, float delta) { ScrollingContainer.handleBounceBack(this.velocity.target().y, 0, delta, .0001) ), 20); - try (CloseableScissors scissors = scissor(poseStack, this.bounds)) { + try (CloseableScissors scissors = Widget.scissor(poseStack, this.bounds)) { boolean containsMouse = this.bounds.contains(mouseX, mouseY); if (containsMouse) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/PaddedCenterWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedCenterWidget.java similarity index 94% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/PaddedCenterWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedCenterWidget.java index 6dca02880..29263c9ac 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/PaddedCenterWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedCenterWidget.java @@ -21,13 +21,13 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.widget.basewidgets; import com.mojang.math.Matrix4f; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; -public class PaddedCenterWidget extends DelegateWidgetWithTranslate { +final class PaddedCenterWidget extends DelegateWidgetWithTranslate { private final Rectangle bounds; public PaddedCenterWidget(Rectangle bounds, WidgetWithBounds widget) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/PaddedWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedWidget.java similarity index 94% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/PaddedWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedWidget.java index 42a10c70b..9f8fb6186 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/PaddedWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedWidget.java @@ -21,13 +21,13 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.widget.basewidgets; import com.mojang.math.Matrix4f; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; -public class PaddedWidget extends DelegateWidgetWithTranslate { +final class PaddedWidget extends DelegateWidgetWithTranslate { private final int padLeft, padRight, padTop, padBottom; public PaddedWidget(int padLeft, int padRight, int padTop, int padBottom, WidgetWithBounds widget) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java similarity index 99% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java index a67b3062a..98f90d6bf 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java @@ -44,7 +44,7 @@ import java.util.Objects; import java.util.function.Predicate; -public final class PanelWidget extends Panel { +final class PanelWidget extends Panel { private static final PanelWidget TEMP = new PanelWidget(new Rectangle()); private Rectangle bounds; private int color = -1; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/RendererWrappedWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/RendererWrappedWidget.java similarity index 95% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/RendererWrappedWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/RendererWrappedWidget.java index 97d9f3e3d..fc7bcdece 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/RendererWrappedWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/RendererWrappedWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.widget.basewidgets; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Rectangle; @@ -34,7 +34,7 @@ import java.util.Objects; import java.util.function.Supplier; -public class RendererWrappedWidget extends WidgetWithBounds { +final class RendererWrappedWidget extends WidgetWithBounds { private final Renderer renderer; private final Supplier bounds; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java similarity index 78% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java index 69b393b18..1948d9abf 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java @@ -26,7 +26,7 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import com.mojang.math.Matrix4f; -import me.shedaniel.clothconfig2.api.TickableWidget; +import it.unimi.dsi.fastutil.booleans.BooleanConsumer; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Widget; @@ -35,8 +35,6 @@ import net.minecraft.Util; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.GameRenderer; -import net.minecraft.network.chat.Style; -import net.minecraft.util.FormattedCharSequence; import net.minecraft.util.Mth; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -48,8 +46,8 @@ import java.util.function.Predicate; @ApiStatus.Internal -public class TextFieldWidget extends WidgetWithBounds implements TickableWidget, TextField { - public Function stripInvalid = SharedConstants::filterText; +final class TextFieldWidget extends WidgetWithBounds implements TextField { + protected Function textTransformer = SharedConstants::filterText; protected int frame; protected boolean editable = true; protected int firstCharacterIndex; @@ -58,18 +56,20 @@ public class TextFieldWidget extends WidgetWithBounds implements TickableWidget, protected int editableColor = 0xe0e0e0; protected int notEditableColor = 0x707070; protected TextFormatter formatter = TextFormatter.DEFAULT; + protected SuggestionRenderer suggestionRenderer = (matrices, x, y, color) -> + this.font.drawShadow(matrices, this.font.plainSubstrByWidth(this.suggestion, this.getWidth()), x, y, color); + protected BorderColorProvider borderColorProvider = BorderColorProvider.DEFAULT; private Rectangle bounds; private String text = ""; private int maxLength = 32; private boolean hasBorder = true; private boolean focusUnlocked = true; private boolean focused = false; - private boolean visible = true; private boolean selecting = false; @Nullable private String suggestion; - @Nullable - private Consumer responder; + private Consumer responder = str -> {}; + private BooleanConsumer focusedResponder = bool -> {}; private Predicate filter = s -> true; public TextFieldWidget(Rectangle bounds) { @@ -80,27 +80,51 @@ public TextFieldWidget(int x, int y, int width, int height) { this(new Rectangle(x, y, width, height)); } + @Override + public void setTextTransformer(Function textTransformer) { + this.textTransformer = textTransformer; + } + + @Override public String getSuggestion() { return suggestion; } + @Override public void setSuggestion(String suggestion) { this.suggestion = suggestion; } + @Override + public void setBorderColorProvider(BorderColorProvider borderColorProvider) { + this.borderColorProvider = borderColorProvider; + } + @Override public Rectangle getBounds() { return bounds; } + @Override public void setResponder(Consumer responder) { this.responder = responder; } + @Override + public void setFocusedResponder(BooleanConsumer responder) { + this.focusedResponder = responder; + } + + @Override public void setFormatter(TextFormatter formatter) { this.formatter = formatter; } + @Override + public void setSuggestionRenderer(SuggestionRenderer suggestionRenderer) { + this.suggestionRenderer = suggestionRenderer; + } + @Override public void tick() { this.frame++; @@ -141,7 +165,7 @@ public void addText(String text) { int highlightStart = Math.min(this.cursorPos, this.highlightPos); int highlightEnd = Math.max(this.cursorPos, this.highlightPos); int k = this.maxLength - this.text.length() - (highlightStart - highlightEnd); - String textFiltered = stripInvalid.apply(text); + String textFiltered = textTransformer.apply(text); int l = textFiltered.length(); if (k < l) { textFiltered = textFiltered.substring(0, k); @@ -160,9 +184,7 @@ public void addText(String text) { } public void onChanged(String newText) { - if (this.responder != null) { - this.responder.accept(newText); - } + this.responder.accept(newText); } private void erase(int offset) { @@ -269,7 +291,7 @@ public void moveCursorToEnd() { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (this.isVisible() && this.isFocused()) { + if (this.isFocused()) { this.selecting = Screen.hasShiftDown(); if (Screen.isSelectAll(keyCode)) { this.moveCursorToEnd(); @@ -347,7 +369,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { @Override public boolean charTyped(char character, int modifiers) { - if (this.isVisible() && this.isFocused()) { + if (this.isFocused()) { if (SharedConstants.isAllowedChatCharacter(character) && !( Screen.hasControlDown() && !Screen.hasShiftDown() && !Screen.hasAltDown() && ( character == 'a' || character == 'c' || character == 'v' @@ -373,32 +395,28 @@ public List children() { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (!this.isVisible()) { - return false; - } else { - boolean hovered = mouseX >= (double) this.bounds.x && mouseX < (double) (this.bounds.x + this.bounds.width) && mouseY >= (double) this.bounds.y && mouseY < (double) (this.bounds.y + this.bounds.height); - if (this.focusUnlocked) { - this.setFocused(hovered); + boolean hovered = mouseX >= (double) this.bounds.x && mouseX < (double) (this.bounds.x + this.bounds.width) && mouseY >= (double) this.bounds.y && mouseY < (double) (this.bounds.y + this.bounds.height); + if (this.focusUnlocked) { + this.setFocused(hovered); + } + + if (this.focused && hovered && button == 0) { + int int_2 = Mth.floor(mouseX) - this.bounds.x; + if (this.hasBorder) { + int_2 -= 4; } - if (this.focused && hovered && button == 0) { - int int_2 = Mth.floor(mouseX) - this.bounds.x; - if (this.hasBorder) { - int_2 -= 4; - } - - String string_1 = this.font.plainSubstrByWidth(this.text.substring(this.firstCharacterIndex), this.getWidth()); - this.moveCursorTo(this.font.plainSubstrByWidth(string_1, int_2).length() + this.firstCharacterIndex); - return true; - } else { - return false; - } + String string_1 = this.font.plainSubstrByWidth(this.text.substring(this.firstCharacterIndex), this.getWidth()); + this.moveCursorTo(this.font.plainSubstrByWidth(string_1, int_2).length() + this.firstCharacterIndex); + return true; + } else { + return false; } } public void renderBorder(PoseStack matrices) { if (this.hasBorder()) { - int borderColor = containsMouse(mouse()) || focused ? 0xffffffff : 0xffa0a0a0; + int borderColor = this.borderColorProvider.getBorderColor(this); fill(matrices, this.bounds.x - 1, this.bounds.y - 1, this.bounds.x + this.bounds.width + 1, this.bounds.y + this.bounds.height + 1, 0xff000000); fill(matrices, this.bounds.x, this.bounds.y, this.bounds.x + this.bounds.width, this.bounds.y + this.bounds.height, borderColor); fill(matrices, this.bounds.x + 1, this.bounds.y + 1, this.bounds.x + this.bounds.width - 1, this.bounds.y + this.bounds.height - 1, 0xff000000); @@ -407,57 +425,55 @@ public void renderBorder(PoseStack matrices) { @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (this.isVisible()) { - this.renderBorder(matrices); - - int color = this.editable ? this.editableColor : this.notEditableColor; - int int_4 = this.cursorPos - this.firstCharacterIndex; - int int_5 = this.highlightPos - this.firstCharacterIndex; - String textClipped = this.font.plainSubstrByWidth(this.text.substring(this.firstCharacterIndex), this.getWidth()); - boolean boolean_1 = int_4 >= 0 && int_4 <= textClipped.length(); - boolean boolean_2 = this.focused && this.frame / 6 % 2 == 0 && boolean_1; - int x = this.hasBorder ? this.bounds.x + 4 : this.bounds.x; - int y = this.hasBorder ? this.bounds.y + (this.bounds.height - 8) / 2 : this.bounds.y; - int int_8 = x; - int_5 = Math.min(textClipped.length(), int_5); - - if (!textClipped.isEmpty()) { - String string_2 = boolean_1 ? textClipped.substring(0, int_4) : textClipped; - int_8 = this.font.drawShadow(matrices, this.formatter.format(this, string_2, this.firstCharacterIndex), (float) x, (float) y, color); - } - - boolean isCursorInsideText = this.cursorPos < this.text.length() || this.text.length() >= this.getMaxLength(); - int selectionLeft = int_8; - if (!boolean_1) { - selectionLeft = int_4 > 0 ? x + this.bounds.width : x; - } else if (isCursorInsideText) { - --int_8; - } - selectionLeft--; - - if (!textClipped.isEmpty() && boolean_1 && int_4 < textClipped.length()) { - this.font.drawShadow(matrices, this.formatter.format(this, textClipped.substring(int_4), this.cursorPos), (float) int_8, (float) y, color); - } - - if (!isCursorInsideText && text.isEmpty() && this.suggestion != null) { - renderSuggestion(matrices, x, y); - } - - if (boolean_2) { - fill(matrices, selectionLeft + 1, y, selectionLeft + 2, y + 9, ((0xFF) << 24) | ((((color >> 16 & 255) / 4) & 0xFF) << 16) | ((((color >> 8 & 255) / 4) & 0xFF) << 8) | ((((color & 255) / 4) & 0xFF))); - fill(matrices, selectionLeft, y - 1, selectionLeft + 1, y + 8, ((0xFF) << 24) | color); - } - - // Render selection overlay - if (int_5 != int_4) { - int selectionRight = x + this.font.width(textClipped.substring(0, int_5)); - this.renderSelection(matrices, selectionLeft, y - 1, selectionRight - 1, y + 9, color); - } + this.renderBorder(matrices); + + int color = this.editable ? this.editableColor : this.notEditableColor; + int int_4 = this.cursorPos - this.firstCharacterIndex; + int int_5 = this.highlightPos - this.firstCharacterIndex; + String textClipped = this.font.plainSubstrByWidth(this.text.substring(this.firstCharacterIndex), this.getWidth()); + boolean boolean_1 = int_4 >= 0 && int_4 <= textClipped.length(); + boolean boolean_2 = this.focused && this.frame / 6 % 2 == 0 && boolean_1; + int x = this.hasBorder ? this.bounds.x + 4 : this.bounds.x; + int y = this.hasBorder ? this.bounds.y + (this.bounds.height - 8) / 2 : this.bounds.y; + int int_8 = x; + int_5 = Math.min(textClipped.length(), int_5); + + if (!textClipped.isEmpty()) { + String string_2 = boolean_1 ? textClipped.substring(0, int_4) : textClipped; + int_8 = this.font.drawShadow(matrices, this.formatter.format(string_2, this.firstCharacterIndex), (float) x, (float) y, color); + } + + boolean isCursorInsideText = this.cursorPos < this.text.length() || this.text.length() >= this.getMaxLength(); + int selectionLeft = int_8; + if (!boolean_1) { + selectionLeft = int_4 > 0 ? x + this.bounds.width : x; + } else if (isCursorInsideText) { + --int_8; + } + selectionLeft--; + + if (!textClipped.isEmpty() && boolean_1 && int_4 < textClipped.length()) { + this.font.drawShadow(matrices, this.formatter.format(textClipped.substring(int_4), this.cursorPos), (float) int_8, (float) y, color); + } + + if (!isCursorInsideText && text.isEmpty() && this.suggestion != null) { + renderSuggestion(matrices, x, y); + } + + if (boolean_2) { + fill(matrices, selectionLeft + 1, y, selectionLeft + 2, y + 9, ((0xFF) << 24) | ((((color >> 16 & 255) / 4) & 0xFF) << 16) | ((((color >> 8 & 255) / 4) & 0xFF) << 8) | ((((color & 255) / 4) & 0xFF))); + fill(matrices, selectionLeft, y - 1, selectionLeft + 1, y + 8, ((0xFF) << 24) | color); + } + + // Render selection overlay + if (int_5 != int_4) { + int selectionRight = x + this.font.width(textClipped.substring(0, int_5)); + this.renderSelection(matrices, selectionLeft, y - 1, selectionRight - 1, y + 9, color); } } protected void renderSuggestion(PoseStack matrices, int x, int y) { - this.font.drawShadow(matrices, this.font.plainSubstrByWidth(this.suggestion, this.getWidth()), x, y, -8355712); + this.suggestionRenderer.renderSuggestion(matrices, x, y, -8355712); } protected void renderSelection(PoseStack matrices, int x1, int y1, int x2, int y2, int color) { @@ -548,7 +564,7 @@ public void setNotEditableColor(int notEditableColor) { @Override public boolean changeFocus(boolean next) { - if (this.visible && this.editable) { + if (this.editable) { this.setFocused(!this.focused); return this.focused; } @@ -565,6 +581,12 @@ public void setFocused(boolean focused) { if (focused && !this.focused) this.frame = 0; this.focused = focused; + this.focusedResponder.accept(focused); + } + + @Override + public WidgetWithBounds asWidget() { + return this; } public void setIsEditable(boolean isEditable) { @@ -605,23 +627,7 @@ public void setFocusUnlocked(boolean focusUnlocked) { this.focusUnlocked = focusUnlocked; } - public boolean isVisible() { - return this.visible; - } - - public void setVisible(boolean visible) { - this.visible = visible; - } - public int getCharacterX(int index) { return index > this.text.length() ? this.bounds.x : this.bounds.x + this.font.width(this.text.substring(0, index)); } - - public interface TextFormatter { - TextFormatter DEFAULT = (widget, text, index) -> { - return FormattedCharSequence.forward(text, Style.EMPTY); - }; - - FormattedCharSequence format(TextFieldWidget widget, String text, int index); - } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TexturedDrawableConsumer.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TexturedDrawableConsumer.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TexturedDrawableConsumer.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TexturedDrawableConsumer.java index e3c178600..d519a4500 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TexturedDrawableConsumer.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TexturedDrawableConsumer.java @@ -31,7 +31,7 @@ import net.minecraft.client.renderer.GameRenderer; import net.minecraft.resources.ResourceLocation; -public final class TexturedDrawableConsumer implements DrawableConsumer { +final class TexturedDrawableConsumer implements DrawableConsumer { private ResourceLocation identifier; private int x, y, width, height, uWidth, vHeight, textureWidth, textureHeight; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/VanillaWrappedWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/VanillaWrappedWidget.java similarity index 96% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/VanillaWrappedWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/VanillaWrappedWidget.java index 2aacd5e73..23b622e14 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/VanillaWrappedWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/VanillaWrappedWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.widget.basewidgets; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.rei.api.client.gui.widgets.Widget; @@ -34,7 +34,7 @@ import java.util.List; import java.util.Objects; -public class VanillaWrappedWidget extends Widget { +final class VanillaWrappedWidget extends Widget { private GuiEventListener element; public VanillaWrappedWidget(GuiEventListener element) { diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProvider.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProvider.java new file mode 100644 index 000000000..2466237c4 --- /dev/null +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProvider.java @@ -0,0 +1,166 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.widget.basewidgets; + +import com.mojang.math.Matrix4f; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.DrawableConsumer; +import me.shedaniel.rei.api.client.gui.Renderer; +import me.shedaniel.rei.api.client.gui.widgets.*; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.FormattedText; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; + +import java.util.List; +import java.util.function.Supplier; + +public class WidgetsProvider implements me.shedaniel.rei.impl.client.provider.WidgetsProvider { + @Override + public boolean isRenderingPanel(Panel panel) { + return PanelWidget.isRendering(panel); + } + + @Override + public Widget wrapVanillaWidget(GuiEventListener element) { + if (element instanceof Widget) return (Widget) element; + return new VanillaWrappedWidget(element); + } + + @Override + public WidgetWithBounds wrapRenderer(Supplier bounds, Renderer renderer) { + return new RendererWrappedWidget(renderer, bounds); + } + + @Override + public WidgetWithBounds withTranslate(WidgetWithBounds widget, Supplier translate) { + return new DelegateWidgetWithTranslate(widget, translate); + } + + @Override + public Widget createDrawableWidget(DrawableConsumer drawable) { + return new DrawableWidget(drawable); + } + + @Override + public Slot createSlot(Point point) { + return new EntryWidget(point); + } + + @Override + public Slot createSlot(Rectangle bounds) { + return new EntryWidget(bounds); + } + + @Override + public Button createButton(Rectangle bounds, Component text) { + return new ButtonWidget(bounds, text); + } + + @Override + public Panel createPanelWidget(Rectangle bounds) { + return new PanelWidget(bounds); + } + + @Override + public Label createLabel(Point point, FormattedText text) { + return new LabelWidget(point, text); + } + + @Override + public Arrow createArrow(Rectangle rectangle) { + return new ArrowWidget(rectangle); + } + + @Override + public BurningFire createBurningFire(Rectangle rectangle) { + return new BurningFireWidget(rectangle); + } + + @Override + public DrawableConsumer createTexturedConsumer(ResourceLocation texture, int x, int y, int width, int height, float u, float v, int uWidth, int vHeight, int textureWidth, int textureHeight) { + return new TexturedDrawableConsumer(texture, x, y, width, height, u, v, uWidth, vHeight, textureWidth, textureHeight); + } + + @Override + public DrawableConsumer createFillRectangleConsumer(Rectangle rectangle, int color) { + return new FillRectangleDrawableConsumer(rectangle, color); + } + + @Override + public Widget createShapelessIcon(Point point) { + int magnification; + double scale = Minecraft.getInstance().getWindow().getGuiScale(); + if (scale >= 1 && scale <= 4 && scale == Math.floor(scale)) { + magnification = (int) scale; + } else if (scale > 4 && scale == Math.floor(scale)) { + magnification = 1; + for (int i = 4; i >= 1; i--) { + if (scale % i == 0) { + magnification = i; + break; + } + } + } else { + magnification = 4; + } + Rectangle bounds = new Rectangle(point.getX() - 9, point.getY() + 1, 8, 8); + Widget widget = Widgets.createTexturedWidget(new ResourceLocation("roughlyenoughitems:textures/gui/shapeless_icon_" + magnification + "x.png"), bounds.getX(), bounds.getY(), 0, 0, bounds.getWidth(), bounds.getHeight(), 1, 1, 1, 1); + return Widgets.withTooltip(Widgets.withBounds(widget, bounds), + new TranslatableComponent("text.rei.shapeless")); + } + + @Override + public Widget concatWidgets(List widgets) { + return new MergedWidget(widgets); + } + + @Override + public WidgetWithBounds noOp() { + return NoOpWidget.INSTANCE; + } + + @Override + public WidgetWithBounds wrapOverflow(Rectangle bounds, WidgetWithBounds widget) { + return new OverflowWidget(bounds, new PaddedCenterWidget(bounds, widget)); + } + + @Override + public WidgetWithBounds wrapPadded(int padLeft, int padRight, int padTop, int padBottom, WidgetWithBounds widget) { + return new PaddedWidget(padLeft, padRight, padTop, padBottom, widget); + } + + @Override + public TextField createTextField(Rectangle bounds) { + return new TextFieldWidget(bounds); + } + + @Override + public BatchedSlots createBatchedSlots() { + return new BatchedEntryRendererManager(); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/package-info.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/package-info.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/package-info.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/package-info.java diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index 3e7bba901..018cd2eeb 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -24,106 +24,29 @@ package me.shedaniel.rei; import dev.architectury.platform.Platform; -import dev.architectury.registry.ReloadListenerRegistry; import dev.architectury.utils.Env; import dev.architectury.utils.EnvExecutor; -import me.shedaniel.rei.api.common.display.DisplaySerializerRegistry; -import me.shedaniel.rei.api.common.entry.comparison.FluidComparatorRegistry; -import me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry; -import me.shedaniel.rei.api.common.entry.settings.EntrySettingsAdapterRegistry; -import me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry; -import me.shedaniel.rei.api.common.fluid.FluidSupportProvider; -import me.shedaniel.rei.api.common.plugins.PluginManager; -import me.shedaniel.rei.api.common.plugins.REIPlugin; -import me.shedaniel.rei.api.common.registry.RecipeManagerContext; -import me.shedaniel.rei.api.common.registry.ReloadStage; -import me.shedaniel.rei.api.common.transfer.info.MenuInfoRegistry; -import me.shedaniel.rei.impl.Internals; -import me.shedaniel.rei.impl.common.InternalLogger; -import me.shedaniel.rei.impl.common.logging.performance.PerformanceLogger; -import me.shedaniel.rei.impl.common.logging.performance.PerformanceLoggerImpl; +import me.shedaniel.rei.impl.common.Internals; import me.shedaniel.rei.impl.init.PluginDetector; -import net.minecraft.server.packs.PackType; -import net.minecraft.util.Unit; -import org.apache.commons.lang3.mutable.MutableLong; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; import java.util.List; @ApiStatus.Internal public class RoughlyEnoughItemsCore { - public static final PerformanceLogger PERFORMANCE_LOGGER = new PerformanceLoggerImpl(); public static final List PLUGIN_DETECTORS = Internals.resolveServices(PluginDetector.class); static { - attachCommonInternals(); if (Platform.getEnvironment() == Env.CLIENT) { EnvExecutor.runInEnv(Env.CLIENT, () -> RoughlyEnoughItemsCoreClient::attachClientInternals); } } - public static void attachCommonInternals() { - PluginManager.getInstance().registerReloadable(EntryTypeRegistry.class); - PluginManager.getInstance().registerReloadable(EntrySettingsAdapterRegistry.class); - PluginManager.getInstance().registerReloadable(RecipeManagerContext.class); - PluginManager.getInstance().registerReloadable(ItemComparatorRegistry.class); - PluginManager.getInstance().registerReloadable(FluidComparatorRegistry.class); - PluginManager.getInstance().registerReloadable(DisplaySerializerRegistry.class); - PluginManager.getInstance().registerReloadable(FluidSupportProvider.class); - PluginManager.getServerInstance().registerReloadable(MenuInfoRegistry.class); - Internals.attachInstanceSupplier((Runnable) () -> RoughlyEnoughItemsCore.reloadPlugins(null, null), "reloadREI"); - } - - public static void _reloadPlugins(@Nullable ReloadStage stage) { - if (stage == null) { - for (ReloadStage reloadStage : ReloadStage.values()) { - _reloadPlugins(reloadStage); - } - return; - } - try { - for (PluginManager> instance : PluginManager.getActiveInstances()) { - instance.view().pre(stage); - } - for (PluginManager> instance : PluginManager.getActiveInstances()) { - instance.startReload(stage); - } - for (PluginManager> instance : PluginManager.getActiveInstances()) { - instance.view().post(stage); - } - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - } - - public static void reloadPlugins(MutableLong lastReload, @Nullable ReloadStage start) { - if (lastReload != null) { - if (lastReload.getValue() > 0 && System.currentTimeMillis() - lastReload.getValue() <= 5000) { - InternalLogger.getInstance().warn("Suppressing Reload Plugins of stage " + start); - return; - } - lastReload.setValue(System.currentTimeMillis()); - } - if (start == null) PERFORMANCE_LOGGER.clear(); - if (Platform.getEnvironment() == Env.CLIENT) { - if (RoughlyEnoughItemsCoreClient.reloadPluginsClient(start)) return; - } - _reloadPlugins(start); - } - public void onInitialize() { for (PluginDetector detector : PLUGIN_DETECTORS) { detector.detectCommonPlugins(); detector.detectServerPlugins(); } RoughlyEnoughItemsNetwork.onInitialize(); - - if (Platform.getEnvironment() == Env.SERVER) { - MutableLong lastReload = new MutableLong(-1); - ReloadListenerRegistry.register(PackType.SERVER_DATA, (preparationBarrier, resourceManager, profilerFiller, profilerFiller2, executor, executor2) -> { - return preparationBarrier.wait(Unit.INSTANCE).thenRunAsync(PluginManager::reloadAll, executor2); - }); - } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java index 7c56d41d9..2c8abbdb7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java @@ -25,56 +25,36 @@ import com.google.common.collect.Lists; import com.mojang.serialization.DataResult; -import dev.architectury.event.Event; -import dev.architectury.event.EventFactory; import dev.architectury.event.EventResult; import dev.architectury.event.events.client.ClientGuiEvent; -import dev.architectury.event.events.client.ClientRecipeUpdateEvent; import dev.architectury.event.events.client.ClientScreenInputEvent; import dev.architectury.networking.NetworkManager; +import dev.architectury.platform.Platform; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; -import me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry; -import me.shedaniel.rei.api.client.entry.renderer.EntryRendererRegistry; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; +import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; -import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; -import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; -import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry; -import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.registry.screen.ClickArea; import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; -import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry; -import me.shedaniel.rei.api.client.search.SearchProvider; -import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; -import me.shedaniel.rei.api.client.subsets.SubsetsRegistry; -import me.shedaniel.rei.api.client.view.Views; import me.shedaniel.rei.api.common.category.CategoryIdentifier; -import me.shedaniel.rei.api.common.plugins.PluginManager; -import me.shedaniel.rei.api.common.plugins.PluginView; -import me.shedaniel.rei.api.common.plugins.REIPlugin; -import me.shedaniel.rei.api.common.plugins.REIPluginProvider; -import me.shedaniel.rei.api.common.registry.ReloadStage; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.widget.CatchingExceptionUtils; -import me.shedaniel.rei.impl.client.gui.widget.QueuedTooltip; +import me.shedaniel.rei.impl.client.gui.widget.TooltipImpl; import me.shedaniel.rei.impl.client.gui.widget.TooltipContextImpl; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; -import me.shedaniel.rei.impl.common.InternalLogger; -import me.shedaniel.rei.impl.common.plugins.PluginManagerImpl; import me.shedaniel.rei.impl.common.util.IssuesDetector; import me.shedaniel.rei.impl.init.PluginDetector; import net.fabricmc.api.EnvType; @@ -101,14 +81,11 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.item.crafting.Ingredient; import org.apache.commons.lang3.function.TriFunction; -import org.apache.commons.lang3.mutable.MutableLong; import org.jetbrains.annotations.Nullable; -import java.lang.reflect.InvocationTargetException; import java.util.Collection; import java.util.ConcurrentModificationException; import java.util.List; -import java.util.concurrent.*; import java.util.function.BiFunction; import java.util.function.BooleanSupplier; import java.util.function.Function; @@ -117,17 +94,7 @@ @Environment(EnvType.CLIENT) public class RoughlyEnoughItemsCoreClient { - public static final Event PRE_UPDATE_RECIPES = EventFactory.createLoop(); public static boolean isLeftMousePressed = false; - private static final ExecutorService RELOAD_PLUGINS = Executors.newSingleThreadScheduledExecutor(task -> { - Thread thread = new Thread(task, "REI-ReloadPlugins"); - thread.setDaemon(true); - thread.setUncaughtExceptionHandler(($, exception) -> { - InternalLogger.getInstance().throwException(exception); - }); - return thread; - }); - private static final List> RELOAD_TASKS = new CopyOnWriteArrayList<>(); public static void attachClientInternals() { CatchingExceptionUtils.attach(); @@ -138,9 +105,9 @@ public static void attachClientInternals() { if (entryType == null) return DataResult.error("Unknown favorite type: " + id + ", json: " + object); return entryType.read(object); }, "favoriteEntryFromJson"); - ClientInternals.attachInstance((BiFunction<@Nullable Point, Collection, Tooltip>) QueuedTooltip::impl, "tooltipProvider"); + ClientInternals.attachInstance((BiFunction<@Nullable Point, Collection, Tooltip>) TooltipImpl::impl, "tooltipProvider"); ClientInternals.attachInstance((TriFunction) TooltipContextImpl::new, "tooltipContextProvider"); - ClientInternals.attachInstance((Function) QueuedTooltip.TooltipEntryImpl::new, "tooltipEntryProvider"); + ClientInternals.attachInstance((Function) TooltipImpl.TooltipEntryImpl::new, "tooltipEntryProvider"); ClientInternals.attachInstance((Function<@Nullable Boolean, ClickArea.Result>) successful -> new ClickArea.Result() { private List> categories = Lists.newArrayList(); private BooleanSupplier execute = () -> { @@ -196,21 +163,6 @@ public Stream> getCategories() { return categories.stream(); } }, "clickAreaHandlerResult"); - ClientInternals.getPluginManager().registerReloadable(EntryRendererRegistry.class); - ClientInternals.getPluginManager().registerReloadable(Views.class); - ClientInternals.getPluginManager().registerReloadable(InputMethodRegistry.class); - ClientInternals.getPluginManager().registerReloadable(SearchProvider.class); - ClientInternals.getPluginManager().registerReloadable(ConfigManager.class); - ClientInternals.getPluginManager().registerReloadable(EntryRegistry.class); - ClientInternals.getPluginManager().registerReloadable(CollapsibleEntryRegistry.class); - ClientInternals.getPluginManager().registerReloadable(CategoryRegistry.class); - ClientInternals.getPluginManager().registerReloadable(DisplayRegistry.class); - ClientInternals.getPluginManager().registerReloadable(ScreenRegistry.class); - ClientInternals.getPluginManager().registerReloadable(FavoriteEntryType.Registry.class); - ClientInternals.getPluginManager().registerReloadable(SubsetsRegistry.class); - ClientInternals.getPluginManager().registerReloadable(TransferHandlerRegistry.class); - ClientInternals.getPluginManager().registerReloadable(REIRuntime.class); - ClientInternals.getPluginManager().registerReloadable(ConfigAddonRegistry.class); } public void onInitializeClient() { @@ -219,7 +171,6 @@ public void onInitializeClient() { for (PluginDetector detector : RoughlyEnoughItemsCore.PLUGIN_DETECTORS) { detector.detectClientPlugins().get().run(); } - loadTestPlugins(); Minecraft client = Minecraft.getInstance(); NetworkManager.registerReceiver(NetworkManager.s2c(), RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, (buf, context) -> { @@ -258,18 +209,8 @@ public void onInitializeClient() { } } }); - } - - private void loadTestPlugins() { - if (System.getProperty("rei.test", "false").equals("true")) { - try { - PluginView.getClientInstance().registerPlugin((REIPluginProvider) Class.forName("me.shedaniel.rei.plugin.test.REITestPlugin") - .getDeclaredConstructor() - .newInstance()); - } catch (InstantiationException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } + + Platform.getMod("roughlyenoughitems").registerConfigurationScreen(ConfigManager.getInstance()::getConfigScreen); } public static boolean shouldReturn(Screen screen) { @@ -299,37 +240,11 @@ private static boolean _shouldReturn(Screen screen) { private void registerEvents() { Minecraft client = Minecraft.getInstance(); final ResourceLocation recipeButtonTex = new ResourceLocation("textures/gui/recipe_button.png"); - MutableLong startReload = new MutableLong(-1); - MutableLong endReload = new MutableLong(-1); - PRE_UPDATE_RECIPES.register(recipeManager -> { - PluginManager.reloadAll(); - RoughlyEnoughItemsCore.reloadPlugins(startReload, ReloadStage.START); - }); - ClientRecipeUpdateEvent.EVENT.register(recipeManager -> { - RoughlyEnoughItemsCore.reloadPlugins(endReload, ReloadStage.END); - }); - ClientGuiEvent.INIT_PRE.register((screen, access) -> { - List stages = ((PluginManagerImpl>) PluginManager.getInstance()).getReloader().getObservedStages(); - - if (Minecraft.getInstance().level != null && Minecraft.getInstance().player != null && stages.contains(ReloadStage.START) - && !stages.contains(ReloadStage.END) && !PluginManager.areAnyReloading() && screen instanceof AbstractContainerScreen) { - for (Future task : RELOAD_TASKS) { - if (!task.isDone()) { - return EventResult.pass(); - } - } - - InternalLogger.getInstance().error("Detected missing stage: END! This is possibly due to issues during client recipe reload! REI will force a reload of the recipes now!"); - RoughlyEnoughItemsCore.reloadPlugins(endReload, ReloadStage.END); - } - - return EventResult.pass(); - }); ClientGuiEvent.INIT_POST.register((screen, access) -> { REIRuntime.getInstance().getOverlay(false, true); if (Minecraft.getInstance().screen == screen) { if (REIRuntime.getInstance().getPreviousScreen() != screen) { - OverlaySearchField searchField = REIRuntimeImpl.getSearchField(); + TextField searchField = REIRuntime.getInstance().getSearchTextField(); if (searchField != null) { searchField.setFocused(false); @@ -382,7 +297,7 @@ && resetFocused(screen)) if (shouldReturn(screen) || screen instanceof DisplayScreen) return EventResult.pass(); if (screen.getFocused() != null && screen.getFocused() instanceof EditBox || (screen.getFocused() instanceof RecipeBookComponent && ((RecipeBookComponent) screen.getFocused()).searchBox != null && ((RecipeBookComponent) screen.getFocused()).searchBox.isFocused())) - if (!REIRuntimeImpl.getSearchField().isFocused()) + if (REIRuntime.getInstance().getSearchTextField() != null && !REIRuntime.getInstance().getSearchTextField().isFocused()) return EventResult.pass(); resetFocused(screen); if (getOverlay().charTyped(character, keyCode) @@ -419,7 +334,7 @@ && resetFocused(screen)) } } if (screen.getFocused() != null && screen.getFocused() instanceof EditBox || (screen.getFocused() instanceof RecipeBookComponent && ((RecipeBookComponent) screen.getFocused()).searchBox != null && ((RecipeBookComponent) screen.getFocused()).searchBox.isFocused())) - if (!REIRuntimeImpl.getSearchField().isFocused()) + if (REIRuntime.getInstance().getSearchTextField() != null && !REIRuntime.getInstance().getSearchTextField().isFocused()) return EventResult.pass(); resetFocused(screen); if (getOverlay().keyPressed(i, i1, i2) @@ -431,7 +346,7 @@ && resetFocused(screen)) if (shouldReturn(screen) || screen instanceof DisplayScreen) return EventResult.pass(); if (screen.getFocused() != null && screen.getFocused() instanceof EditBox || (screen.getFocused() instanceof RecipeBookComponent && ((RecipeBookComponent) screen.getFocused()).searchBox != null && ((RecipeBookComponent) screen.getFocused()).searchBox.isFocused())) - if (!REIRuntimeImpl.getSearchField().isFocused()) + if (REIRuntime.getInstance().getSearchTextField() != null && !REIRuntime.getInstance().getSearchTextField().isFocused()) return EventResult.pass(); resetFocused(screen); if (getOverlay().keyReleased(i, i1, i2) @@ -447,23 +362,4 @@ private boolean resetFocused(Screen screen) { } return true; } - - static boolean reloadPluginsClient(@Nullable ReloadStage start) { - if (ConfigObject.getInstance().doesRegisterRecipesInAnotherThread()) { - Future[] futures = new Future[1]; - CompletableFuture future = CompletableFuture.runAsync(() -> RoughlyEnoughItemsCore._reloadPlugins(start), RELOAD_PLUGINS) - .whenComplete((unused, throwable) -> { - // Remove the future from the list of futures - if (futures[0] != null) { - RELOAD_TASKS.remove(futures[0]); - futures[0] = null; - } - }); - futures[0] = future; - RELOAD_TASKS.add(future); - return true; - } - - return false; - } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java index b690e0932..78128ca0a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java @@ -27,9 +27,6 @@ import dev.architectury.networking.NetworkManager; import dev.architectury.platform.Platform; import io.netty.buffer.Unpooled; -import it.unimi.dsi.fastutil.longs.Long2LongMap; -import it.unimi.dsi.fastutil.longs.Long2LongMaps; -import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap; import me.shedaniel.rei.RoughlyEnoughItemsNetwork; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.config.ConfigManager; @@ -41,12 +38,9 @@ import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext; -import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.api.common.util.FormattingUtils; -import me.shedaniel.rei.impl.ClientInternals; import me.shedaniel.rei.impl.client.gui.screen.CompositeDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; import me.shedaniel.rei.impl.display.DisplaySpec; @@ -56,13 +50,11 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; -import net.minecraft.core.NonNullList; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -259,85 +251,34 @@ public boolean tryCheatingEntryTo(EntryStack e, int hotbarSlotId) { } else return false; } - @ApiStatus.Internal - public Long2LongMap _getInventoryItemsTypes() { - EntryDefinition definition; - try { - definition = VanillaEntryTypes.ITEM.getDefinition(); - } catch (NullPointerException e) { - return Long2LongMaps.EMPTY_MAP; - } - Long2LongOpenHashMap map = new Long2LongOpenHashMap(); - for (NonNullList compartment : Minecraft.getInstance().player.getInventory().compartments) { - for (ItemStack stack : compartment) { - long hash = definition.hash(null, stack, ComparisonContext.FUZZY); - long newCount = map.getOrDefault(hash, 0) + Math.max(0, stack.getCount()); - map.put(hash, newCount); - } - } - return map; - } - - @ApiStatus.Internal - public Long2LongMap _getContainerItemsTypes() { - EntryDefinition definition; - try { - definition = VanillaEntryTypes.ITEM.getDefinition(); - } catch (NullPointerException e) { - return Long2LongMaps.EMPTY_MAP; - } - Long2LongOpenHashMap map = new Long2LongOpenHashMap(); - AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; - if (menu != null) { - for (Slot slot : menu.slots) { - ItemStack stack = slot.getItem(); - - if (!stack.isEmpty()) { - long hash = definition.hash(null, stack, ComparisonContext.FUZZY); - long newCount = map.getOrDefault(hash, 0) + Math.max(0, stack.getCount()); - map.put(hash, newCount); - } - } - } - return map; - } - - @ApiStatus.Internal - public void openDisplayViewingScreen(Map, List> map, @Nullable CategoryIdentifier category, List> ingredientNotice, List> resultNotice) { - LegacyWrapperViewSearchBuilder builder = new LegacyWrapperViewSearchBuilder(map); - for (EntryStack stack : ingredientNotice) { - builder.addInputNotice(stack); - } - for (EntryStack stack : resultNotice) { - builder.addOutputNotice(stack); - } - openView(builder.setPreferredOpenedCategory(category)); - } - @Override public boolean openView(ViewSearchBuilder builder) { - Map, List> map = builder.buildMapInternal(); + return openView(builder.buildMapInternal(), builder.getPreferredOpenedCategory(), builder.getUsagesFor(), builder.getRecipesFor()); + } + + public boolean openView(Map, List> map, @Nullable CategoryIdentifier category, + List> usagesFor, List> recipesFor) { if (map.isEmpty()) return false; Screen screen; if (ConfigObject.getInstance().getRecipeScreenType() == DisplayScreenType.COMPOSITE) { - screen = new CompositeDisplayViewingScreen(map, builder.getPreferredOpenedCategory()); + screen = new CompositeDisplayViewingScreen(map, category); } else if (ConfigObject.getInstance().getRecipeScreenType() == DisplayScreenType.UNSET) { ConfigObject.getInstance().setRecipeScreenType(DisplayScreenType.ORIGINAL); ConfigManager.getInstance().saveConfig(); - return openView(builder); + return openView(map, category, usagesFor, recipesFor); // screen = new UncertainDisplayViewingScreen(REIRuntime.getInstance().getPreviousScreen(), DisplayScreenType.UNSET, true, original -> { // ConfigObject.getInstance().setRecipeScreenType(original ? DisplayScreenType.ORIGINAL : DisplayScreenType.COMPOSITE); // ConfigManager.getInstance().saveConfig(); // openView(builder); // }); } else { - screen = new DefaultDisplayViewingScreen(map, builder.getPreferredOpenedCategory()); + screen = new DefaultDisplayViewingScreen(map, category); } if (screen instanceof DisplayScreen displayScreen) { - for (EntryStack stack : builder.getUsagesFor()) { + for (EntryStack stack : usagesFor) { displayScreen.addIngredientToNotice(stack); } - for (EntryStack stack : builder.getRecipesFor()) { + for (EntryStack stack : recipesFor) { displayScreen.addResultToNotice(stack); } } @@ -352,9 +293,4 @@ public boolean openView(ViewSearchBuilder builder) { public boolean canUseMovePackets() { return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.MOVE_ITEMS_PACKET); } - - public void onInitializeClient() { - ClientInternals.attachInstance(this, ClientHelper.class); - ClientInternals.attachInstance((Supplier) ViewSearchBuilderImpl::new, "viewSearchBuilder"); - } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ErrorDisplayer.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ErrorDisplayer.java index 29b7accfe..82424ac5c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ErrorDisplayer.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ErrorDisplayer.java @@ -24,7 +24,7 @@ package me.shedaniel.rei.impl.client; import me.shedaniel.rei.RoughlyEnoughItemsState; -import me.shedaniel.rei.impl.client.gui.screen.WarningAndErrorScreen; +import me.shedaniel.rei.impl.client.gui.screen.error.WarningAndErrorScreen; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java index a63ddc97d..b890bc98a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java @@ -38,13 +38,12 @@ import me.shedaniel.rei.api.client.gui.config.DisplayPanelLocation; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; -import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.registry.ReloadStage; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.Internals; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; @@ -71,7 +70,6 @@ public class REIRuntimeImpl implements REIRuntime { @ApiStatus.Internal public static boolean isWithinRecipeViewingScreen = false; private ScreenOverlayImpl overlay; - private OverlaySearchField searchField; private AbstractContainerScreen previousContainerScreen = null; private Screen previousScreen = null; private LinkedHashSet lastDisplayScreen = Sets.newLinkedHashSetWithExpectedSize(10); @@ -104,16 +102,6 @@ public void clearTooltips() { } } - @Override - @Nullable - public TextField getSearchTextField() { - if (searchField == null) { - searchField = new OverlaySearchField(0, 0, 0, 0); - } - - return searchField; - } - @Nullable public static OverlaySearchField getSearchField() { return (OverlaySearchField) getInstance().getSearchTextField(); @@ -159,7 +147,7 @@ public Optional getOverlay(boolean reset, boolean init) { throw new RuntimeException(e); } overlay.init(); - getSearchField().setFocused(false); + overlay.getSearchField().setFocused(false); } return Optional.ofNullable(overlay); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java index b4c1987d0..2b3b59a9b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java @@ -39,6 +39,7 @@ import me.shedaniel.rei.api.client.gui.drag.DraggingContext; import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentProvider; import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentVisitor; +import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.overlay.OverlayListWidget; @@ -49,11 +50,10 @@ import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.plugins.PluginManager; -import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.craftable.CraftableFilter; import me.shedaniel.rei.impl.client.gui.dragging.CurrentDraggingStack; -import me.shedaniel.rei.impl.client.gui.modules.MenuAccess; -import me.shedaniel.rei.impl.client.gui.modules.MenuHolder; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccessImpl; import me.shedaniel.rei.impl.client.gui.widget.*; import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget; import me.shedaniel.rei.impl.client.gui.widget.entrylist.PaginatedEntryListWidget; @@ -64,9 +64,6 @@ import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.InteractionResult; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -82,6 +79,7 @@ public abstract class ScreenOverlayImpl extends ScreenOverlay { private static final List TOOLTIPS = Lists.newArrayList(); private static EntryListWidget entryListWidget = null; private static FavoritesListWidget favoritesListWidget = null; + private static OverlaySearchField searchField = null; private final List widgets = Lists.newLinkedList(); public boolean shouldReload = false; public boolean shouldReloadSearch = false; @@ -91,7 +89,7 @@ public abstract class ScreenOverlayImpl extends ScreenOverlay { private CurrentDraggingStack draggingStack = new CurrentDraggingStack(); @Nullable public DefaultDisplayChoosePageWidget choosePageWidget; - private MenuHolder menuHolder = new MenuHolder(); + private MenuAccessImpl menuAccess = new MenuAccessImpl(); public static EntryListWidget getEntryListWidget() { boolean widgetScrolled = ConfigObject.getInstance().isEntryListWidgetScrolled(); @@ -108,7 +106,7 @@ public static EntryListWidget getEntryListWidget() { ScreenOverlayImpl overlay = ScreenOverlayImpl.getInstance(); Rectangle overlayBounds = overlay.bounds; - entryListWidget.updateArea(Objects.requireNonNullElse(overlayBounds, new Rectangle()), REIRuntimeImpl.getSearchField() == null ? "" : REIRuntimeImpl.getSearchField().getText()); + entryListWidget.updateArea(Objects.requireNonNullElse(overlayBounds, new Rectangle()), overlay.getSearchField().getText()); entryListWidget.updateEntriesPosition(); return entryListWidget; @@ -124,8 +122,8 @@ public static ScreenOverlayImpl getInstance() { } public void tick() { - if (REIRuntimeImpl.getSearchField() != null) { - REIRuntimeImpl.getSearchField().tick(); + if (searchField != null) { + getSearchField().tick(); if (Minecraft.getInstance().player != null && !PluginManager.areAnyReloading() && Minecraft.getInstance().player.tickCount % 5 == 0) { CraftableFilter.INSTANCE.tick(); } @@ -169,9 +167,9 @@ public void init() { this.widgets.add(favoritesListWidget); } - OverlaySearchField searchField = REIRuntimeImpl.getSearchField(); - searchField.getBounds().setBounds(getSearchFieldArea()); - this.widgets.add(searchField); + TextField searchField = getSearchField(); + searchField.asWidget().getBounds().setBounds(getSearchFieldArea()); + this.widgets.add(searchField.asWidget()); EntryListWidget entryListWidget = getEntryListWidget(); entryListWidget.updateArea(this.bounds, searchField.getText()); @@ -221,7 +219,7 @@ public Rectangle getBounds() { public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { if (shouldReload || !calculateOverlayBounds().equals(bounds)) { init(); - getEntryListWidget().updateSearch(REIRuntimeImpl.getSearchField().getText(), true); + getEntryListWidget().updateSearch(REIRuntime.getInstance().getSearchTextField().getText(), true); } else { for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(minecraft.screen)) { if (decider != null && decider.shouldRecalculateArea(ConfigObject.getInstance().getDisplayPanelLocation(), bounds)) { @@ -232,7 +230,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { } if (shouldReloadSearch || (ConfigManager.getInstance().isCraftableOnlyEnabled() && CraftableFilter.INSTANCE.wasDirty())) { shouldReloadSearch = false; - getEntryListWidget().updateSearch(REIRuntimeImpl.getSearchField().getText(), true); + getEntryListWidget().updateSearch(getSearchField().getText(), true); } if (OverlaySearchField.isHighlighting) { EntryHighlighter.render(matrices); @@ -283,14 +281,14 @@ private static Rectangle calculateOverlayBounds() { public void lateRender(PoseStack matrices, int mouseX, int mouseY, float delta) { if (REIRuntime.getInstance().isOverlayVisible() && hasSpace()) { - REIRuntimeImpl.getSearchField().laterRender(matrices, mouseX, mouseY, delta); + getSearchField().laterRender(matrices, mouseX, mouseY, delta); for (Widget widget : widgets) { - if (widget instanceof LateRenderable && widget != menuHolder.widget()) + if (widget instanceof LateRenderable && widget != menuAccess.widget()) widget.render(matrices, mouseX, mouseY, delta); } matrices.pushPose(); matrices.translate(0, 0, 500); - menuHolder.lateRender(matrices, mouseX, mouseY, delta); + menuAccess.lateRender(matrices, mouseX, mouseY, delta); matrices.popPose(); if (choosePageWidget != null) { setBlitOffset(500); @@ -306,10 +304,11 @@ public void lateRender(PoseStack matrices, int mouseX, int mouseY, float delta) } TOOLTIPS.clear(); if (REIRuntime.getInstance().isOverlayVisible()) { - menuHolder.afterRender(); + menuAccess.afterRender(); } } + @Override public void renderTooltip(PoseStack matrices, Tooltip tooltip) { renderTooltipInner(minecraft.screen, matrices, tooltip, tooltip.getX(), tooltip.getY()); } @@ -338,7 +337,7 @@ public void renderWidgets(PoseStack matrices, int mouseX, int mouseY, float delt public boolean mouseScrolled(double mouseX, double mouseY, double amount) { if (!REIRuntime.getInstance().isOverlayVisible()) return false; - if (menuHolder.mouseScrolled(mouseX, mouseY, amount)) + if (menuAccess.mouseScrolled(mouseX, mouseY, amount)) return true; if (isInside(mouseX, mouseY) && getEntryListWidget().mouseScrolled(mouseX, mouseY, amount)) { return true; @@ -349,7 +348,7 @@ public boolean mouseScrolled(double mouseX, double mouseY, double amount) { } for (Widget widget : widgets) if (widget != getEntryListWidget() && (favoritesListWidget == null || widget != favoritesListWidget) - && widget != menuHolder.widget() + && widget != menuAccess.widget() && widget.mouseScrolled(mouseX, mouseY, amount)) return true; return false; @@ -365,10 +364,10 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { } if (choosePageWidget != null) return choosePageWidget.keyPressed(keyCode, scanCode, modifiers); - if (REIRuntimeImpl.getSearchField().keyPressed(keyCode, scanCode, modifiers)) + if (getSearchField().keyPressed(keyCode, scanCode, modifiers)) return true; for (GuiEventListener listener : widgets) - if (listener != REIRuntimeImpl.getSearchField() && listener.keyPressed(keyCode, scanCode, modifiers)) + if (listener != getSearchField() && listener.keyPressed(keyCode, scanCode, modifiers)) return true; } if (ConfigObject.getInstance().getHideKeybind().matchesKey(keyCode, scanCode)) { @@ -391,10 +390,10 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (!REIRuntime.getInstance().isOverlayVisible()) return false; if (ConfigObject.getInstance().getFocusSearchFieldKeybind().matchesKey(keyCode, scanCode)) { - REIRuntimeImpl.getSearchField().setFocused(true); - setFocused(REIRuntimeImpl.getSearchField()); - REIRuntimeImpl.getSearchField().keybindFocusTime = System.currentTimeMillis(); - REIRuntimeImpl.getSearchField().keybindFocusKey = keyCode; + getSearchField().setFocused(true); + setFocused(getSearchField()); + getSearchField().keybindFocusTime = System.currentTimeMillis(); + getSearchField().keybindFocusKey = keyCode; return true; } return false; @@ -405,10 +404,10 @@ public boolean keyReleased(int keyCode, int scanCode, int modifiers) { if (!hasSpace()) return false; if (REIRuntime.getInstance().isOverlayVisible()) { if (choosePageWidget == null) { - if (REIRuntimeImpl.getSearchField().keyReleased(keyCode, scanCode, modifiers)) + if (getSearchField().keyReleased(keyCode, scanCode, modifiers)) return true; for (GuiEventListener listener : widgets) - if (listener != REIRuntimeImpl.getSearchField() && listener == getFocused() && listener.keyPressed(keyCode, scanCode, modifiers)) + if (listener != getSearchField() && listener == getFocused() && listener.keyPressed(keyCode, scanCode, modifiers)) return true; } } @@ -423,10 +422,10 @@ public boolean charTyped(char character, int modifiers) { if (choosePageWidget != null) { return choosePageWidget.charTyped(character, modifiers); } - if (REIRuntimeImpl.getSearchField().charTyped(character, modifiers)) + if (getSearchField().charTyped(character, modifiers)) return true; for (GuiEventListener listener : widgets) - if (listener != REIRuntimeImpl.getSearchField() && listener.charTyped(character, modifiers)) + if (listener != getSearchField() && listener.charTyped(character, modifiers)) return true; return false; } @@ -473,12 +472,12 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { } } if (visible) { - Widget menuWidget = menuHolder.widget(); + Widget menuWidget = menuAccess.widget(); if (menuWidget != null && menuWidget.mouseClicked(mouseX, mouseY, button)) { this.setFocused(menuWidget); if (button == 0) this.setDragging(true); - REIRuntimeImpl.getSearchField().setFocused(false); + getSearchField().setFocused(false); return true; } } @@ -493,20 +492,20 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { return false; } for (GuiEventListener element : widgets) { - if (element != configButton && element != menuHolder.widget() && element.mouseClicked(mouseX, mouseY, button)) { + if (element != configButton && element != menuAccess.widget() && element.mouseClicked(mouseX, mouseY, button)) { this.setFocused(element); if (button == 0) this.setDragging(true); if (!(element instanceof OverlaySearchField)) - REIRuntimeImpl.getSearchField().setFocused(false); + getSearchField().setFocused(false); return true; } } if (ConfigObject.getInstance().getFocusSearchFieldKeybind().matchesMouse(button)) { - REIRuntimeImpl.getSearchField().setFocused(true); - setFocused(REIRuntimeImpl.getSearchField()); - REIRuntimeImpl.getSearchField().keybindFocusTime = -1; - REIRuntimeImpl.getSearchField().keybindFocusKey = -1; + getSearchField().setFocused(true); + setFocused(getSearchField().asWidget()); + getSearchField().keybindFocusTime = -1; + getSearchField().keybindFocusKey = -1; return true; } return false; @@ -559,6 +558,15 @@ public Optional getFavoritesList() { } public MenuAccess menuAccess() { - return menuHolder; + return menuAccess; + } + + @Override + public OverlaySearchField getSearchField() { + if (searchField == null) { + searchField = new OverlaySearchField(0, 0, 0, 0); + } + + return searchField; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/AbstractMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/AbstractMenuEntry.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/AbstractMenuEntry.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/AbstractMenuEntry.java index 47fc0b085..0debff33b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/AbstractMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/AbstractMenuEntry.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.modules; +package me.shedaniel.rei.impl.client.gui.menu; public abstract class AbstractMenuEntry extends MenuEntry { private int x, y, width; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/Menu.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/Menu.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java index 05173e464..aa66c25ad 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/Menu.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.modules; +package me.shedaniel.rei.impl.client.gui.menu; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; @@ -32,7 +32,7 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; -import me.shedaniel.rei.impl.client.gui.modules.entries.SubMenuEntry; +import me.shedaniel.rei.impl.client.gui.menu.entries.SubMenuEntry; import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; import net.minecraft.client.Minecraft; import org.jetbrains.annotations.ApiStatus; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuAccess.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuAccess.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java index 3d8d6896f..b890ccd94 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuAccess.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.modules; +package me.shedaniel.rei.impl.client.gui.menu; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuHolder.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuHolder.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java index a112f0462..aae20757f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuHolder.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.modules; +package me.shedaniel.rei.impl.client.gui.menu; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; @@ -37,7 +37,7 @@ import java.util.function.Consumer; import java.util.function.Predicate; -public class MenuHolder implements MenuAccess { +public class MenuAccessImpl implements MenuAccess { public final List afterRenders = Lists.newArrayList(); @Nullable private OverlayMenu menu = null; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuEntry.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuEntry.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuEntry.java index c2cf89925..e5c7109d8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/MenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuEntry.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.modules; +package me.shedaniel.rei.impl.client.gui.menu; import me.shedaniel.rei.api.client.gui.widgets.Widget; import org.jetbrains.annotations.ApiStatus; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/EmptyMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/EmptyMenuEntry.java similarity index 93% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/EmptyMenuEntry.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/EmptyMenuEntry.java index 4ccfa4414..e269a496d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/EmptyMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/EmptyMenuEntry.java @@ -21,10 +21,10 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.modules.entries; +package me.shedaniel.rei.impl.client.gui.menu.entries; import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.rei.impl.client.gui.modules.AbstractMenuEntry; +import me.shedaniel.rei.impl.client.gui.menu.AbstractMenuEntry; import net.minecraft.client.gui.components.events.GuiEventListener; import java.util.Collections; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SeparatorMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SeparatorMenuEntry.java similarity index 93% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SeparatorMenuEntry.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SeparatorMenuEntry.java index 8af7d4c52..bd0425e74 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SeparatorMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SeparatorMenuEntry.java @@ -21,10 +21,10 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.modules.entries; +package me.shedaniel.rei.impl.client.gui.menu.entries; import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.rei.impl.client.gui.modules.AbstractMenuEntry; +import me.shedaniel.rei.impl.client.gui.menu.AbstractMenuEntry; import net.minecraft.client.gui.components.events.GuiEventListener; import java.util.Collections; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SubMenuEntry.java similarity index 96% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubMenuEntry.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SubMenuEntry.java index ada112783..24ae2249c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/SubMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SubMenuEntry.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.modules.entries; +package me.shedaniel.rei.impl.client.gui.menu.entries; import com.google.common.base.MoreObjects; import com.google.common.collect.Lists; @@ -31,9 +31,9 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; -import me.shedaniel.rei.impl.client.gui.modules.AbstractMenuEntry; -import me.shedaniel.rei.impl.client.gui.modules.Menu; -import me.shedaniel.rei.impl.client.gui.modules.MenuEntry; +import me.shedaniel.rei.impl.client.gui.menu.AbstractMenuEntry; +import me.shedaniel.rei.impl.client.gui.menu.Menu; +import me.shedaniel.rei.impl.client.gui.menu.MenuEntry; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.network.chat.Component; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/TextMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/TextMenuEntry.java similarity index 95% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/TextMenuEntry.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/TextMenuEntry.java index 69740e383..57fb07d55 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/TextMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/TextMenuEntry.java @@ -21,10 +21,10 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.modules.entries; +package me.shedaniel.rei.impl.client.gui.menu.entries; import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.rei.impl.client.gui.modules.AbstractMenuEntry; +import me.shedaniel.rei.impl.client.gui.menu.AbstractMenuEntry; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.network.chat.Component; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/ToggleMenuEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/ToggleMenuEntry.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java index bf250f086..7c707681a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/modules/entries/ToggleMenuEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.modules.entries; +package me.shedaniel.rei.impl.client.gui.menu.entries; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; @@ -33,7 +33,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.modules.AbstractMenuEntry; +import me.shedaniel.rei.impl.client.gui.menu.AbstractMenuEntry; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.Component; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java index b7a6493db..2dc2e452c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java @@ -153,7 +153,7 @@ public void previousCategory() { currentCategoryIndex--; if (currentCategoryIndex < 0) currentCategoryIndex = categories.size() - 1; - ClientHelperImpl.getInstance().openDisplayViewingScreen(categoryMap, categories.get(currentCategoryIndex).getCategoryIdentifier(), ingredientStackToNotice, resultStackToNotice); + ClientHelperImpl.getInstance().openView(categoryMap, categories.get(currentCategoryIndex).getCategoryIdentifier(), ingredientStackToNotice, resultStackToNotice); } @Override @@ -162,7 +162,7 @@ public void nextCategory() { currentCategoryIndex++; if (currentCategoryIndex >= categories.size()) currentCategoryIndex = 0; - ClientHelperImpl.getInstance().openDisplayViewingScreen(categoryMap, categories.get(currentCategoryIndex).getCategoryIdentifier(), ingredientStackToNotice, resultStackToNotice); + ClientHelperImpl.getInstance().openView(categoryMap, categories.get(currentCategoryIndex).getCategoryIdentifier(), ingredientStackToNotice, resultStackToNotice); } protected void transformIngredientNotice(List setupDisplay, List> noticeStacks) { @@ -181,7 +181,7 @@ private static void transformNotice(int marker, List for (EntryStack noticeStack : noticeStacks) { EntryStack stack = CollectionUtils.findFirstOrNullEqualsExact(widget.getEntries(), noticeStack); if (stack != null) { - widget.clearStacks(); + widget.clearEntries(); widget.entry(stack); break; } @@ -195,7 +195,7 @@ protected void transformFiltering(List setupDisplay) if (widget.getEntries().size() > 1) { Collection> refiltered = EntryRegistry.getInstance().refilterNew(false, widget.getEntries()); if (!refiltered.isEmpty()) { - widget.clearStacks(); + widget.clearEntries(); widget.entries(refiltered); } } 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 d035b5430..f4957da0c 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 @@ -47,8 +47,8 @@ import me.shedaniel.rei.impl.client.ClientHelperImpl; import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.InternalTextures; +import me.shedaniel.rei.impl.client.gui.widget.AutoCraftingButtonWidget; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; -import me.shedaniel.rei.impl.client.gui.widget.InternalWidgets; import me.shedaniel.rei.impl.client.gui.widget.TabWidget; import me.shedaniel.rei.impl.display.DisplaySpec; import net.minecraft.client.Minecraft; @@ -175,7 +175,7 @@ public void init() { this.widgets.addAll(setupDisplay); Optional supplier = CategoryRegistry.getInstance().get(category.getCategoryIdentifier()).getPlusButtonArea(); if (supplier.isPresent() && supplier.get().get(recipeBounds) != null) - this.widgets.add(InternalWidgets.createAutoCraftingButtonWidget(recipeBounds, supplier.get().get(recipeBounds), new TextComponent(supplier.get().getButtonText()), display::provideInternalDisplay, display::provideInternalDisplayIds, setupDisplay, category)); + this.widgets.add(AutoCraftingButtonWidget.create(recipeBounds, supplier.get().get(recipeBounds), new TextComponent(supplier.get().getButtonText()), display::provideInternalDisplay, display::provideInternalDisplayIds, setupDisplay, category)); int index = 0; for (DisplaySpec recipeDisplay : categoryMap.get(category)) { @@ -203,7 +203,7 @@ public void init() { Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); if (widget.selected) return false; - ClientHelperImpl.getInstance().openDisplayViewingScreen(categoryMap, tabCategory.getCategoryIdentifier(), ingredientStackToNotice, resultStackToNotice); + ClientHelperImpl.getInstance().openView(categoryMap, tabCategory.getCategoryIdentifier(), ingredientStackToNotice, resultStackToNotice); return true; })); tab.setRenderer(tabCategory, tabCategory.getIcon(), tabCategory.getTitle(), j == selectedCategoryIndex); @@ -325,7 +325,7 @@ public boolean mouseScrolled(double mouseX, double mouseY, double amount) { else if (amount > 0) selectedCategoryIndex--; if (selectedCategoryIndex < 0) selectedCategoryIndex = categories.size() - 1; else if (selectedCategoryIndex >= categories.size()) selectedCategoryIndex = 0; - ClientHelperImpl.getInstance().openDisplayViewingScreen(categoryMap, categories.get(selectedCategoryIndex).getCategoryIdentifier(), ingredientStackToNotice, resultStackToNotice); + ClientHelperImpl.getInstance().openView(categoryMap, categories.get(selectedCategoryIndex).getCategoryIdentifier(), ingredientStackToNotice, resultStackToNotice); return true; } if (bounds.contains(PointHelper.ofMouse())) { 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 c84292c04..97b08d0dd 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 @@ -59,7 +59,6 @@ import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.toast.ExportRecipeIdentifierToast; import me.shedaniel.rei.impl.client.gui.widget.*; -import me.shedaniel.rei.impl.client.gui.widget.basewidgets.PanelWidget; import me.shedaniel.rei.impl.display.DisplaySpec; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -263,7 +262,7 @@ public void init() { Minecraft.getInstance().getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); if (widget.getId() + categoryPages * tabsPerPage == selectedCategoryIndex) return false; - ClientHelperImpl.getInstance().openDisplayViewingScreen(categoryMap, categories.get(widget.getId() + categoryPages * tabsPerPage).getCategoryIdentifier(), ingredientStackToNotice, resultStackToNotice); + ClientHelperImpl.getInstance().openView(categoryMap, categories.get(widget.getId() + categoryPages * tabsPerPage).getCategoryIdentifier(), ingredientStackToNotice, resultStackToNotice); return true; })); tab.setRenderer(categories.get(tabIndex), categories.get(tabIndex).getIcon(), categories.get(tabIndex).getTitle(), tab.getId() + categoryPages * tabsPerPage == selectedCategoryIndex); @@ -271,7 +270,7 @@ public void init() { } initDisplays(); widgets = CollectionUtils.map(widgets, widget -> Widgets.withTranslate(widget, 0, 0, 10)); - widgets.add(Widgets.withTranslate(new PanelWidget(bounds), 0, 0, 5)); + widgets.add(Widgets.withTranslate(Widgets.createCategoryBase(bounds), 0, 0, 5)); widgets.add(Widgets.withTranslate(Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { fill(matrices, bounds.x + 17, bounds.y + 5, bounds.x + bounds.width - 17, bounds.y + 17, darkStripesColor.value().getColor()); fill(matrices, bounds.x + 17, bounds.y + 19, bounds.x + bounds.width - 17, bounds.y + 31, darkStripesColor.value().getColor()); @@ -310,7 +309,7 @@ private void initDisplays() { this.recipeBounds.put(displayBounds, Pair.of(display, setupDisplay)); this.widgets.add(new DisplayCompositeWidget(display, setupDisplay, displayBounds)); if (plusButtonArea.isPresent()) { - this.widgets.add(InternalWidgets.createAutoCraftingButtonWidget(displayBounds, plusButtonArea.get().get(displayBounds), new TextComponent(plusButtonArea.get().getButtonText()), displaySupplier, display::provideInternalDisplayIds, setupDisplay, getCurrentCategory())); + this.widgets.add(AutoCraftingButtonWidget.create(displayBounds, plusButtonArea.get().get(displayBounds), new TextComponent(plusButtonArea.get().getButtonText()), displaySupplier, display::provideInternalDisplayIds, setupDisplay, getCurrentCategory())); } } } @@ -561,7 +560,7 @@ public static class WorkstationSlotWidget extends EntryWidget { public WorkstationSlotWidget(int x, int y, EntryIngredient widgets) { super(new Point(x, y)); entries(widgets); - noBackground(); + disableBackground(); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DynamicErrorFreeEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/error/DynamicErrorFreeEntryListWidget.java similarity index 99% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DynamicErrorFreeEntryListWidget.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/error/DynamicErrorFreeEntryListWidget.java index 528341ab7..fce32a8b8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DynamicErrorFreeEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/error/DynamicErrorFreeEntryListWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.screen.error; import com.google.common.collect.Lists; import com.mojang.blaze3d.systems.RenderSystem; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/WarningAndErrorScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/error/WarningAndErrorScreen.java similarity index 99% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/WarningAndErrorScreen.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/error/WarningAndErrorScreen.java index 021ffa14e..737abec2a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/WarningAndErrorScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/error/WarningAndErrorScreen.java @@ -21,12 +21,11 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.screen; +package me.shedaniel.rei.impl.client.gui.screen.error; import com.google.common.collect.ImmutableList; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.rei.RoughlyEnoughItemsState; -import me.shedaniel.rei.impl.client.gui.widget.DynamicErrorFreeEntryListWidget; import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.client.Minecraft; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/CopyRecipeIdentifierToast.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/CopyRecipeIdentifierToast.java index 1c4ab36cc..4a8891696 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/CopyRecipeIdentifierToast.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/CopyRecipeIdentifierToast.java @@ -72,5 +72,4 @@ public Object getToken() { public enum Type { THIS_IS_SURE_A_TYPE } - } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java new file mode 100644 index 000000000..9beda75c0 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java @@ -0,0 +1,134 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.widget; + +import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.math.impl.PointHelper; +import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.gui.widgets.*; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.common.display.Display; +import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import me.shedaniel.rei.impl.client.gui.toast.CopyRecipeIdentifierToast; +import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.resources.ResourceLocation; + +import java.util.Collection; +import java.util.List; +import java.util.function.Supplier; + +public class AutoCraftingButtonWidget { + public static Widget create(Rectangle displayBounds, Rectangle rectangle, Component text, + Supplier displaySupplier, Supplier> idsSupplier, List setupDisplay, DisplayCategory category) { + Button autoCraftingButton = Widgets.createButton(rectangle, text) + .focusable(false) + .onClick(button -> { + AutoCraftingEvaluator.evaluateAutoCrafting(true, Screen.hasShiftDown(), displaySupplier.get(), idsSupplier); + }); + return new DelegateWidget(autoCraftingButton) { + @Override + public void render(PoseStack poses, int mouseX, int mouseY, float delta) { + AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, displaySupplier.get(), idsSupplier); + + autoCraftingButton.setEnabled(result.successful); + autoCraftingButton.setTint(result.tint); + + if (result.hasApplicable) { + autoCraftingButton.setText(text); + } else { + autoCraftingButton.setText(new TextComponent("!")); + } + + if (result.hasApplicable && (containsMouse(mouseX, mouseY) || autoCraftingButton.isFocused()) && result.renderer != null) { + result.renderer.render(poses, mouseX, mouseY, delta, setupDisplay, displayBounds, displaySupplier.get()); + } + + this.widget.render(poses, mouseX, mouseY, delta); + + if (!autoCraftingButton.isFocused() && containsMouse(mouseX, mouseY)) { + tryTooltip(result, new Point(mouseX, mouseY)); + } else if (autoCraftingButton.isFocused()) { + Rectangle bounds = autoCraftingButton.getBounds(); + tryTooltip(result, new Point(bounds.x + bounds.width / 2, bounds.y + bounds.height / 2)); + } + } + + private void tryTooltip(AutoCraftingEvaluator.AutoCraftingResult result, Point point) { + if (result.tooltipRenderer != null) { + result.tooltipRenderer.accept(point, Tooltip::queue); + } + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (displaySupplier.get().getDisplayLocation().isPresent() && ConfigObject.getInstance().getCopyRecipeIdentifierKeybind().matchesKey(keyCode, scanCode) && containsMouse(PointHelper.ofMouse())) { + minecraft.keyboardHandler.setClipboard(displaySupplier.get().getDisplayLocation().get().toString()); + if (ConfigObject.getInstance().isToastDisplayedOnCopyIdentifier()) { + CopyRecipeIdentifierToast.addToast(I18n.get("msg.rei.copied_recipe_id"), I18n.get("msg.rei.recipe_id_details", displaySupplier.get().getDisplayLocation().get().toString())); + } + return true; + } else if (ConfigObject.getInstance().isFavoritesEnabled() && containsMouse(PointHelper.ofMouse())) { + if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { + FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); + + if (favoritesListWidget != null) { + favoritesListWidget.displayHistory.addDisplay(displayBounds.clone(), displaySupplier.get()); + return true; + } + } + } + + return super.keyPressed(keyCode, scanCode, modifiers); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (displaySupplier.get().getDisplayLocation().isPresent() && ConfigObject.getInstance().getCopyRecipeIdentifierKeybind().matchesMouse(button) && containsMouse(PointHelper.ofMouse())) { + minecraft.keyboardHandler.setClipboard(displaySupplier.get().getDisplayLocation().get().toString()); + if (ConfigObject.getInstance().isToastDisplayedOnCopyIdentifier()) { + CopyRecipeIdentifierToast.addToast(I18n.get("msg.rei.copied_recipe_id"), I18n.get("msg.rei.recipe_id_details", displaySupplier.get().getDisplayLocation().get().toString())); + } + return true; + } else if (ConfigObject.getInstance().isFavoritesEnabled() && containsMouse(PointHelper.ofMouse())) { + if (ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { + FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); + + if (favoritesListWidget != null) { + favoritesListWidget.displayHistory.addDisplay(displayBounds.clone(), displaySupplier.get()); + return true; + } + } + } + + return super.mouseClicked(mouseX, mouseY, button); + } + }; + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CatchingExceptionUtils.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CatchingExceptionUtils.java index a1c5a6825..eadf274ef 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CatchingExceptionUtils.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CatchingExceptionUtils.java @@ -24,7 +24,7 @@ package me.shedaniel.rei.impl.client.gui.widget; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.client.gui.error.ErrorsEntryListWidget; import me.shedaniel.rei.impl.client.gui.error.ErrorsScreen; import me.shedaniel.rei.impl.client.util.CrashReportUtils; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java index 03fc87793..354090d01 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java @@ -42,9 +42,9 @@ import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.modules.MenuAccess; -import me.shedaniel.rei.impl.client.gui.modules.MenuEntry; -import me.shedaniel.rei.impl.client.gui.modules.entries.*; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; +import me.shedaniel.rei.impl.client.gui.menu.MenuEntry; +import me.shedaniel.rei.impl.client.gui.menu.entries.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.screens.Screen; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java index 26cb5a9f4..8358bbbf2 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java @@ -25,6 +25,7 @@ import com.mojang.math.Vector4f; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; @@ -32,16 +33,18 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.search.method.InputMethod; import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.modules.MenuAccess; -import me.shedaniel.rei.impl.client.gui.modules.MenuEntry; -import me.shedaniel.rei.impl.client.gui.modules.entries.SubMenuEntry; -import me.shedaniel.rei.impl.client.gui.modules.entries.ToggleMenuEntry; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; +import me.shedaniel.rei.impl.client.gui.menu.MenuEntry; +import me.shedaniel.rei.impl.client.gui.menu.entries.SubMenuEntry; +import me.shedaniel.rei.impl.client.gui.menu.entries.ToggleMenuEntry; import me.shedaniel.rei.impl.client.gui.screen.ConfigReloadingScreen; import me.shedaniel.rei.impl.common.InternalLogger; import net.minecraft.client.Minecraft; @@ -71,7 +74,7 @@ public static Widget create(ScreenOverlayImpl overlay) { .focusable(false) .onClick(button -> { ConfigManager.getInstance().toggleCraftableOnly(); - ScreenOverlayImpl.getEntryListWidget().updateSearch(REIRuntimeImpl.getSearchField().getText(), true); + REIRuntime.getInstance().getOverlay().map(ScreenOverlay::getEntryList).ifPresent(OverlayListWidget::queueReloadSearch); }) .onRender((matrices, button) -> { button.setTint(ConfigManager.getInstance().isCraftableOnlyEnabled() ? 0x3800d907 : 0x38ff0000); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DefaultDisplayChoosePageWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DefaultDisplayChoosePageWidget.java index af0e2de06..894c8825f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DefaultDisplayChoosePageWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DefaultDisplayChoosePageWidget.java @@ -29,12 +29,8 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; -import me.shedaniel.rei.api.client.gui.widgets.Button; -import me.shedaniel.rei.api.client.gui.widgets.Panel; -import me.shedaniel.rei.api.client.gui.widgets.Widget; -import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.widget.basewidgets.TextFieldWidget; import net.minecraft.client.Minecraft; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.Mth; @@ -53,7 +49,7 @@ public class DefaultDisplayChoosePageWidget extends DraggableWidget { private Rectangle bounds, grabBounds, dragBounds; private List widgets; private IntConsumer callback; - private TextFieldWidget textFieldWidget; + private TextField textFieldWidget; private Panel base1, base2; private Button btnDone; @@ -97,7 +93,7 @@ public void updateWidgets(Point midPoint) { this.dragBounds = new Rectangle(midPoint.x - 50, midPoint.y - 20, 100, 70); base1.getBounds().setLocation(bounds.x + bounds.width - 50, bounds.y + bounds.height - 6); base2.getBounds().setBounds(bounds); - textFieldWidget.getBounds().setLocation(bounds.x + 7, bounds.y + 16); + textFieldWidget.asWidget().getBounds().setLocation(bounds.x + 7, bounds.y + 16); btnDone.getBounds().setLocation(bounds.x + bounds.width - 45, bounds.y + bounds.height + 3); } @@ -128,9 +124,9 @@ public void render(PoseStack matrices, int i, int i1, float v) { }); String endString = String.format(" /%d", maxPage); int width = font.width(endString); - this.widgets.add(textFieldWidget = new TextFieldWidget(bounds.x + 7, bounds.y + 16, bounds.width - width - 12, 18)); + this.widgets.add((textFieldWidget = Widgets.createTextField(new Rectangle(bounds.x + 7, bounds.y + 16, bounds.width - width - 12, 18))).asWidget()); textFieldWidget.setMaxLength(10000); - textFieldWidget.stripInvalid = s -> { + textFieldWidget.setTextTransformer(s -> { StringBuilder stringBuilder_1 = new StringBuilder(); char[] var2 = s.toCharArray(); int var3 = var2.length; @@ -141,7 +137,7 @@ public void render(PoseStack matrices, int i, int i1, float v) { } return stringBuilder_1.toString(); - }; + }); textFieldWidget.setText(String.valueOf(currentPage + 1)); widgets.add(btnDone = Widgets.createButton(new Rectangle(bounds.x + bounds.width - 45, bounds.y + bounds.height + 3, 40, 20), new TranslatableComponent("gui.done")) .onClick(button -> { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java index cf7f2f5b7..3e62d7f02 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java @@ -23,21 +23,48 @@ package me.shedaniel.rei.impl.client.gui.widget; +import com.google.common.base.Suppliers; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.ClientHelper; +import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.ItemCheatingMode; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; +import me.shedaniel.rei.api.client.registry.transfer.TransferHandler; +import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; +import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.util.EntryStacks; +import me.shedaniel.rei.impl.client.view.ViewsImpl; +import net.minecraft.ChatFormatting; +import net.minecraft.Util; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; +import net.minecraft.client.resources.sounds.SimpleSoundInstance; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.sounds.SoundEvents; import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.Nullable; + +import java.util.ConcurrentModificationException; +import java.util.List; +import java.util.function.Supplier; public abstract class DisplayedEntryWidget extends EntryWidget { + private long lastCheckTime = -1; + private long lastCheckedTime = -1; + private Display display; + private Supplier displayTooltipComponent; + public int backupY; protected DisplayedEntryWidget(Point point, int entrySize) { @@ -47,7 +74,7 @@ protected DisplayedEntryWidget(Point point, int entrySize) { } @Override - protected void drawHighlighted(PoseStack matrices, int mouseX, int mouseY, float delta) { + public void drawHighlighted(PoseStack matrices, int mouseX, int mouseY, float delta) { if (!getCurrentEntry().isEmpty()) super.drawHighlighted(matrices, mouseX, mouseY, delta); } @@ -82,6 +109,29 @@ protected boolean doAction(double mouseX, double mouseY, int button) { } } + if (!(Minecraft.getInstance().screen instanceof DisplayScreen) && Screen.hasControlDown()) { + try { + TransferHandler handler = getTransferHandler(true); + + if (handler != null) { + AbstractContainerScreen containerScreen = REIRuntime.getInstance().getPreviousContainerScreen(); + TransferHandler.Context context = TransferHandler.Context.create(true, Screen.hasShiftDown() || button == 1, containerScreen, display); + TransferHandler.Result transferResult = handler.handle(context); + + if (transferResult.isBlocking()) { + minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + if (transferResult.isReturningToScreen() && Minecraft.getInstance().screen != containerScreen) { + Minecraft.getInstance().setScreen(containerScreen); + REIRuntime.getInstance().getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); + } + return true; + } + } + } catch (Throwable e) { + e.printStackTrace(); + } + } + return super.doAction(mouseX, mouseY, button); } @@ -126,4 +176,88 @@ public boolean keyPressedIgnoreContains(int keyCode, int scanCode, int modifiers return super.keyPressedIgnoreContains(keyCode, scanCode, modifiers); } + + @Override + public @Nullable Tooltip getCurrentTooltip(TooltipContext context) { + Tooltip tooltip = super.getCurrentTooltip(context); + + if (tooltip != null && !(Minecraft.getInstance().screen instanceof DisplayScreen)) { + boolean exists = getTransferHandler(false) != null; + + if (!exists) { + if (lastCheckedTime == -1 || Util.getMillis() - lastCheckedTime > 400) { + lastCheckedTime = Util.getMillis(); + } + + if (Util.getMillis() - lastCheckedTime > 200) { + lastCheckedTime = -1; + exists = getTransferHandler(true) != null; + } + } else { + lastCheckedTime = -1; + } + + if (exists) { + tooltip.add(new TranslatableComponent("text.auto_craft.move_items.tooltip").withStyle(ChatFormatting.YELLOW)); + tooltip.add((ClientTooltipComponent) displayTooltipComponent.get()); + } + } + + return tooltip; + } + + @Nullable + private TransferHandler _getTransferHandler() { + lastCheckTime = Util.getMillis(); + + if (PluginManager.areAnyReloading()) { + return null; + } + + try { + for (List displays : DisplayRegistry.getInstance().getAll().values()) { + for (Display display : displays) { + if (ViewsImpl.isRecipesFor(getEntries(), display)) { + AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, null); + if (result.successful) { + this.display = display; + this.displayTooltipComponent = Suppliers.memoize(() -> new DisplayTooltipComponent(display)); + return result.successfulHandler; + } + } + } + } + } catch (ConcurrentModificationException ignored) { + display = null; + displayTooltipComponent = null; + lastCheckTime = -1; + } + + return null; + } + + private TransferHandler getTransferHandler(boolean query) { + if (PluginManager.areAnyReloading()) { + return null; + } + + if (display != null) { + if (ViewsImpl.isRecipesFor(getEntries(), display)) { + AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, null); + if (result.successful) { + return result.successfulHandler; + } + } + + display = null; + displayTooltipComponent = null; + lastCheckTime = -1; + } + + if (lastCheckTime != -1 && Util.getMillis() - lastCheckTime < 2000) { + return null; + } + + return query ? _getTransferHandler() : null; + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java index 0639bdcca..7b049fdbc 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java @@ -23,7 +23,6 @@ package me.shedaniel.rei.impl.client.gui.widget; -import com.google.common.base.Suppliers; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; @@ -33,7 +32,6 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; -import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.drag.DraggableStack; @@ -44,45 +42,29 @@ import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; -import me.shedaniel.rei.api.client.overlay.ScreenOverlay; -import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; -import me.shedaniel.rei.api.client.registry.transfer.TransferHandler; import me.shedaniel.rei.api.client.search.method.InputMethod; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; -import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.util.FormattingUtils; -import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.InternalTextures; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; -import me.shedaniel.rei.impl.client.view.ViewsImpl; import net.minecraft.ChatFormatting; import net.minecraft.CrashReport; import net.minecraft.CrashReportCategory; -import net.minecraft.Util; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.resources.language.I18n; -import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.TextComponent; -import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; -import net.minecraft.sounds.SoundEvents; import net.minecraft.util.Mth; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.function.Supplier; import java.util.function.UnaryOperator; import java.util.stream.Collectors; import java.util.stream.Stream; +@SuppressWarnings("UnstableApiUsage") public class EntryWidget extends Slot implements DraggableStackProviderWidget { @ApiStatus.Internal public static long stackDisplayOffset = 0; @@ -102,11 +84,6 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { public ResourceLocation tagMatch; public boolean removeTagMatch = true; - private long lastCheckTime = -1; - private long lastCheckedTime = -1; - private Display display; - private Supplier displayTooltipComponent; - public EntryWidget(Point point) { this(new Rectangle(point.x - 1, point.y - 1, 18, 18)); } @@ -116,22 +93,6 @@ public EntryWidget(Rectangle bounds) { this.entryStacks = Collections.emptyList(); } - @Override - public EntryWidget unmarkInputOrOutput() { - noticeMark = 0; - return this; - } - - public EntryWidget markIsInput() { - noticeMark = 1; - return this; - } - - public EntryWidget markIsOutput() { - noticeMark = 2; - return this; - } - @Override public byte getNoticeMark() { return noticeMark; @@ -144,7 +105,8 @@ public void setNoticeMark(byte noticeMark) { @Override public void setInteractable(boolean interactable) { - interactable(interactable); + this.interactable = interactable; + this.interactableFavorites = interactableFavorites && interactable; } @Override @@ -154,7 +116,7 @@ public boolean isInteractable() { @Override public void setInteractableFavorites(boolean interactableFavorites) { - interactableFavorites(interactableFavorites); + this.interactableFavorites = interactableFavorites && interactable; } @Override @@ -162,36 +124,6 @@ public boolean isInteractableFavorites() { return interactableFavorites; } - public EntryWidget disableInteractions() { - return interactable(false); - } - - @Override - public EntryWidget interactable(boolean b) { - interactable = b; - interactableFavorites = interactableFavorites && interactable; - return this; - } - - public EntryWidget disableFavoritesInteractions() { - return interactableFavorites(false); - } - - @Override - public EntryWidget interactableFavorites(boolean b) { - interactableFavorites = b && interactable; - return this; - } - - public EntryWidget noHighlight() { - return highlight(false); - } - - public EntryWidget highlight(boolean b) { - highlight = b; - return this; - } - @Override public boolean isHighlightEnabled() { return highlight; @@ -199,21 +131,12 @@ public boolean isHighlightEnabled() { @Override public void setHighlightEnabled(boolean highlights) { - highlight(highlights); - } - - public EntryWidget noTooltips() { - return tooltips(false); - } - - public EntryWidget tooltips(boolean b) { - tooltips = b; - return this; + this.highlight = highlights; } @Override public void setTooltipsEnabled(boolean tooltipsEnabled) { - tooltips(tooltipsEnabled); + this.tooltips = tooltipsEnabled; } @Override @@ -221,18 +144,9 @@ public boolean isTooltipsEnabled() { return tooltips; } - public EntryWidget noBackground() { - return background(false); - } - - public EntryWidget background(boolean b) { - background = b; - return this; - } - @Override public void setBackgroundEnabled(boolean backgroundEnabled) { - background(backgroundEnabled); + this.background = backgroundEnabled; } @Override @@ -240,14 +154,10 @@ public boolean isBackgroundEnabled() { return background; } - public EntryWidget clearStacks() { - entryStacks = Collections.emptyList(); - return this; - } - @Override public Slot clearEntries() { - return clearStacks(); + this.entryStacks = Collections.emptyList(); + return this; } @Override @@ -306,89 +216,27 @@ public Rectangle getInnerBounds() { return new Rectangle(bounds.x + 1, bounds.y + 1, bounds.width - 2, bounds.height - 2); } - @Nullable - private TransferHandler _getTransferHandler() { - lastCheckTime = Util.getMillis(); - - if (PluginManager.areAnyReloading()) { - return null; - } - - try { - for (List displays : DisplayRegistry.getInstance().getAll().values()) { - for (Display display : displays) { - if (ViewsImpl.isRecipesFor(getEntries(), display)) { - AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, null); - if (result.successful) { - this.display = display; - this.displayTooltipComponent = Suppliers.memoize(() -> new DisplayTooltipComponent(display)); - return result.successfulHandler; - } - } - } - } - } catch (ConcurrentModificationException ignored) { - display = null; - displayTooltipComponent = null; - lastCheckTime = -1; - } - - return null; - } - - private TransferHandler getTransferHandler(boolean query) { - if (PluginManager.areAnyReloading()) { - return null; - } - - if (display != null) { - if (ViewsImpl.isRecipesFor(getEntries(), display)) { - AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, null); - if (result.successful) { - return result.successfulHandler; - } - } - - display = null; - displayTooltipComponent = null; - lastCheckTime = -1; - } - - if (lastCheckTime != -1 && Util.getMillis() - lastCheckTime < 2000) { - return null; - } - - return query ? _getTransferHandler() : null; - } - @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { drawBackground(matrices, mouseX, mouseY, delta); drawCurrentEntry(matrices, mouseX, mouseY, delta); boolean highlighted = containsMouse(mouseX, mouseY); - if (hasTooltips() && highlighted) { + if (isTooltipsEnabled() && highlighted) { queueTooltip(matrices, mouseX, mouseY, delta); } - if (hasHighlight() && highlighted) { + if (isHighlightEnabled() && highlighted) { drawHighlighted(matrices, mouseX, mouseY, delta); } drawExtra(matrices, mouseX, mouseY, delta); } - public final boolean hasTooltips() { - return isTooltipsEnabled(); - } - - public final boolean hasHighlight() { - return isHighlightEnabled(); - } - private final NumberAnimator darkBackgroundAlpha = ValueAnimator.ofFloat() .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) .asFloat(); - protected void drawBackground(PoseStack matrices, int mouseX, int mouseY, float delta) { + @Override + public void drawBackground(PoseStack matrices, int mouseX, int mouseY, float delta) { if (background) { darkBackgroundAlpha.update(delta); RenderSystem.enableBlend(); @@ -413,40 +261,19 @@ protected void drawCurrentEntry(PoseStack matrices, int mouseX, int mouseY, floa } protected void queueTooltip(PoseStack matrices, int mouseX, int mouseY, float delta) { - Tooltip tooltip = getCurrentTooltip(TooltipContext.ofMouse().getPoint()); + Tooltip tooltip = getCurrentTooltip(TooltipContext.ofMouse()); if (tooltip != null) { tooltip.queue(); } } - protected void drawExtra(PoseStack matrices, int mouseX, int mouseY, float delta) {} + @Override + public void drawExtra(PoseStack matrices, int mouseX, int mouseY, float delta) {} @Override @Nullable - public Tooltip getCurrentTooltip(Point point) { - Tooltip tooltip = getCurrentEntry().getTooltip(TooltipContext.of(point)); - - if (tooltip != null && !(Minecraft.getInstance().screen instanceof DisplayScreen)) { - boolean exists = getTransferHandler(false) != null; - - if (!exists) { - if (lastCheckedTime == -1 || Util.getMillis() - lastCheckedTime > 400) { - lastCheckedTime = Util.getMillis(); - } - - if (Util.getMillis() - lastCheckedTime > 200) { - lastCheckedTime = -1; - exists = getTransferHandler(true) != null; - } - } else { - lastCheckedTime = -1; - } - - if (exists) { - tooltip.add(new TranslatableComponent("text.auto_craft.move_items.tooltip").withStyle(ChatFormatting.YELLOW)); - tooltip.add((ClientTooltipComponent) displayTooltipComponent.get()); - } - } + public Tooltip getCurrentTooltip(TooltipContext context) { + Tooltip tooltip = getCurrentEntry().getTooltip(context); if (tooltip != null) { if (interactableFavorites && ConfigObject.getInstance().doDisplayFavoritesTooltip() && !ConfigObject.getInstance().getFavoriteKeyCode().isUnknown()) { @@ -486,7 +313,8 @@ public Tooltip getCurrentTooltip(Point point) { .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) .asFloat(); - protected void drawHighlighted(PoseStack matrices, int mouseX, int mouseY, float delta) { + @Override + public void drawHighlighted(PoseStack matrices, int mouseX, int mouseY, float delta) { darkHighlightedAlpha.update(delta); RenderSystem.disableDepthTest(); RenderSystem.colorMask(true, true, true, false); @@ -504,11 +332,12 @@ public List children() { } protected boolean wasClicked() { - boolean b = this.wasClicked; + boolean wasClicked = this.wasClicked; this.wasClicked = false; - return b; + return wasClicked; } + @Override public void tooltipProcessor(UnaryOperator operator) { if (tooltipProcessors == null) { tooltipProcessors = Collections.singleton(operator); @@ -529,7 +358,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { @Override public boolean mouseScrolled(double mouseX, double mouseY, double amount) { - if (REIRuntimeImpl.isWithinRecipeViewingScreen && entryStacks.size() > 1 && containsMouse(mouseX, mouseY)) { + if (minecraft.screen instanceof DisplayScreen && entryStacks.size() > 1 && containsMouse(mouseX, mouseY)) { if (amount < 0) { EntryWidget.stackDisplayOffset = ((System.currentTimeMillis() + stackDisplayOffset) / 1000 - 1) * 1000; return true; @@ -564,38 +393,11 @@ protected boolean doAction(double mouseX, double mouseY, int button) { } else { ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); } - ConfigManager.getInstance().saveConfig(); - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - if (favoritesListWidget != null) - favoritesListWidget.updateSearch(); return true; } } } - if (!(Minecraft.getInstance().screen instanceof DisplayScreen) && Screen.hasControlDown()) { - try { - TransferHandler handler = getTransferHandler(true); - - if (handler != null) { - AbstractContainerScreen containerScreen = REIRuntime.getInstance().getPreviousContainerScreen(); - TransferHandler.Context context = TransferHandler.Context.create(true, Screen.hasShiftDown() || button == 1, containerScreen, display); - TransferHandler.Result transferResult = handler.handle(context); - - if (transferResult.isBlocking()) { - minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); - if (transferResult.isReturningToScreen() && Minecraft.getInstance().screen != containerScreen) { - Minecraft.getInstance().setScreen(containerScreen); - REIRuntime.getInstance().getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); - } - return true; - } - } - } catch (Throwable e) { - e.printStackTrace(); - } - } - if ((ConfigObject.getInstance().getRecipeKeybind().getType() != InputConstants.Type.MOUSE && button == 0) || ConfigObject.getInstance().getRecipeKeybind().matchesMouse(button)) return ViewSearchBuilder.builder().addRecipesFor(getCurrentEntry()).open(); else if ((ConfigObject.getInstance().getUsageKeybind().getType() != InputConstants.Type.MOUSE && button == 1) || ConfigObject.getInstance().getUsageKeybind().matchesMouse(button)) @@ -646,10 +448,6 @@ public boolean keyPressedIgnoreContains(int keyCode, int scanCode, int modifiers } else { ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); } - ConfigManager.getInstance().saveConfig(); - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - if (favoritesListWidget != null) - favoritesListWidget.updateSearch(); return true; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java index d1158aa9f..3a0956bbe 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java @@ -23,257 +23,25 @@ package me.shedaniel.rei.impl.client.gui.widget; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Matrix4f; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.math.impl.PointHelper; -import me.shedaniel.rei.api.client.config.ConfigObject; -import me.shedaniel.rei.api.client.gui.DrawableConsumer; -import me.shedaniel.rei.api.client.gui.Renderer; -import me.shedaniel.rei.api.client.gui.widgets.*; -import me.shedaniel.rei.api.client.registry.display.DisplayCategory; -import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.impl.ClientInternals; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.toast.CopyRecipeIdentifierToast; -import me.shedaniel.rei.impl.client.gui.widget.basewidgets.*; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; +import me.shedaniel.rei.api.client.gui.widgets.DelegateWidget; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.resources.language.I18n; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.FormattedText; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.ApiStatus; -import java.util.Collection; -import java.util.List; -import java.util.function.Supplier; - @ApiStatus.Internal @Environment(EnvType.CLIENT) public final class InternalWidgets { private InternalWidgets() {} - public static Widget createAutoCraftingButtonWidget(Rectangle displayBounds, Rectangle rectangle, Component text, Supplier displaySupplier, Supplier> idsSupplier, List setupDisplay, DisplayCategory category) { - Button autoCraftingButton = Widgets.createButton(rectangle, text) - .focusable(false) - .onClick(button -> { - AutoCraftingEvaluator.evaluateAutoCrafting(true, Screen.hasShiftDown(), displaySupplier.get(), idsSupplier); - }); - return new DelegateWidget(autoCraftingButton) { - @Override - public void render(PoseStack poses, int mouseX, int mouseY, float delta) { - AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, displaySupplier.get(), idsSupplier); - - autoCraftingButton.setEnabled(result.successful); - autoCraftingButton.setTint(result.tint); - - if (result.hasApplicable) { - autoCraftingButton.setText(text); - } else { - autoCraftingButton.setText(new TextComponent("!")); - } - - if (result.hasApplicable && (containsMouse(mouseX, mouseY) || autoCraftingButton.isFocused()) && result.renderer != null) { - result.renderer.render(poses, mouseX, mouseY, delta, setupDisplay, displayBounds, displaySupplier.get()); - } - - this.widget.render(poses, mouseX, mouseY, delta); - - if (!autoCraftingButton.isFocused() && containsMouse(mouseX, mouseY)) { - tryTooltip(result, new Point(mouseX, mouseY)); - } else if (autoCraftingButton.isFocused()) { - Rectangle bounds = autoCraftingButton.getBounds(); - tryTooltip(result, new Point(bounds.x + bounds.width / 2, bounds.y + bounds.height / 2)); - } - } - - private void tryTooltip(AutoCraftingEvaluator.AutoCraftingResult result, Point point) { - if (result.tooltipRenderer != null) { - result.tooltipRenderer.accept(point, Tooltip::queue); - } - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (displaySupplier.get().getDisplayLocation().isPresent() && ConfigObject.getInstance().getCopyRecipeIdentifierKeybind().matchesKey(keyCode, scanCode) && containsMouse(PointHelper.ofMouse())) { - minecraft.keyboardHandler.setClipboard(displaySupplier.get().getDisplayLocation().get().toString()); - if (ConfigObject.getInstance().isToastDisplayedOnCopyIdentifier()) { - CopyRecipeIdentifierToast.addToast(I18n.get("msg.rei.copied_recipe_id"), I18n.get("msg.rei.recipe_id_details", displaySupplier.get().getDisplayLocation().get().toString())); - } - return true; - } else if (ConfigObject.getInstance().isFavoritesEnabled() && containsMouse(PointHelper.ofMouse())) { - if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - - if (favoritesListWidget != null) { - favoritesListWidget.displayHistory.addDisplay(displayBounds.clone(), displaySupplier.get()); - return true; - } - } - } - - return super.keyPressed(keyCode, scanCode, modifiers); - } - - @Override - public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (displaySupplier.get().getDisplayLocation().isPresent() && ConfigObject.getInstance().getCopyRecipeIdentifierKeybind().matchesMouse(button) && containsMouse(PointHelper.ofMouse())) { - minecraft.keyboardHandler.setClipboard(displaySupplier.get().getDisplayLocation().get().toString()); - if (ConfigObject.getInstance().isToastDisplayedOnCopyIdentifier()) { - CopyRecipeIdentifierToast.addToast(I18n.get("msg.rei.copied_recipe_id"), I18n.get("msg.rei.recipe_id_details", displaySupplier.get().getDisplayLocation().get().toString())); - } - return true; - } else if (ConfigObject.getInstance().isFavoritesEnabled() && containsMouse(PointHelper.ofMouse())) { - if (ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - - if (favoritesListWidget != null) { - favoritesListWidget.displayHistory.addDisplay(displayBounds.clone(), displaySupplier.get()); - return true; - } - } - } - - return super.mouseClicked(mouseX, mouseY, button); - } - }; - } - public static WidgetWithBounds wrapLateRenderable(Widget widget) { return new LateRenderableWidget(widget); } - public static Widget concatWidgets(List widgets) { - return new MergedWidget(widgets); - } - private static class LateRenderableWidget extends DelegateWidget implements LateRenderable { private LateRenderableWidget(Widget widget) { super(widget); } } - - public static class WidgetsProvider implements ClientInternals.WidgetsProvider { - @Override - public boolean isRenderingPanel(Panel panel) { - return PanelWidget.isRendering(panel); - } - - @Override - public Widget wrapVanillaWidget(GuiEventListener element) { - if (element instanceof Widget) return (Widget) element; - return new VanillaWrappedWidget(element); - } - - @Override - public WidgetWithBounds wrapRenderer(Supplier bounds, Renderer renderer) { - return new RendererWrappedWidget(renderer, bounds); - } - - @Override - public WidgetWithBounds withTranslate(WidgetWithBounds widget, Supplier translate) { - return new DelegateWidgetWithTranslate(widget, translate); - } - - @Override - public Widget createDrawableWidget(DrawableConsumer drawable) { - return new DrawableWidget(drawable); - } - - @Override - public Slot createSlot(Point point) { - return new EntryWidget(point); - } - - @Override - public Slot createSlot(Rectangle bounds) { - return new EntryWidget(bounds); - } - - @Override - public Button createButton(Rectangle bounds, Component text) { - return new ButtonWidget(bounds, text); - } - - @Override - public Panel createPanelWidget(Rectangle bounds) { - return new PanelWidget(bounds); - } - - @Override - public Label createLabel(Point point, FormattedText text) { - return new LabelWidget(point, text); - } - - @Override - public Arrow createArrow(Rectangle rectangle) { - return new ArrowWidget(rectangle); - } - - @Override - public BurningFire createBurningFire(Rectangle rectangle) { - return new BurningFireWidget(rectangle); - } - - @Override - public DrawableConsumer createTexturedConsumer(ResourceLocation texture, int x, int y, int width, int height, float u, float v, int uWidth, int vHeight, int textureWidth, int textureHeight) { - return new TexturedDrawableConsumer(texture, x, y, width, height, u, v, uWidth, vHeight, textureWidth, textureHeight); - } - - @Override - public DrawableConsumer createFillRectangleConsumer(Rectangle rectangle, int color) { - return new FillRectangleDrawableConsumer(rectangle, color); - } - - @Override - public Widget createShapelessIcon(Point point) { - int magnification; - double scale = Minecraft.getInstance().getWindow().getGuiScale(); - if (scale >= 1 && scale <= 4 && scale == Math.floor(scale)) { - magnification = (int) scale; - } else if (scale > 4 && scale == Math.floor(scale)) { - magnification = 1; - for (int i = 4; i >= 1; i--) { - if (scale % i == 0) { - magnification = i; - break; - } - } - } else { - magnification = 4; - } - Rectangle bounds = new Rectangle(point.getX() - 9, point.getY() + 1, 8, 8); - Widget widget = Widgets.createTexturedWidget(new ResourceLocation("roughlyenoughitems:textures/gui/shapeless_icon_" + magnification + "x.png"), bounds.getX(), bounds.getY(), 0, 0, bounds.getWidth(), bounds.getHeight(), 1, 1, 1, 1); - return Widgets.withTooltip(Widgets.withBounds(widget, bounds), - new TranslatableComponent("text.rei.shapeless")); - } - - @Override - public Widget concatWidgets(List widgets) { - return InternalWidgets.concatWidgets(widgets); - } - - @Override - public WidgetWithBounds noOp() { - return NoOpWidget.INSTANCE; - } - - @Override - public WidgetWithBounds wrapOverflow(Rectangle bounds, WidgetWithBounds widget) { - return new OverflowWidget(bounds, new PaddedCenterWidget(bounds, widget)); - } - - @Override - public WidgetWithBounds wrapPadded(int padLeft, int padRight, int padTop, int padBottom, WidgetWithBounds widget) { - return new PaddedWidget(padLeft, padRight, padTop, padBottom, widget); - } - } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/QueuedTooltip.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TooltipImpl.java similarity index 93% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/QueuedTooltip.java rename to runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TooltipImpl.java index 59fe6f55a..0cf49f746 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/QueuedTooltip.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/TooltipImpl.java @@ -45,12 +45,12 @@ */ @ApiStatus.Internal @Environment(EnvType.CLIENT) -public class QueuedTooltip implements Tooltip { +public class TooltipImpl implements Tooltip { private Point location; private List entries; private EntryStack stack = EntryStack.empty(); - private QueuedTooltip(Point location, Collection entries) { + private TooltipImpl(Point location, Collection entries) { this.location = location; if (this.location == null) { this.location = PointHelper.ofMouse(); @@ -58,8 +58,8 @@ private QueuedTooltip(Point location, Collection entrie this.entries = (List) Lists.newArrayList(entries); } - public static QueuedTooltip impl(Point location, Collection text) { - return new QueuedTooltip(location, text); + public static TooltipImpl impl(Point location, Collection text) { + return new TooltipImpl(location, text); } @Override @@ -107,7 +107,7 @@ public void queue() { @Override public Tooltip copy() { - QueuedTooltip tooltip = new QueuedTooltip(location.clone(), entries); + TooltipImpl tooltip = new TooltipImpl(location.clone(), entries); tooltip.withContextStack(getContextStack()); return tooltip; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java index 62dc6e6d2..b1f6c5dcf 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java @@ -58,7 +58,7 @@ public EntryListStackEntry(CollapsingEntryListWidget parent, int x, int y, int e super(new Point(x, y), entrySize); this.parent = parent; if (zoomed) { - noHighlight(); + disableHighlight(); size = ValueAnimator.ofDouble(1f) .withConvention(() -> { double mouseX = PointHelper.getMouseFloatingX(); @@ -72,7 +72,7 @@ public EntryListStackEntry(CollapsingEntryListWidget parent, int x, int y, int e } @Override - protected void drawExtra(PoseStack matrices, int mouseX, int mouseY, float delta) { + public void drawExtra(PoseStack matrices, int mouseX, int mouseY, float delta) { if (size != null) { size.update(delta); int centerX = getBounds().getCenterX(); @@ -100,7 +100,7 @@ public boolean containsMouse(double mouseX, double mouseY) { } @Override - protected void drawBackground(PoseStack matrices, int mouseX, int mouseY, float delta) { + public void drawBackground(PoseStack matrices, int mouseX, int mouseY, float delta) { Rectangle bounds = getBounds(); if (collapsedStack != null) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java index a43dc1265..79072c5da 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java @@ -31,6 +31,7 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; +import me.shedaniel.rei.api.client.gui.widgets.BatchedSlots; import me.shedaniel.rei.api.client.gui.widgets.Button; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; @@ -41,7 +42,6 @@ import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.changelog.ChangelogLoader; -import me.shedaniel.rei.impl.client.gui.widget.BatchedEntryRendererManager; import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; import me.shedaniel.rei.impl.client.gui.widget.DefaultDisplayChoosePageWidget; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; @@ -95,20 +95,22 @@ protected void renderEntries(boolean fastEntryRendering, PoseStack matrices, int } } - BatchedEntryRendererManager manager = new BatchedEntryRendererManager(); - if (manager.isFastEntryRendering()) { + BatchedSlots slots = Widgets.createBatchedSlots(); + if (slots.isBatched()) { for (EntryListStackEntry entry : entries) { CollapsedStack collapsedStack = entry.getCollapsedStack(); if (collapsedStack != null && !collapsedStack.isExpanded()) { - manager.addSlow(entry); + slots.addUnbatched(entry); } else { - manager.add(entry); + slots.add(entry); } } } else { - manager.addAllSlow(entries); + slots.addAllUnbatched(entries); } - manager.render(debugger.debugTime, debugger.size, debugger.time, matrices, mouseX, mouseY, delta); + + if (debugger.debugTime) slots.addDebugger(debugger.size, debugger.time); + slots.render(matrices, mouseX, mouseY, delta); for (Widget widget : additionalWidgets) { widget.render(matrices, mouseX, mouseY, delta); @@ -130,7 +132,7 @@ protected void updateEntries(int entrySize, boolean zoomed) { int slotX = currentX * entrySize + innerBounds.x; int slotY = currentY * entrySize + innerBounds.y; if (notSteppingOnExclusionZones(slotX - 1, slotY - 1, entrySize, entrySize)) { - entries.add((EntryListStackEntry) new EntryListStackEntry(this, slotX, slotY, entrySize, zoomed).noBackground()); + entries.add((EntryListStackEntry) new EntryListStackEntry(this, slotX, slotY, entrySize, zoomed).disableBackground()); } } } @@ -142,7 +144,7 @@ protected void updateEntries(int entrySize, boolean zoomed) { /*EntryStack | List>*/ Object stack = subList.get(i); EntryListStackEntry entry = entries.get(i + Math.max(0, -page * entries.size())); - entry.clearStacks(); + entry.clearEntries(); if (stack instanceof EntryStack entryStack) { entry.entry(entryStack); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java index b8126813a..e706da671 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java @@ -32,8 +32,9 @@ import me.shedaniel.clothconfig2.api.scroll.ScrollingContainer; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.gui.widgets.BatchedSlots; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.client.gui.widget.BatchedEntryRendererManager; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import net.minecraft.client.gui.screens.Screen; import net.minecraft.util.Mth; @@ -66,7 +67,7 @@ protected void renderEntries(boolean fastEntryRendering, PoseStack matrices, int int skip = Math.max(0, Mth.floor(scrolling.scrollAmount() / (float) entrySize())); int nextIndex = skip * innerBounds.width / entrySize(); this.blockedCount = 0; - BatchedEntryRendererManager helper = new BatchedEntryRendererManager(); + BatchedSlots slots = Widgets.createBatchedSlots(); Int2ObjectMap indexedCollapsedStack = getCollapsedStackIndexed(); int i = nextIndex; @@ -80,18 +81,18 @@ protected void renderEntries(boolean fastEntryRendering, PoseStack matrices, int if (notSteppingOnExclusionZones(entryBounds.x, entryBounds.y, entryBounds.width, entryBounds.height)) { /*EntryStack | List>*/ Object stack = stacks.get(i++); - entry.clearStacks(); + entry.clearEntries(); if (stack instanceof EntryStack entryStack) { if (!entryStack.isEmpty()) { entry.entry(entryStack); - helper.add(entry); + slots.add(entry); } } else { List> ingredient = (List>) stack; if (!ingredient.isEmpty()) { entry.entries(ingredient); - helper.addSlow(entry); + slots.addUnbatched(entry); } } @@ -106,7 +107,8 @@ protected void renderEntries(boolean fastEntryRendering, PoseStack matrices, int } } - helper.render(debugger.debugTime, debugger.size, debugger.time, matrices, mouseX, mouseY, delta); + if (debugger.debugTime) slots.addDebugger(debugger.size, debugger.time); + slots.render(matrices, mouseX, mouseY, delta); scrolling.updatePosition(delta); ScissorsHandler.INSTANCE.removeLastScissor(); @@ -126,7 +128,7 @@ protected void updateEntries(int entrySize, boolean zoomed) { for (int i = 0; i < slotsToPrepare; i++) { int xPos = currentX * entrySize + innerBounds.x; int yPos = currentY * entrySize + innerBounds.y; - entries.add((EntryListStackEntry) new EntryListStackEntry(this, xPos, yPos, entrySize, zoomed).noBackground()); + entries.add((EntryListStackEntry) new EntryListStackEntry(this, xPos, yPos, entrySize, zoomed).disableBackground()); currentX++; if (currentX >= width) { currentX = 0; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java index 3076b5cb8..ec4fd710f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java @@ -232,7 +232,7 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { } ClientHelperImpl.getInstance() - .openDisplayViewingScreen(Map.of(CategoryRegistry.getInstance().get(display.getCategoryIdentifier()).getCategory(), List.of(display)), + .openView(Map.of(CategoryRegistry.getInstance().get(display.getCategoryIdentifier()).getCategory(), List.of(display)), null, List.of(), List.of()); Widgets.produceClickSound(); return true; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java index 9f68a8d72..e52f6dbb5 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java @@ -151,7 +151,7 @@ protected SectionFavoriteWidget(Point point, int entrySize, FavoriteEntry entry) super(point, entrySize); this.entry = entry; entry(ClientEntryStacks.of(entry.getRenderer(true))); - noBackground(); + disableBackground(); } public void moveTo(boolean animated, int xPos, int yPos) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java index 57c80090c..fd9a5940a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java @@ -38,12 +38,13 @@ import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.entry.region.RegionEntry; import me.shedaniel.rei.api.client.gui.drag.*; +import me.shedaniel.rei.api.client.gui.widgets.BatchedSlots; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.common.entry.EntrySerializer; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.gui.widget.BatchedEntryRendererManager; import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import net.minecraft.client.gui.screens.Screen; import net.minecraft.util.Mth; @@ -126,8 +127,9 @@ public void render(PoseStack poses, int mouseX, int mouseY, float delta) { Stream> entryStream = this.entriesList.stream() .filter(entry -> entry.getBounds().getMaxY() >= this.bounds.getY() && entry.getBounds().y <= this.bounds.getMaxY()); - new BatchedEntryRendererManager(entryStream.collect(Collectors.toList())) - .render(poses, mouseX, mouseY, delta); + BatchedSlots slots = Widgets.createBatchedSlots(); + entryStream.collect(Collectors.toCollection(() -> slots)); + slots.render(poses, mouseX, mouseY, delta); updatePosition(delta); scrolling.renderScrollBar(0, 1, REIRuntime.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java index 792982fd7..ac69d5558 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java @@ -42,7 +42,7 @@ public class RealRegionEntry> { public RealRegionEntry(EntryStacksRegionWidget region, T entry, int entrySize) { this.region = region; this.entry = entry; - this.widget = (RegionEntryWidget) new RegionEntryWidget<>(this, 0, 0, entrySize).noBackground(); + this.widget = (RegionEntryWidget) new RegionEntryWidget<>(this, 0, 0, entrySize).disableBackground(); } public void remove() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java index c4a50ffd1..62193be4c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java @@ -34,8 +34,8 @@ import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.modules.MenuAccess; -import me.shedaniel.rei.impl.client.gui.modules.MenuEntry; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; +import me.shedaniel.rei.impl.client.gui.menu.MenuEntry; import me.shedaniel.rei.impl.client.gui.widget.DisplayedEntryWidget; import net.minecraft.client.gui.components.events.GuiEventListener; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java new file mode 100644 index 000000000..0697fe71f --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java @@ -0,0 +1,153 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.widget.search; + +import it.unimi.dsi.fastutil.booleans.BooleanConsumer; +import me.shedaniel.rei.api.client.gui.widgets.TextField; +import org.jetbrains.annotations.Nullable; + +public interface DelegateTextField extends TextField { + TextField delegateTextField(); + + @Override + default void setFocusedResponder(BooleanConsumer responder) { + delegateTextField().setFocusedResponder(responder); + } + + @Override + @Nullable + default String getSuggestion() { + return delegateTextField().getSuggestion(); + } + + @Override + default void setSuggestion(@Nullable String suggestion) { + delegateTextField().setSuggestion(suggestion); + } + + @Override + default void setBorderColorProvider(BorderColorProvider borderColorProvider) { + delegateTextField().setBorderColorProvider(borderColorProvider); + } + + @Override + default void setFormatter(TextFormatter formatter) { + delegateTextField().setFormatter(formatter); + } + + @Override + default void setSuggestionRenderer(SuggestionRenderer renderer) { + delegateTextField().setSuggestionRenderer(renderer); + } + + @Override + default String getText() { + return delegateTextField().getText(); + } + + @Override + default void setText(String text) { + delegateTextField().setText(text); + } + + @Override + default String getSelectedText() { + return delegateTextField().getSelectedText(); + } + + @Override + default void addText(String text) { + delegateTextField().addText(text); + } + + @Override + default void moveCursorTo(int cursor) { + delegateTextField().moveCursorTo(cursor); + } + + @Override + default void moveCursorToStart() { + delegateTextField().moveCursorToStart(); + } + + @Override + default void moveCursorToEnd() { + delegateTextField().moveCursorToEnd(); + } + + @Override + default int getMaxLength() { + return delegateTextField().getMaxLength(); + } + + @Override + default void setMaxLength(int maxLength) { + delegateTextField().setMaxLength(maxLength); + } + + @Override + default int getCursor() { + return delegateTextField().getCursor(); + } + + @Override + default void setCursorPosition(int cursor) { + delegateTextField().setCursorPosition(cursor); + } + + @Override + default boolean hasBorder() { + return delegateTextField().hasBorder(); + } + + @Override + default void setHasBorder(boolean hasBorder) { + delegateTextField().setHasBorder(hasBorder); + } + + @Override + default void setEditableColor(int editableColor) { + delegateTextField().setEditableColor(editableColor); + } + + @Override + default void setNotEditableColor(int notEditableColor) { + delegateTextField().setNotEditableColor(notEditableColor); + } + + @Override + default boolean isFocused() { + return delegateTextField().isFocused(); + } + + @Override + default void setFocused(boolean focused) { + delegateTextField().setFocused(focused); + } + + @Override + default void tick() { + delegateTextField().tick(); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java index 2f9fe51b9..c0a128987 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java @@ -38,18 +38,16 @@ import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SyntaxHighlightingMode; -import me.shedaniel.rei.api.client.gui.widgets.Tooltip; -import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; -import me.shedaniel.rei.impl.client.gui.text.TextTransformations; -import me.shedaniel.rei.impl.client.gui.widget.basewidgets.TextFieldWidget; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.HighlightInfo; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.PartHighlightInfo; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.QuoteHighlightInfo; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.SplitterHighlightInfo; +import me.shedaniel.rei.impl.client.util.TextTransformations; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; @@ -71,13 +69,14 @@ @SuppressWarnings("UnstableApiUsage") @ApiStatus.Internal -public class OverlaySearchField extends TextFieldWidget implements TextFieldWidget.TextFormatter { +public class OverlaySearchField extends DelegateWidget implements DelegateTextField, TextField.TextFormatter, TextField.SuggestionRenderer, TextField.BorderColorProvider { public static boolean isHighlighting = false; private static final Style SPLITTER_STYLE = Style.EMPTY.withColor(ChatFormatting.GRAY); private static final Style QUOTES_STYLE = Style.EMPTY.withColor(ChatFormatting.GOLD); private static final Style ERROR_STYLE = Style.EMPTY.withColor(TextColor.fromRgb(0xff5555)); + private final TextField textField; private boolean previouslyClicking = false; - private final OverlaySearchFieldSyntaxHighlighter highlighter = new OverlaySearchFieldSyntaxHighlighter(getText()); + private final OverlaySearchFieldSyntaxHighlighter highlighter; public long keybindFocusTime = -1; public int keybindFocusKey = -1; public boolean isMain = true; @@ -86,20 +85,35 @@ public class OverlaySearchField extends TextFieldWidget implements TextFieldWidg private final NumberAnimator progress = ValueAnimator.ofDouble(); public OverlaySearchField(int x, int y, int width, int height) { - super(x, y, width, height); - setMaxLength(10000); - setFormatter(this); - super.setResponder(highlighter); + super(Widgets.noOp()); + this.textField = Widgets.createTextField(new Rectangle(x, y, width, height)); + this.textField.setMaxLength(10000); + this.textField.setFormatter(this); + this.textField.setSuggestionRenderer(this); + this.textField.setFocusedResponder(this::focused); + this.textField.setBorderColorProvider(this); + this.highlighter = new OverlaySearchFieldSyntaxHighlighter(textField.getText()); + this.textField.setResponder(highlighter); } @Override - public FormattedCharSequence format(TextFieldWidget widget, String text, int index) { + protected Widget delegate() { + return this.textField.asWidget(); + } + + @Override + public TextField delegateTextField() { + return this.textField; + } + + @Override + public FormattedCharSequence format(String text, int index) { boolean isPlain = ConfigObject.getInstance().getSyntaxHighlightingMode() == SyntaxHighlightingMode.PLAIN || ConfigObject.getInstance().getSyntaxHighlightingMode() == SyntaxHighlightingMode.PLAIN_UNDERSCORED; boolean hasUnderscore = ConfigObject.getInstance().getSyntaxHighlightingMode() == SyntaxHighlightingMode.PLAIN_UNDERSCORED || ConfigObject.getInstance().getSyntaxHighlightingMode() == SyntaxHighlightingMode.COLORFUL_UNDERSCORED; return TextTransformations.forwardWithTransformation(text, (s, charIndex, c) -> { HighlightInfo arg = highlighter.highlighted[charIndex + index]; Style style = Style.EMPTY; - if (isMain && ScreenOverlayImpl.getEntryListWidget().isEmpty() && !getText().isEmpty()) { + if (isMain && ScreenOverlayImpl.getEntryListWidget().isEmpty() && !textField.getText().isEmpty()) { style = ERROR_STYLE; } if (arg instanceof PartHighlightInfo part) { @@ -117,23 +131,16 @@ public FormattedCharSequence format(TextFieldWidget widget, String text, int ind } } - if (containsMouse(PointHelper.ofMouse()) || isFocused()) { + if (containsMouse(PointHelper.ofMouse()) || textField.isFocused()) { return style; } return style.withColor(TextColor.fromRgb(Color.ofOpaque(style.getColor() == null ? -1 : style.getColor().getValue()).brighter(0.75).getColor())); }); } - @Override - public void setResponder(Consumer responder) { - super.setResponder(highlighter.andThen(responder)); - } - - @Override - public void setFocused(boolean focused) { - if (isFocused() != focused && isMain) - addToHistory(getText()); - super.setFocused(focused); + public void focused(boolean focused) { + if (textField.isFocused() != focused && isMain) + addToHistory(textField.getText()); } @ApiStatus.Internal @@ -150,7 +157,7 @@ public void laterRender(PoseStack matrices, int mouseX, int mouseY, float delta) progress.update(delta); RenderSystem.disableDepthTest(); if (isMain) drawHint(matrices, mouseX, mouseY); - setSuggestion(!isFocused() && getText().isEmpty() ? I18n.get("text.rei.search.field.suggestion") : null); + textField.setSuggestion(!textField.isFocused() && textField.getText().isEmpty() ? I18n.get("text.rei.search.field.suggestion") : null); super.render(matrices, mouseX, mouseY, delta); RenderSystem.enableDepthTest(); } @@ -255,34 +262,28 @@ private void drawHint(PoseStack poses, int mouseX, int mouseY) { } @Override - protected void renderSuggestion(PoseStack matrices, int x, int y) { + public void renderSuggestion(PoseStack matrices, int x, int y, int color) { matrices.pushPose(); matrices.translate(0, 0, 400); - int color; - if (containsMouse(PointHelper.ofMouse()) || isFocused()) { + if (containsMouse(PointHelper.ofMouse()) || textField.isFocused()) { color = 0xddeaeaea; } else { color = -6250336; } - this.font.drawShadow(matrices, this.font.plainSubstrByWidth(this.getSuggestion(), this.getWidth()), x, y, color); + this.font.drawShadow(matrices, this.font.plainSubstrByWidth(textField.getSuggestion(), textField.asWidget().getBounds().getWidth()), x, y, color); matrices.popPose(); } @Override - public void renderBorder(PoseStack matrices) { + public int getBorderColor(TextField textField) { isHighlighting = isHighlighting && ConfigObject.getInstance().isInventoryHighlightingAllowed(); - int borderColor; if (isMain && isHighlighting) { - borderColor = 0xfff2ff0c; - } else if (isMain && ScreenOverlayImpl.getEntryListWidget().isEmpty() && !getText().isEmpty()) { - borderColor = 0xffff5555; + return 0xfff2ff0c; + } else if (isMain && ScreenOverlayImpl.getEntryListWidget().isEmpty() && !textField.getText().isEmpty()) { + return 0xffff5555; } else { - super.renderBorder(matrices); - return; + return TextField.BorderColorProvider.DEFAULT.getBorderColor(textField); } - fill(matrices, this.getBounds().x - 1, this.getBounds().y - 1, this.getBounds().x + this.getBounds().width + 1, this.getBounds().y + this.getBounds().height + 1, 0xff000000); - fill(matrices, this.getBounds().x, this.getBounds().y, this.getBounds().x + this.getBounds().width, this.getBounds().y + this.getBounds().height, borderColor); - fill(matrices, this.getBounds().x + 1, this.getBounds().y + 1, this.getBounds().x + this.getBounds().width - 1, this.getBounds().y + this.getBounds().height - 1, 0xff000000); } public int getManhattanDistance(Point point1, Point point2) { @@ -294,8 +295,8 @@ public int getManhattanDistance(Point point1, Point point2) { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { boolean contains = containsMouse(mouseX, mouseY); - if (isVisible() && contains && button == 1) - setText(""); + if (contains && button == 1) + textField.setText(""); if (contains && button == 0 && isMain && ConfigObject.getInstance().isInventoryHighlightingAllowed()) if (lastClickedDetails == null) lastClickedDetails = new Tuple<>(System.currentTimeMillis(), new Point(mouseX, mouseY)); @@ -313,27 +314,27 @@ else if (getManhattanDistance(lastClickedDetails.getB(), new Point(mouseX, mouse @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (this.isVisible() && this.isFocused() && isMain) + if (textField.isFocused() && isMain) if (keyCode == 257 || keyCode == 335) { - addToHistory(getText()); + addToHistory(textField.getText()); setFocused(false); return true; } else if (keyCode == 265) { - int i = history.indexOf(getText()) - 1; - if (i < -1 && getText().isEmpty()) + int i = history.indexOf(textField.getText()) - 1; + if (i < -1 && textField.getText().isEmpty()) i = history.size() - 1; else if (i < -1) { - addToHistory(getText()); + addToHistory(textField.getText()); i = history.size() - 2; } if (i >= 0) { - setText(history.get(i)); + textField.setText(history.get(i)); return true; } } else if (keyCode == 264) { - int i = history.indexOf(getText()) + 1; + int i = history.indexOf(textField.getText()) + 1; if (i > 0) { - setText(i < history.size() ? history.get(i) : ""); + textField.setText(i < history.size() ? history.get(i) : ""); return true; } } @@ -342,7 +343,7 @@ else if (i < -1) { @Override public boolean keyReleased(int keyCode, int scanCode, int modifiers) { - if (this.isVisible() && this.isFocused() && isMain && keybindFocusKey != -1) { + if (textField.isFocused() && isMain && keybindFocusKey != -1) { keybindFocusTime = -1; keybindFocusKey = -1; return true; @@ -367,5 +368,18 @@ public boolean containsMouse(double mouseX, double mouseY) { @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { + if (!isMain) { + laterRender(matrices, mouseX, mouseY, delta); + } + } + + @Override + public void setResponder(Consumer responder) { + textField.setResponder(highlighter.andThen(responder)); + } + + @Override + public WidgetWithBounds asWidget() { + return this; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java b/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java index bae00c714..c88e96e71 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java @@ -46,15 +46,16 @@ public static void onInitialize() { if (RoughlyEnoughItemsState.getErrors().isEmpty()) { initializeEntryPoint(false, "me.shedaniel.rei.impl.common.logging.LoggerInitializer"); + initializeEntryPoint(false, "me.shedaniel.rei.impl.common.init.CoreInitialization"); initializeEntryPoint(false, "me.shedaniel.rei.RoughlyEnoughItemsCore"); } } public static void onInitializeClient() { if (RoughlyEnoughItemsState.getErrors().isEmpty()) { + initializeEntryPoint(true, "me.shedaniel.rei.impl.client.init.CoreClientInitialization"); initializeEntryPoint(true, "me.shedaniel.rei.RoughlyEnoughItemsCoreClient"); initializeEntryPoint(true, "me.shedaniel.rei.REIModMenuEntryPoint"); - initializeEntryPoint(true, "me.shedaniel.rei.impl.client.ClientHelperImpl"); initializeEntryPoint(true, "me.shedaniel.rei.impl.client.REIRuntimeImpl"); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/init/ServiceBasedPluginDetector.java b/runtime/src/main/java/me/shedaniel/rei/impl/init/ServiceBasedPluginDetector.java index 5723a56d9..787287377 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/init/ServiceBasedPluginDetector.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/init/ServiceBasedPluginDetector.java @@ -27,7 +27,7 @@ import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.plugins.REIPlugin; import me.shedaniel.rei.api.common.plugins.REIServerPlugin; -import me.shedaniel.rei.impl.Internals; +import me.shedaniel.rei.impl.common.Internals; import java.util.List; import java.util.function.Supplier; diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java index e7dc28d04..49d419973 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java @@ -34,7 +34,7 @@ import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; -import me.shedaniel.rei.impl.client.gui.modules.MenuAccess; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.client.gui.widget.CraftableFilterButtonWidget; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import net.minecraft.client.Minecraft; diff --git a/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$WidgetsProvider b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$WidgetsProvider index d285af069..014b4a2f5 100644 --- a/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$WidgetsProvider +++ b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$WidgetsProvider @@ -1 +1 @@ -me.shedaniel.rei.impl.client.gui.widget.InternalWidgets$WidgetsProvider \ No newline at end of file +me.shedaniel.rei.impl.client.gui.widget.basewidgets.WidgetsProvider \ No newline at end of file diff --git a/runtime/src/test/java/InputMethodTest.java b/runtime/src/test/java/InputMethodTest.java deleted file mode 100644 index 0b0ba1cb3..000000000 --- a/runtime/src/test/java/InputMethodTest.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 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. - */ - -import it.unimi.dsi.fastutil.ints.IntList; -import me.shedaniel.rei.impl.Internals; -import me.shedaniel.rei.impl.client.search.argument.InputMethodMatcher; -import me.shedaniel.rei.impl.client.search.method.unihan.PinyinInputMethod; -import me.shedaniel.rei.impl.client.search.method.unihan.UniHanManager; -import me.shedaniel.rei.impl.common.InternalLogger; -import org.apache.logging.log4j.Level; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; - -import java.nio.file.Path; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class InputMethodTest { - public static final InternalLogger LOGGER = new InternalLogger() { - @Override - public void throwException(Throwable throwable) { - throwable.printStackTrace(); - } - - @Override - public void log(Level level, String message) { - System.out.println("[" + level.name() + "] " + message); - } - - @Override - public void log(Level level, String message, Throwable throwable) { - System.out.println("[" + level.name() + "] " + message); - throwable.printStackTrace(); - } - }; - - @TempDir - static Path tempDir; - - static PinyinInputMethod pinyinInputMethod; - - @BeforeAll - static void setup() { - Internals.attachInstanceSupplier(LOGGER, "logger"); - - UniHanManager manager = new UniHanManager(tempDir.resolve("unihan.zip")); - pinyinInputMethod = new PinyinInputMethod(manager); - ExecutorService service = Executors.newSingleThreadExecutor(); - pinyinInputMethod.prepare(service).join(); - service.shutdown(); - } - - void testPinyin() { - assertTrue(pinyinContains("漢", "han")); - assertTrue(pinyinContains("漢語", "hanyu")); - assertTrue(pinyinContains("漢", "ha")); - assertTrue(pinyinContains("漢語", "hayu")); - assertTrue(pinyinContains("测试文本", "ceshiwenben")); - assertTrue(pinyinContains("测试文本", "ceshiwenbe")); - assertTrue(pinyinContains("测试文本", "ceshiwben")); - assertTrue(pinyinContains("测试文本", "ceshwbe")); - assertTrue(pinyinContains("测试文本", "ce4shi4wb")); - assertFalse(pinyinContains("测试文本", "ce2shi4wb")); - assertTrue(pinyinContains("合金炉", "hejinlu")); - assertTrue(pinyinContains("洗矿场", "xikuangchang")); - assertTrue(pinyinContains("洗矿场", "xikuachang")); - assertTrue(pinyinContains("流体", "liuti")); - assertTrue(pinyinContains("轰20", "hong2")); - assertTrue(pinyinContains("hong2", "hong2")); - } - - boolean pinyinContains(String input, String substr) { - return InputMethodMatcher.contains(pinyinInputMethod, IntList.of(input.codePoints().toArray()), IntList.of(substr.codePoints().toArray())); - } -} diff --git a/settings.gradle b/settings.gradle index 67ca82964..f79d9de3b 100755 --- a/settings.gradle +++ b/settings.gradle @@ -26,7 +26,16 @@ include "runtime-engine:favorites" include "runtime-engine:search" include "runtime-engine:subsets" include "runtime-engine:transfer-handlers" +include "runtime-engine:menu-info" +include "runtime-engine:plugins" +include "runtime-engine:views" include "runtime-engine:default-runtime-plugin" +include "runtime-engine:initialization" +include "runtime-frontend" +include "runtime-frontend:widgets" +include "runtime-frontend:filtering" +include "runtime-frontend:display" +include "runtime-frontend:overlay" include "runtime" include "fabric" include "forge" diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerInternal.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerInternal.java index 16863185c..7a60c7692 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerInternal.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerInternal.java @@ -25,9 +25,13 @@ import me.shedaniel.autoconfig.gui.registry.GuiRegistry; import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.Jankson; +import me.shedaniel.clothconfig2.api.AbstractConfigListEntry; import me.shedaniel.rei.api.client.config.ConfigManager; import org.jetbrains.annotations.ApiStatus; +import java.util.Collection; +import java.util.Collections; + @ApiStatus.Internal public interface ConfigManagerInternal extends ConfigManager { /** @@ -45,5 +49,9 @@ interface SystemSetup { default void setup(Jankson.Builder builder) {} default void setup(GuiRegistry registry) {} + + default Collection> collectAdvanced() { + return Collections.emptyList(); + } } } diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java index eab3a1c87..96c4fd177 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/CrashReportUtils.java @@ -24,7 +24,7 @@ package me.shedaniel.rei.impl.client.util; import me.shedaniel.rei.api.client.gui.Renderer; -import me.shedaniel.rei.impl.ClientInternals; +import me.shedaniel.rei.impl.client.ClientInternals; import net.minecraft.CrashReport; import net.minecraft.CrashReportCategory; import net.minecraft.ReportedException; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/text/TextTransformations.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/TextTransformations.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/text/TextTransformations.java rename to shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/TextTransformations.java index 245356770..44f621722 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/text/TextTransformations.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/TextTransformations.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.text; +package me.shedaniel.rei.impl.client.util; import me.shedaniel.math.Color; import net.minecraft.Util; From d3bfd79800aacfde6617d5430ead5fdda0a506fe Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 6 Aug 2022 10:37:38 +0800 Subject: [PATCH 07/20] More work okay --- .../rei/api/client/ClientHelper.java | 10 +- .../api/client/overlay/OverlayListWidget.java | 3 + .../rei/api/client/overlay/ScreenOverlay.java | 53 +++++ .../shedaniel/rei/api/client/view/Views.java | 8 + fabric/src/main/resources/fabric.mod.json | 4 +- .../rei/forge/PluginDetectorImpl.java | 4 + .../category/CategoryIdentifierImpl.java | 2 +- .../DefaultRuntimeInputMethodPlugin.java | 45 ++++ .../common/transfer/REITransferNetwork.java | 91 ++++++++ .../autocrafting/DefaultCategoryHandler.java | 4 +- .../DefaultClientTransferCategoryPlugin.java | 39 ++++ .../rei/impl/client/view/ViewsImpl.java | 12 +- .../view/craftable/CraftableFilter.java | 29 +-- .../rei/RoughlyEnoughItemsNetwork.java | 54 ++--- .../rei/impl/client/ClientHelperImpl.java | 194 +----------------- .../impl/client/ClientModNameHelperImpl.java | 69 +++++++ .../impl/client/ClientNetworkHelperImpl.java | 170 +++++++++++++++ .../rei/impl/client/REIRuntimeImpl.java | 13 +- .../impl/client/gui/ScreenOverlayImpl.java | 46 +++-- .../rei/impl/client/gui/TooltipQueue.java | 51 +++++ .../impl/client/gui/menu/MenuAccessImpl.java | 3 +- .../DefaultDisplayChoosePageWidget.java | 34 ++- .../gui/widget/DisplayedEntryWidget.java | 6 +- .../client/gui/widget/DraggableWidget.java | 13 +- .../entrylist/CollapsingEntryListWidget.java | 16 +- .../widget/entrylist/EntryListEntries.java | 48 +++++ .../gui/widget/entrylist/EntryListWidget.java | 10 +- .../gui/widget/search/DelegateTextField.java | 13 ++ .../gui/widget/search/OverlaySearchField.java | 9 +- .../runtime/DefaultClientRuntimePlugin.java | 21 -- .../impl/common/networking/NetworkModule.java | 43 ++++ 31 files changed, 752 insertions(+), 365 deletions(-) create mode 100644 runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultRuntimeInputMethodPlugin.java create mode 100644 runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/REITransferNetwork.java create mode 100644 runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultClientTransferCategoryPlugin.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/ClientModNameHelperImpl.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/ClientNetworkHelperImpl.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/TooltipQueue.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListEntries.java create mode 100644 shared-internals/src/main/java/me/shedaniel/rei/impl/common/networking/NetworkModule.java diff --git a/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java b/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java index 6b62994b1..7169e83ad 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java @@ -24,6 +24,7 @@ package me.shedaniel.rei.api.client; import me.shedaniel.rei.api.client.config.ConfigManager; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; @@ -56,7 +57,9 @@ static ClientHelper getInstance() { * * @return whether cheating is enabled */ - boolean isCheating(); + default boolean isCheating() { + return ConfigObject.getInstance().isCheating(); + } /** * Sets current cheating mode @@ -64,7 +67,10 @@ static ClientHelper getInstance() { * * @param cheating the new cheating mode */ - void setCheating(boolean cheating); + default void setCheating(boolean cheating) { + ConfigObject.getInstance().setCheating(cheating); + ConfigManager.getInstance().saveConfig(); + } /** * Tries to cheat stack using either packets or commands. diff --git a/api/src/main/java/me/shedaniel/rei/api/client/overlay/OverlayListWidget.java b/api/src/main/java/me/shedaniel/rei/api/client/overlay/OverlayListWidget.java index 57e7e8999..f72952d17 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/overlay/OverlayListWidget.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/overlay/OverlayListWidget.java @@ -55,5 +55,8 @@ public interface OverlayListWidget { */ boolean containsMouse(Point point); + /** + * Queues reload of the search result. + */ void queueReloadSearch(); } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java index 944755f61..b9758f235 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java @@ -35,19 +35,72 @@ @Environment(EnvType.CLIENT) public abstract class ScreenOverlay extends WidgetWithBounds { + /** + * Queues reload of the overlay. + */ public abstract void queueReloadOverlay(); + /** + * Queues reload of the search result. + */ public abstract void queueReloadSearch(); + /** + * Returns whether the overlay is queued to be reloaded. + * + * @return whether the overlay is queued to be reloaded + */ + public abstract boolean isOverlayReloadQueued(); + + /** + * Returns whether the search result is queued to be reloaded. + * + * @return whether the search result is queued to be reloaded + */ + public abstract boolean isSearchReloadQueued(); + + /** + * Returns the current dragging context. + * + * @return the current dragging context + */ public abstract DraggingContext getDraggingContext(); + /** + * Returns whether a specified point is within the bounds of the overlay. + * + * @param mouseX the x coordinate of the mouse + * @param mouseY the y coordinate of the mouse + * @return whether the point is within the bounds of the overlay + */ public abstract boolean isNotInExclusionZones(double mouseX, double mouseY); + /** + * Returns the entry list of the overlay. + * + * @return the entry list of the overlay + */ public abstract OverlayListWidget getEntryList(); + /** + * Returns the favorites list of the overlay. + * + * @return the favorites list of the overlay, or {@code null} if favorites are not enabled + */ public abstract Optional getFavoritesList(); + /** + * Returns the search field of the overlay. + * + * @return the search field of the overlay + */ public abstract TextField getSearchField(); + /** + * Renders a tooltip. + * + * @param matrices the matrices transform + * @param tooltip the tooltip + */ public abstract void renderTooltip(PoseStack matrices, Tooltip tooltip); } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/view/Views.java b/api/src/main/java/me/shedaniel/rei/api/client/view/Views.java index 407e4dfde..8855adcd9 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/view/Views.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/view/Views.java @@ -24,6 +24,7 @@ package me.shedaniel.rei.api.client.view; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.registry.Reloadable; @@ -31,6 +32,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; +import java.util.List; public interface Views extends Reloadable { /** @@ -45,6 +47,12 @@ static Views getInstance() { @ApiStatus.Experimental ViewSearchBuilder getContext(); + @ApiStatus.Experimental + boolean isRecipesFor(List> stacks, Display display); + + @ApiStatus.Experimental + boolean isUsagesFor(List> stacks, Display display); + /** * Returns all craftable items from materials. * diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index afaac37a6..251e4def4 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -28,7 +28,9 @@ ], "rei_client": [ "me.shedaniel.rei.plugin.client.DefaultClientPlugin", - "me.shedaniel.rei.plugin.client.runtime.DefaultClientRuntimePlugin" + "me.shedaniel.rei.plugin.client.runtime.DefaultClientRuntimePlugin", + "me.shedaniel.rei.plugin.client.runtime.DefaultRuntimeInputMethodPlugin", + "me.shedaniel.rei.plugin.autocrafting.DefaultClientTransferCategoryPlugin" ] }, "accessWidener": "roughlyenoughitems.accessWidener", diff --git a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java index ce6b594c3..7d026998d 100644 --- a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java +++ b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java @@ -34,8 +34,10 @@ import me.shedaniel.rei.jeicompat.JEIExtraClientPlugin; import me.shedaniel.rei.jeicompat.JEIExtraPlugin; import me.shedaniel.rei.jeicompat.JEIPluginDetector; +import me.shedaniel.rei.plugin.autocrafting.DefaultClientTransferCategoryPlugin; import me.shedaniel.rei.plugin.client.forge.DefaultClientPluginImpl; import me.shedaniel.rei.plugin.client.runtime.DefaultClientRuntimePlugin; +import me.shedaniel.rei.plugin.client.runtime.DefaultRuntimeInputMethodPlugin; import me.shedaniel.rei.plugin.common.forge.DefaultPluginImpl; import me.shedaniel.rei.plugin.common.runtime.DefaultRuntimePlugin; import net.minecraftforge.api.distmarker.Dist; @@ -95,6 +97,8 @@ public Supplier detectClientPlugins() { return () -> () -> { PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultClientPluginImpl())); PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultClientRuntimePlugin())); + PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultRuntimeInputMethodPlugin())); + PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultClientTransferCategoryPlugin())); PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new JEIExtraClientPlugin())); AnnotationUtils.scanAnnotation(REIPlugin.class, REIClientPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { ((PluginView) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); diff --git a/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.java b/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.java index 8fc1e0a9b..46aab7972 100644 --- a/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.java +++ b/runtime-engine/categories/src/main/java/me/shedaniel/rei/impl/common/category/CategoryIdentifierImpl.java @@ -31,7 +31,7 @@ import java.util.Objects; @ApiStatus.Internal -class CategoryIdentifierImpl implements CategoryIdentifier { +final class CategoryIdentifierImpl implements CategoryIdentifier { private final ResourceLocation location; private final int hashCode; diff --git a/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultRuntimeInputMethodPlugin.java b/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultRuntimeInputMethodPlugin.java new file mode 100644 index 000000000..f5434a0ad --- /dev/null +++ b/runtime-engine/default-runtime-plugin/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultRuntimeInputMethodPlugin.java @@ -0,0 +1,45 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.plugin.client.runtime; + +import dev.architectury.platform.Platform; +import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; +import me.shedaniel.rei.impl.client.search.method.unihan.BomopofoInputMethod; +import me.shedaniel.rei.impl.client.search.method.unihan.JyutpingInputMethod; +import me.shedaniel.rei.impl.client.search.method.unihan.PinyinInputMethod; +import me.shedaniel.rei.impl.client.search.method.unihan.UniHanManager; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public class DefaultRuntimeInputMethodPlugin implements REIClientPlugin { + @Override + public void registerInputMethods(InputMethodRegistry registry) { + UniHanManager manager = new UniHanManager(Platform.getConfigFolder().resolve("roughlyenoughitems/unihan.zip")); + registry.add(new ResourceLocation("rei:pinyin"), new PinyinInputMethod(manager)); + registry.add(new ResourceLocation("rei:jyutping"), new JyutpingInputMethod(manager)); + registry.add(new ResourceLocation("rei:bomopofo"), new BomopofoInputMethod(manager)); + } +} diff --git a/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/REITransferNetwork.java b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/REITransferNetwork.java new file mode 100644 index 000000000..357bddfa9 --- /dev/null +++ b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/REITransferNetwork.java @@ -0,0 +1,91 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.transfer; + +import dev.architectury.networking.NetworkManager; +import dev.architectury.networking.transformers.SplitPacketTransformer; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; +import me.shedaniel.rei.impl.common.networking.NetworkModule; +import net.minecraft.ChatFormatting; +import net.minecraft.Util; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.inventory.InventoryMenu; +import net.minecraft.world.inventory.RecipeBookMenu; + +import java.util.Collections; + +public class REITransferNetwork implements NetworkModule { + public static final ResourceLocation MOVE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "move_items"); + + @Override + public Object getKey() { + return NetworkModule.TRANSFER; + } + + @Override + public boolean canUse() { + return NetworkManager.canServerReceive(REITransferNetwork.MOVE_ITEMS_PACKET); + } + + @Override + public void onInitialize() { + NetworkManager.registerReceiver(NetworkManager.c2s(), MOVE_ITEMS_PACKET, Collections.singletonList(new SplitPacketTransformer()), (packetByteBuf, context) -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + CategoryIdentifier category = CategoryIdentifier.of(packetByteBuf.readResourceLocation()); + AbstractContainerMenu container = player.containerMenu; + InventoryMenu playerContainer = player.inventoryMenu; + try { + boolean shift = packetByteBuf.readBoolean(); + try { + InputSlotCrafter crafter = InputSlotCrafter.start(category, container, player, packetByteBuf.readAnySizeNbt(), shift); + } catch (InputSlotCrafter.NotEnoughMaterialsException e) { + if (!(container instanceof RecipeBookMenu)) { + return; + } + // TODO Implement Ghost Recipes + /*FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeInt(input.size()); + for (List stacks : input) { + buf.writeInt(stacks.size()); + for (ItemStack stack : stacks) { + buf.writeItem(stack); + } + } + NetworkManager.sendToPlayer(player, NOT_ENOUGH_ITEMS_PACKET, buf);*/ + } catch (IllegalStateException e) { + player.sendMessage(new TranslatableComponent(e.getMessage()).withStyle(ChatFormatting.RED), Util.NIL_UUID); + } catch (Exception e) { + player.sendMessage(new TranslatableComponent("error.rei.internal.error", e.getMessage()).withStyle(ChatFormatting.RED), Util.NIL_UUID); + e.printStackTrace(); + } + } catch (Exception e) { + e.printStackTrace(); + } + }); + } +} diff --git a/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java index 3c1f69b29..096b36879 100644 --- a/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java +++ b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java @@ -29,7 +29,6 @@ import it.unimi.dsi.fastutil.ints.IntLinkedOpenHashSet; import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntSet; -import me.shedaniel.rei.RoughlyEnoughItemsNetwork; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.registry.transfer.TransferHandler; import me.shedaniel.rei.api.common.category.CategoryIdentifier; @@ -42,6 +41,7 @@ import me.shedaniel.rei.api.common.transfer.info.MenuTransferException; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryIngredients; +import me.shedaniel.rei.impl.common.transfer.REITransferNetwork; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -112,7 +112,7 @@ public Result handle(Context context) { buf.writeBoolean(context.isStackedCrafting()); buf.writeNbt(menuInfo.save(menuInfoContext, display)); - NetworkManager.sendToServer(RoughlyEnoughItemsNetwork.MOVE_ITEMS_PACKET, buf); + NetworkManager.sendToServer(REITransferNetwork.MOVE_ITEMS_PACKET, buf); return Result.createSuccessful(); } diff --git a/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultClientTransferCategoryPlugin.java b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultClientTransferCategoryPlugin.java new file mode 100644 index 000000000..ac2f97861 --- /dev/null +++ b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultClientTransferCategoryPlugin.java @@ -0,0 +1,39 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.plugin.autocrafting; + +import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import org.jetbrains.annotations.ApiStatus; + +@Environment(EnvType.CLIENT) +@ApiStatus.Internal +public class DefaultClientTransferCategoryPlugin implements REIClientPlugin { + @Override + public void registerTransferHandlers(TransferHandlerRegistry registry) { + registry.register(new DefaultCategoryHandler()); + } +} diff --git a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java index c0e6381e9..1ba0b9e4f 100644 --- a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java +++ b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java @@ -53,9 +53,9 @@ import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryIngredients; import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.client.view.craftable.CraftableFilter; import me.shedaniel.rei.impl.client.gui.widget.AutoCraftingEvaluator; import me.shedaniel.rei.impl.client.util.CrashReportUtils; +import me.shedaniel.rei.impl.client.view.craftable.CraftableFilter; import me.shedaniel.rei.impl.common.InternalLogger; import me.shedaniel.rei.impl.display.DisplaySpec; import net.minecraft.CrashReport; @@ -87,13 +87,13 @@ public static Map, List> buildMapFor(ViewSearchB BUILDER.set(builder); try { - return _buildMapFor(builder); + return ((ViewsImpl) Views.getInstance())._buildMapFor(builder); } finally { BUILDER.remove(); } } - private static Map, List> _buildMapFor(ViewSearchBuilder builder) { + private Map, List> _buildMapFor(ViewSearchBuilder builder) { if (PluginManager.areAnyReloading()) { InternalLogger.getInstance().info("Cancelled Views buildMap since plugins have not finished reloading."); return Maps.newLinkedHashMap(); @@ -290,11 +290,13 @@ public void add(Display display) { return resultSpeced; } - public static boolean isRecipesFor(List> stacks, Display display) { + @Override + public boolean isRecipesFor(List> stacks, Display display) { return checkUsages(stacks, display, display.getOutputEntries()); } - public static boolean isUsagesFor(List> stacks, Display display) { + @Override + public boolean isUsagesFor(List> stacks, Display display) { return checkUsages(stacks, display, display.getInputEntries()); } diff --git a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/craftable/CraftableFilter.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/craftable/CraftableFilter.java index f81d0c385..f004bd0ed 100644 --- a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/craftable/CraftableFilter.java +++ b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/craftable/CraftableFilter.java @@ -26,6 +26,9 @@ import it.unimi.dsi.fastutil.longs.Long2LongMap; import it.unimi.dsi.fastutil.longs.Long2LongMaps; import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap; +import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigManager; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; @@ -36,27 +39,17 @@ import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.ApiStatus; +import java.util.Optional; + public class CraftableFilter { public static final CraftableFilter INSTANCE = new CraftableFilter(); - private boolean dirty = false; private Long2LongMap invStacks = new Long2LongOpenHashMap(); private Long2LongMap containerStacks = new Long2LongOpenHashMap(); - public void markDirty() { - dirty = true; - } - - public boolean wasDirty() { - if (dirty) { - dirty = false; - return true; - } - - return false; - } - public void tick() { - if (dirty) return; + Optional overlay = REIRuntime.getInstance().getOverlay(); + if (overlay.isEmpty() || overlay.get().isSearchReloadQueued()) return; + if (!ConfigManager.getInstance().isCraftableOnlyEnabled()) return; Long2LongMap currentStacks; try { currentStacks = getInventoryItemsTypes(); @@ -66,9 +59,9 @@ public void tick() { } if (!currentStacks.equals(this.invStacks)) { invStacks = currentStacks; - markDirty(); + overlay.ifPresent(ScreenOverlay::queueReloadSearch); + return; } - if (dirty) return; try { currentStacks = getContainerItemsTypes(); @@ -78,7 +71,7 @@ public void tick() { } if (!currentStacks.equals(this.containerStacks)) { containerStacks = currentStacks; - markDirty(); + overlay.ifPresent(ScreenOverlay::queueReloadSearch); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java index 80d868c28..037fa0fc9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java @@ -26,34 +26,39 @@ import dev.architectury.networking.NetworkManager; import dev.architectury.networking.transformers.SplitPacketTransformer; import io.netty.buffer.Unpooled; -import me.shedaniel.rei.api.common.category.CategoryIdentifier; -import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.impl.common.transfer.InputSlotCrafter; +import me.shedaniel.rei.impl.common.Internals; +import me.shedaniel.rei.impl.common.networking.NetworkModule; import net.minecraft.ChatFormatting; -import net.minecraft.Util; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.Mth; -import net.minecraft.world.Container; import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.InventoryMenu; -import net.minecraft.world.inventory.RecipeBookMenu; import net.minecraft.world.item.ItemStack; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; public class RoughlyEnoughItemsNetwork { + private static final Map MODULES = new HashMap<>(); public static final ResourceLocation DELETE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "delete_item"); public static final ResourceLocation CREATE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "create_item"); public static final ResourceLocation CREATE_ITEMS_HOTBAR_PACKET = new ResourceLocation("roughlyenoughitems", "create_item_hotbar"); public static final ResourceLocation CREATE_ITEMS_GRAB_PACKET = new ResourceLocation("roughlyenoughitems", "create_item_grab"); public static final ResourceLocation CREATE_ITEMS_MESSAGE_PACKET = new ResourceLocation("roughlyenoughitems", "ci_msg"); - public static final ResourceLocation MOVE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "move_items"); public static final ResourceLocation NOT_ENOUGH_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "og_not_enough"); + public static boolean canUse(Object key) { + return MODULES.containsKey(key) && MODULES.get(key).canUse(); + } + public static void onInitialize() { + for (NetworkModule module : Internals.resolveServices(NetworkModule.class)) { + MODULES.put(module.getKey(), module); + } + NetworkManager.registerReceiver(NetworkManager.c2s(), DELETE_ITEMS_PACKET, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { ServerPlayer player = (ServerPlayer) context.getPlayer(); if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { @@ -115,38 +120,5 @@ public static void onInitialize() { player.displayClientMessage(new TranslatableComponent("text.rei.failed_cheat_items"), false); } }); - NetworkManager.registerReceiver(NetworkManager.c2s(), MOVE_ITEMS_PACKET, Collections.singletonList(new SplitPacketTransformer()), (packetByteBuf, context) -> { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - CategoryIdentifier category = CategoryIdentifier.of(packetByteBuf.readResourceLocation()); - AbstractContainerMenu container = player.containerMenu; - InventoryMenu playerContainer = player.inventoryMenu; - try { - boolean shift = packetByteBuf.readBoolean(); - try { - InputSlotCrafter crafter = InputSlotCrafter.start(category, container, player, packetByteBuf.readAnySizeNbt(), shift); - } catch (InputSlotCrafter.NotEnoughMaterialsException e) { - if (!(container instanceof RecipeBookMenu)) { - return; - } - // TODO Implement Ghost Recipes - /*FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); - buf.writeInt(input.size()); - for (List stacks : input) { - buf.writeInt(stacks.size()); - for (ItemStack stack : stacks) { - buf.writeItem(stack); - } - } - NetworkManager.sendToPlayer(player, NOT_ENOUGH_ITEMS_PACKET, buf);*/ - } catch (IllegalStateException e) { - player.sendMessage(new TranslatableComponent(e.getMessage()).withStyle(ChatFormatting.RED), Util.NIL_UUID); - } catch (Exception e) { - player.sendMessage(new TranslatableComponent("error.rei.internal.error", e.getMessage()).withStyle(ChatFormatting.RED), Util.NIL_UUID); - e.printStackTrace(); - } - } catch (Exception e) { - e.printStackTrace(); - } - }); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java index 78128ca0a..7a537fcec 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java @@ -24,23 +24,15 @@ package me.shedaniel.rei.impl.client; import com.google.common.base.Suppliers; -import dev.architectury.networking.NetworkManager; -import dev.architectury.platform.Platform; -import io.netty.buffer.Unpooled; -import me.shedaniel.rei.RoughlyEnoughItemsNetwork; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.DisplayScreenType; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; -import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; -import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.api.common.util.FormattingUtils; import me.shedaniel.rei.impl.client.gui.screen.CompositeDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; import me.shedaniel.rei.impl.display.DisplaySpec; @@ -48,27 +40,17 @@ import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.Mth; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.time.LocalDateTime; -import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.function.Supplier; @ApiStatus.Internal @Environment(EnvType.CLIENT) -public class ClientHelperImpl implements ClientHelper { +public class ClientHelperImpl extends ClientNetworkHelperImpl implements ClientModNameHelperImpl { public final Supplier isAprilFools = Suppliers.memoize(() -> { try { LocalDateTime now = LocalDateTime.now(); @@ -77,11 +59,6 @@ public class ClientHelperImpl implements ClientHelper { } return false; }); - private final Map modNameCache = new HashMap<>() {{ - put("minecraft", "Minecraft"); - put("c", "Global"); - put("global", "Global"); - }}; /** * @return the instance of {@link ClientHelperImpl} @@ -92,165 +69,6 @@ public static ClientHelperImpl getInstance() { return (ClientHelperImpl) ClientHelper.getInstance(); } - public boolean hasPermissionToUsePackets() { - try { - Minecraft.getInstance().getConnection().getSuggestionsProvider().hasPermission(0); - return hasOperatorPermission() && canUsePackets(); - } catch (NullPointerException e) { - return true; - } - } - - public boolean hasOperatorPermission() { - try { - return Minecraft.getInstance().getConnection().getSuggestionsProvider().hasPermission(1); - } catch (NullPointerException e) { - return true; - } - } - - public boolean canUsePackets() { - return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET); - } - - public boolean canUseHotbarPackets() { - return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET); - } - - public boolean canDeleteItems() { - return hasPermissionToUsePackets() || Minecraft.getInstance().gameMode.hasInfiniteItems(); - } - - @Override - public void appendModIdToTooltips(Tooltip components, String modId) { - final String modName = ClientHelper.getInstance().getModFromModId(modId); - Iterator iterator = components.entries().iterator(); - while (iterator.hasNext()) { - Tooltip.Entry entry = iterator.next(); - if (entry.isText() && FormattingUtils.stripFormatting(entry.getAsText().getString()).equalsIgnoreCase(modName)) { - iterator.remove(); - } - } - components.add(ClientHelper.getInstance().getFormattedModFromModId(modId)); - } - - @Override - public String getModFromModId(String modId) { - if (modId == null) - return ""; - String any = modNameCache.getOrDefault(modId, null); - if (any != null) - return any; - if (Platform.isModLoaded(modId)) { - String modName = Platform.getMod(modId).getName(); - modNameCache.put(modId, modName); - return modName; - } - return modId; - } - - @Override - public boolean isCheating() { - return ConfigObject.getInstance().isCheating(); - } - - @Override - public void setCheating(boolean cheating) { - ConfigObject.getInstance().setCheating(cheating); - ConfigManager.getInstance().saveConfig(); - } - - @Override - public void sendDeletePacket() { - if (Minecraft.getInstance().screen instanceof CreativeModeInventoryScreen inventoryScreen) { - Minecraft.getInstance().player.containerMenu.setCarried(ItemStack.EMPTY); - inventoryScreen.isQuickCrafting = false; - return; - } - NetworkManager.sendToServer(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET, new FriendlyByteBuf(Unpooled.buffer())); - if (Minecraft.getInstance().screen instanceof AbstractContainerScreen containerScreen) { - containerScreen.isQuickCrafting = false; - } - } - - @Override - public boolean tryCheatingEntry(EntryStack e) { - if (e.getType() != VanillaEntryTypes.ITEM) - return false; - EntryStack entry = (EntryStack) e; - if (Minecraft.getInstance().player == null) return false; - if (Minecraft.getInstance().player.getInventory() == null) return false; - ItemStack cheatedStack = entry.getValue().copy(); - if (ConfigObject.getInstance().isGrabbingItems() && Minecraft.getInstance().screen instanceof CreativeModeInventoryScreen) { - AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; - EntryStack stack = entry.copy(); - if (!menu.getCarried().isEmpty() && EntryStacks.equalsExact(EntryStacks.of(menu.getCarried()), stack)) { - stack.getValue().setCount(Mth.clamp(stack.getValue().getCount() + menu.getCarried().getCount(), 1, stack.getValue().getMaxStackSize())); - } else if (!menu.getCarried().isEmpty()) { - return false; - } - menu.setCarried(stack.getValue().copy()); - return true; - } else if (ClientHelperImpl.getInstance().canUsePackets()) { - AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; - EntryStack stack = entry.copy(); - if (!menu.getCarried().isEmpty() && !EntryStacks.equalsExact(EntryStacks.of(menu.getCarried()), stack)) { - return false; - } - try { - NetworkManager.sendToServer(ConfigObject.getInstance().isGrabbingItems() ? RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET : RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(cheatedStack)); - return true; - } catch (Exception exception) { - return false; - } - } else { - ResourceLocation identifier = entry.getIdentifier(); - if (identifier == null) { - return false; - } - String tagMessage = cheatedStack.copy().getTag() != null && !cheatedStack.copy().getTag().isEmpty() ? cheatedStack.copy().getTag().getAsString() : ""; - String og = cheatedStack.getCount() == 1 ? ConfigObject.getInstance().getGiveCommand().replaceAll(" \\{count}", "") : ConfigObject.getInstance().getGiveCommand(); - String madeUpCommand = og.replaceAll("\\{player_name}", Minecraft.getInstance().player.getScoreboardName()).replaceAll("\\{item_name}", identifier.getPath()).replaceAll("\\{item_identifier}", identifier.toString()).replaceAll("\\{nbt}", tagMessage).replaceAll("\\{count}", String.valueOf(cheatedStack.getCount())); - if (madeUpCommand.length() > 256) { - madeUpCommand = og.replaceAll("\\{player_name}", Minecraft.getInstance().player.getScoreboardName()).replaceAll("\\{item_name}", identifier.getPath()).replaceAll("\\{item_identifier}", identifier.toString()).replaceAll("\\{nbt}", "").replaceAll("\\{count}", String.valueOf(cheatedStack.getCount())); - Minecraft.getInstance().player.displayClientMessage(new TranslatableComponent("text.rei.too_long_nbt"), false); - } - Minecraft.getInstance().player.chat(madeUpCommand); - return true; - } - } - - @Override - public boolean tryCheatingEntryTo(EntryStack e, int hotbarSlotId) { - if (e.getType() != VanillaEntryTypes.ITEM) - return false; - EntryStack entry = (EntryStack) e; - if (Minecraft.getInstance().player == null) return false; - if (Minecraft.getInstance().player.getInventory() == null) return false; - if (Minecraft.getInstance().gameMode != null && Minecraft.getInstance().screen instanceof CreativeModeInventoryScreen) { - AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; - EntryStack stack = entry.copy(); - if (menu.getCarried().isEmpty()) { - Minecraft.getInstance().player.getInventory().setItem(hotbarSlotId, stack.getValue().copy()); - Minecraft.getInstance().player.inventoryMenu.broadcastChanges(); - return true; - } - } - if (ClientHelperImpl.getInstance().canUseHotbarPackets()) { - AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; - EntryStack stack = entry.copy(); - if (!menu.getCarried().isEmpty()) { - return false; - } - try { - NetworkManager.sendToServer(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.getValue().copy()).writeVarInt(hotbarSlotId)); - return true; - } catch (Exception exception) { - return false; - } - } else return false; - } - @Override public boolean openView(ViewSearchBuilder builder) { return openView(builder.buildMapInternal(), builder.getPreferredOpenedCategory(), builder.getUsagesFor(), builder.getRecipesFor()); @@ -266,11 +84,6 @@ public boolean openView(Map, List> map, @Nullabl ConfigObject.getInstance().setRecipeScreenType(DisplayScreenType.ORIGINAL); ConfigManager.getInstance().saveConfig(); return openView(map, category, usagesFor, recipesFor); -// screen = new UncertainDisplayViewingScreen(REIRuntime.getInstance().getPreviousScreen(), DisplayScreenType.UNSET, true, original -> { -// ConfigObject.getInstance().setRecipeScreenType(original ? DisplayScreenType.ORIGINAL : DisplayScreenType.COMPOSITE); -// ConfigManager.getInstance().saveConfig(); -// openView(builder); -// }); } else { screen = new DefaultDisplayViewingScreen(map, category); } @@ -288,9 +101,4 @@ public boolean openView(Map, List> map, @Nullabl Minecraft.getInstance().setScreen(screen); return true; } - - @Override - public boolean canUseMovePackets() { - return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.MOVE_ITEMS_PACKET); - } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientModNameHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientModNameHelperImpl.java new file mode 100644 index 000000000..8fd9a9417 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientModNameHelperImpl.java @@ -0,0 +1,69 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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; + +import dev.architectury.platform.Platform; +import me.shedaniel.rei.api.client.ClientHelper; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.common.util.FormattingUtils; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public interface ClientModNameHelperImpl extends ClientHelper { + Map MOD_NAME_CACHE = new HashMap<>() {{ + put("minecraft", "Minecraft"); + put("c", "Common"); + put("global", "Global"); + }}; + + @Override + default void appendModIdToTooltips(Tooltip components, String modId) { + final String modName = ClientHelper.getInstance().getModFromModId(modId); + Iterator iterator = components.entries().iterator(); + while (iterator.hasNext()) { + Tooltip.Entry entry = iterator.next(); + if (entry.isText() && FormattingUtils.stripFormatting(entry.getAsText().getString()).equalsIgnoreCase(modName)) { + iterator.remove(); + } + } + components.add(ClientHelper.getInstance().getFormattedModFromModId(modId)); + } + + @Override + default String getModFromModId(String modId) { + if (modId == null) + return ""; + String any = MOD_NAME_CACHE.getOrDefault(modId, null); + if (any != null) + return any; + if (Platform.isModLoaded(modId)) { + String modName = Platform.getMod(modId).getName(); + MOD_NAME_CACHE.put(modId, modName); + return modName; + } + return modId; + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientNetworkHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientNetworkHelperImpl.java new file mode 100644 index 000000000..18efbbf22 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientNetworkHelperImpl.java @@ -0,0 +1,170 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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; + +import dev.architectury.networking.NetworkManager; +import io.netty.buffer.Unpooled; +import me.shedaniel.rei.RoughlyEnoughItemsNetwork; +import me.shedaniel.rei.api.client.ClientHelper; +import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; +import me.shedaniel.rei.api.common.util.EntryStacks; +import me.shedaniel.rei.impl.common.networking.NetworkModule; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; +import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; + +public abstract class ClientNetworkHelperImpl implements ClientHelper { + public boolean hasPermissionToUsePackets() { + try { + Minecraft.getInstance().getConnection().getSuggestionsProvider().hasPermission(0); + return hasOperatorPermission() && canUsePackets(); + } catch (NullPointerException e) { + return true; + } + } + + public boolean hasOperatorPermission() { + try { + return Minecraft.getInstance().getConnection().getSuggestionsProvider().hasPermission(1); + } catch (NullPointerException e) { + return true; + } + } + + public boolean canUsePackets() { + return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET); + } + + public boolean canUseHotbarPackets() { + return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET); + } + + public boolean canDeleteItems() { + return hasPermissionToUsePackets() || Minecraft.getInstance().gameMode.hasInfiniteItems(); + } + + @Override + public void sendDeletePacket() { + if (Minecraft.getInstance().screen instanceof CreativeModeInventoryScreen inventoryScreen) { + Minecraft.getInstance().player.containerMenu.setCarried(ItemStack.EMPTY); + inventoryScreen.isQuickCrafting = false; + return; + } + NetworkManager.sendToServer(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET, new FriendlyByteBuf(Unpooled.buffer())); + if (Minecraft.getInstance().screen instanceof AbstractContainerScreen containerScreen) { + containerScreen.isQuickCrafting = false; + } + } + + @Override + public boolean tryCheatingEntry(EntryStack e) { + if (e.getType() != VanillaEntryTypes.ITEM) + return false; + EntryStack entry = (EntryStack) e; + if (Minecraft.getInstance().player == null) return false; + if (Minecraft.getInstance().player.getInventory() == null) return false; + ItemStack cheatedStack = entry.getValue().copy(); + if (ConfigObject.getInstance().isGrabbingItems() && Minecraft.getInstance().screen instanceof CreativeModeInventoryScreen) { + AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; + EntryStack stack = entry.copy(); + if (!menu.getCarried().isEmpty() && EntryStacks.equalsExact(EntryStacks.of(menu.getCarried()), stack)) { + stack.getValue().setCount(Mth.clamp(stack.getValue().getCount() + menu.getCarried().getCount(), 1, stack.getValue().getMaxStackSize())); + } else if (!menu.getCarried().isEmpty()) { + return false; + } + menu.setCarried(stack.getValue().copy()); + return true; + } else if (ClientHelperImpl.getInstance().canUsePackets()) { + AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; + EntryStack stack = entry.copy(); + if (!menu.getCarried().isEmpty() && !EntryStacks.equalsExact(EntryStacks.of(menu.getCarried()), stack)) { + return false; + } + try { + NetworkManager.sendToServer(ConfigObject.getInstance().isGrabbingItems() ? RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET : RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(cheatedStack)); + return true; + } catch (Exception exception) { + return false; + } + } else { + ResourceLocation identifier = entry.getIdentifier(); + if (identifier == null) { + return false; + } + String tagMessage = cheatedStack.copy().getTag() != null && !cheatedStack.copy().getTag().isEmpty() ? cheatedStack.copy().getTag().getAsString() : ""; + String og = cheatedStack.getCount() == 1 ? ConfigObject.getInstance().getGiveCommand().replaceAll(" \\{count}", "") : ConfigObject.getInstance().getGiveCommand(); + String madeUpCommand = og.replaceAll("\\{player_name}", Minecraft.getInstance().player.getScoreboardName()).replaceAll("\\{item_name}", identifier.getPath()).replaceAll("\\{item_identifier}", identifier.toString()).replaceAll("\\{nbt}", tagMessage).replaceAll("\\{count}", String.valueOf(cheatedStack.getCount())); + if (madeUpCommand.length() > 256) { + madeUpCommand = og.replaceAll("\\{player_name}", Minecraft.getInstance().player.getScoreboardName()).replaceAll("\\{item_name}", identifier.getPath()).replaceAll("\\{item_identifier}", identifier.toString()).replaceAll("\\{nbt}", "").replaceAll("\\{count}", String.valueOf(cheatedStack.getCount())); + Minecraft.getInstance().player.displayClientMessage(new TranslatableComponent("text.rei.too_long_nbt"), false); + } + Minecraft.getInstance().player.chat(madeUpCommand); + return true; + } + } + + @Override + public boolean tryCheatingEntryTo(EntryStack e, int hotbarSlotId) { + if (e.getType() != VanillaEntryTypes.ITEM) + return false; + EntryStack entry = (EntryStack) e; + if (Minecraft.getInstance().player == null) return false; + if (Minecraft.getInstance().player.getInventory() == null) return false; + if (Minecraft.getInstance().gameMode != null && Minecraft.getInstance().screen instanceof CreativeModeInventoryScreen) { + AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; + EntryStack stack = entry.copy(); + if (menu.getCarried().isEmpty()) { + Minecraft.getInstance().player.getInventory().setItem(hotbarSlotId, stack.getValue().copy()); + Minecraft.getInstance().player.inventoryMenu.broadcastChanges(); + return true; + } + } + if (ClientHelperImpl.getInstance().canUseHotbarPackets()) { + AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; + EntryStack stack = entry.copy(); + if (!menu.getCarried().isEmpty()) { + return false; + } + try { + NetworkManager.sendToServer(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.getValue().copy()).writeVarInt(hotbarSlotId)); + return true; + } catch (Exception exception) { + return false; + } + } else return false; + } + + @Override + public boolean canUseMovePackets() { + return RoughlyEnoughItemsNetwork.canUse(NetworkModule.TRANSFER); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java index b890bc98a..5cff0c22d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java @@ -43,11 +43,12 @@ import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.registry.ReloadStage; -import me.shedaniel.rei.impl.common.Internals; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import me.shedaniel.rei.impl.client.gui.TooltipQueue; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; +import me.shedaniel.rei.impl.common.Internals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -58,7 +59,10 @@ import org.jetbrains.annotations.Nullable; import java.lang.reflect.InvocationTargetException; -import java.util.*; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Optional; import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; @@ -91,14 +95,14 @@ public List getHintProviders() { @Override public void queueTooltip(@Nullable Tooltip tooltip) { if (overlay != null && tooltip != null) { - overlay.addTooltip(tooltip); + TooltipQueue.addTooltip(tooltip); } } @Override public void clearTooltips() { if (overlay != null) { - overlay.clearTooltips(); + TooltipQueue.clearTooltips(); } } @@ -269,6 +273,7 @@ public void onInitializeClient() { }); ClientTickEvent.CLIENT_POST.register(minecraft -> { if (isOverlayVisible() && REIRuntime.getInstance().getOverlay().isPresent()) { + REIRuntime.getInstance().getSearchTextField().tick(); ScreenOverlayImpl.getInstance().tick(); } }); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java index 2b3b59a9b..3f8fb9be9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java @@ -31,7 +31,6 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.REIRuntime; -import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.config.DisplayPanelLocation; @@ -76,7 +75,6 @@ @ApiStatus.Internal public abstract class ScreenOverlayImpl extends ScreenOverlay { - private static final List TOOLTIPS = Lists.newArrayList(); private static EntryListWidget entryListWidget = null; private static FavoritesListWidget favoritesListWidget = null; private static OverlaySearchField searchField = null; @@ -84,7 +82,6 @@ public abstract class ScreenOverlayImpl extends ScreenOverlay { public boolean shouldReload = false; public boolean shouldReloadSearch = false; private Rectangle bounds; - private Window window; private Widget configButton; private CurrentDraggingStack draggingStack = new CurrentDraggingStack(); @Nullable @@ -123,7 +120,6 @@ public static ScreenOverlayImpl getInstance() { public void tick() { if (searchField != null) { - getSearchField().tick(); if (Minecraft.getInstance().player != null && !PluginManager.areAnyReloading() && Minecraft.getInstance().player.tickCount % 5 == 0) { CraftableFilter.INSTANCE.tick(); } @@ -140,6 +136,16 @@ public void queueReloadSearch() { shouldReloadSearch = true; } + @Override + public boolean isOverlayReloadQueued() { + return shouldReload; + } + + @Override + public boolean isSearchReloadQueued() { + return shouldReloadSearch || shouldReload; + } + @Override public DraggingContext getDraggingContext() { return draggingStack; @@ -156,9 +162,12 @@ public void init() { this.shouldReload = false; this.shouldReloadSearch = false; this.children().clear(); - this.window = Minecraft.getInstance().getWindow(); this.bounds = calculateOverlayBounds(); + if (choosePageWidget != null) { + this.widgets.add(choosePageWidget); + } + if (ConfigObject.getInstance().isFavoritesEnabled()) { if (favoritesListWidget == null) { favoritesListWidget = new FavoritesListWidget(); @@ -202,10 +211,12 @@ private Rectangle getTopSideSearchFieldArea(int widthRemoved) { } private Rectangle getBottomSideSearchFieldArea(int widthRemoved) { + Window window = Minecraft.getInstance().getWindow(); return new Rectangle(bounds.x + 2, window.getGuiScaledHeight() - 22, bounds.width - 6 - widthRemoved, 18); } private Rectangle getCenterSearchFieldArea(int widthRemoved) { + Window window = Minecraft.getInstance().getWindow(); Rectangle screenBounds = ScreenRegistry.getInstance().getScreenBounds(minecraft.screen); return new Rectangle(screenBounds.x, window.getGuiScaledHeight() - 22, screenBounds.width - widthRemoved, 18); } @@ -228,7 +239,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { } } } - if (shouldReloadSearch || (ConfigManager.getInstance().isCraftableOnlyEnabled() && CraftableFilter.INSTANCE.wasDirty())) { + if (shouldReloadSearch) { shouldReloadSearch = false; getEntryListWidget().updateSearch(getSearchField().getText(), true); } @@ -292,17 +303,21 @@ public void lateRender(PoseStack matrices, int mouseX, int mouseY, float delta) matrices.popPose(); if (choosePageWidget != null) { setBlitOffset(500); + Window window = Minecraft.getInstance().getWindow(); this.fillGradient(matrices, 0, 0, window.getGuiScaledWidth(), window.getGuiScaledHeight(), -1072689136, -804253680); setBlitOffset(0); choosePageWidget.render(matrices, mouseX, mouseY, delta); } } if (choosePageWidget == null) { - TOOLTIPS.stream().filter(Objects::nonNull) - .reduce((tooltip, tooltip2) -> tooltip2) - .ifPresent(tooltip -> renderTooltip(matrices, tooltip)); + Tooltip tooltip = TooltipQueue.get(); + + if (tooltip != null) { + renderTooltip(matrices, tooltip); + } } - TOOLTIPS.clear(); + + REIRuntime.getInstance().clearTooltips(); if (REIRuntime.getInstance().isOverlayVisible()) { menuAccess.afterRender(); } @@ -315,15 +330,6 @@ public void renderTooltip(PoseStack matrices, Tooltip tooltip) { protected abstract void renderTooltipInner(Screen screen, PoseStack matrices, Tooltip tooltip, int mouseX, int mouseY); - public void addTooltip(@Nullable Tooltip tooltip) { - if (tooltip != null) - TOOLTIPS.add(tooltip); - } - - public void clearTooltips() { - TOOLTIPS.clear(); - } - public void renderWidgets(PoseStack matrices, int mouseX, int mouseY, float delta) { if (!REIRuntime.getInstance().isOverlayVisible()) return; @@ -566,7 +572,7 @@ public OverlaySearchField getSearchField() { if (searchField == null) { searchField = new OverlaySearchField(0, 0, 0, 0); } - + return searchField; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/TooltipQueue.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/TooltipQueue.java new file mode 100644 index 000000000..204798203 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/TooltipQueue.java @@ -0,0 +1,51 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui; + +import com.google.common.collect.Lists; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import org.jetbrains.annotations.Nullable; + +import java.util.List; +import java.util.Objects; + +public class TooltipQueue { + private static final List TOOLTIPS = Lists.newArrayList(); + + public static void addTooltip(@Nullable Tooltip tooltip) { + if (tooltip != null) + TOOLTIPS.add(tooltip); + } + + public static void clearTooltips() { + TOOLTIPS.clear(); + } + + @Nullable + public static Tooltip get() { + return TOOLTIPS.stream().filter(Objects::nonNull) + .reduce((tooltip, tooltip2) -> tooltip2) + .orElse(null); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java index aae20757f..c51330f94 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java @@ -27,6 +27,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Point; import me.shedaniel.math.impl.PointHelper; +import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; @@ -108,7 +109,7 @@ public void lateRender(PoseStack matrices, int mouseX, int mouseY, float delta) close(); } else { if (menu.wrappedMenu.containsMouse(mouseX, mouseY)) { - ScreenOverlayImpl.getInstance().clearTooltips(); + REIRuntime.getInstance().clearTooltips(); } menu.wrappedMenu.render(matrices, mouseX, mouseY, delta); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DefaultDisplayChoosePageWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DefaultDisplayChoosePageWidget.java index 894c8825f..1815822b4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DefaultDisplayChoosePageWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DefaultDisplayChoosePageWidget.java @@ -54,18 +54,12 @@ public class DefaultDisplayChoosePageWidget extends DraggableWidget { private Button btnDone; public DefaultDisplayChoosePageWidget(IntConsumer callback, int currentPage, int maxPage) { - super(getPointFromConfig()); this.callback = callback; this.currentPage = currentPage; this.maxPage = maxPage; initWidgets(getMidPoint()); } - private static Point getPointFromConfig() { - Window window = Minecraft.getInstance().getWindow(); - return new Point(window.getGuiScaledWidth() * .5, window.getGuiScaledHeight() * .5); - } - @Override public Rectangle getBounds() { return bounds; @@ -127,16 +121,13 @@ public void render(PoseStack matrices, int i, int i1, float v) { this.widgets.add((textFieldWidget = Widgets.createTextField(new Rectangle(bounds.x + 7, bounds.y + 16, bounds.width - width - 12, 18))).asWidget()); textFieldWidget.setMaxLength(10000); textFieldWidget.setTextTransformer(s -> { - StringBuilder stringBuilder_1 = new StringBuilder(); - char[] var2 = s.toCharArray(); - int var3 = var2.length; - - for (char char_1 : var2) { - if (Character.isDigit(char_1)) - stringBuilder_1.append(char_1); + StringBuilder builder = new StringBuilder(); + for (char ch : s.toCharArray()) { + if (Character.isDigit(ch)) + builder.append(ch); } - return stringBuilder_1.toString(); + return builder.toString(); }); textFieldWidget.setText(String.valueOf(currentPage + 1)); widgets.add(btnDone = Widgets.createButton(new Rectangle(bounds.x + bounds.width - 45, bounds.y + bounds.height + 3, 40, 20), new TranslatableComponent("gui.done")) @@ -158,32 +149,32 @@ public List children() { } @Override - public void render(PoseStack matrices, int i, int i1, float v) { + public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { matrices.pushPose(); matrices.translate(0, 0, 800); for (Widget widget : widgets) { - widget.render(matrices, i, i1, v); + widget.render(matrices, mouseX, mouseY, delta); } matrices.popPose(); } @Override - public boolean charTyped(char char_1, int int_1) { + public boolean charTyped(char character, int modifiers) { for (Widget widget : widgets) - if (widget.charTyped(char_1, int_1)) + if (widget.charTyped(character, modifiers)) return true; return false; } @Override - public boolean keyPressed(int int_1, int int_2, int int_3) { - if (int_1 == 335 || int_1 == 257) { + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (keyCode == 335 || keyCode == 257) { callback.accept(Mth.clamp(getIntFromString(textFieldWidget.getText()).orElse(0) - 1, 0, maxPage - 1)); ScreenOverlayImpl.getInstance().choosePageWidget = null; return true; } for (Widget widget : widgets) - if (widget.keyPressed(int_1, int_2, int_3)) + if (widget.keyPressed(keyCode, scanCode, modifiers)) return true; return false; } @@ -199,5 +190,4 @@ public Optional getIntFromString(String s) { @Override public void onMouseReleaseMidPoint(Point midPoint) { } - } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java index 3e62d7f02..de04449c7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java @@ -36,12 +36,12 @@ import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; import me.shedaniel.rei.api.client.registry.transfer.TransferHandler; +import me.shedaniel.rei.api.client.view.Views; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.client.view.ViewsImpl; import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.client.KeyMapping; @@ -217,7 +217,7 @@ private TransferHandler _getTransferHandler() { try { for (List displays : DisplayRegistry.getInstance().getAll().values()) { for (Display display : displays) { - if (ViewsImpl.isRecipesFor(getEntries(), display)) { + if (Views.getInstance().isRecipesFor(getEntries(), display)) { AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, null); if (result.successful) { this.display = display; @@ -242,7 +242,7 @@ private TransferHandler getTransferHandler(boolean query) { } if (display != null) { - if (ViewsImpl.isRecipesFor(getEntries(), display)) { + if (Views.getInstance().isRecipesFor(getEntries(), display)) { AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, null); if (result.successful) { return result.successfulHandler; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DraggableWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DraggableWidget.java index 4d41efd35..0eafebd75 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DraggableWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DraggableWidget.java @@ -34,7 +34,6 @@ @ApiStatus.Internal public abstract class DraggableWidget extends WidgetWithBounds { - public boolean dragged = false; private Point midPoint, startPoint; private int relateX, relateY; @@ -60,9 +59,9 @@ public final Point getMidPoint() { } @Override - public boolean mouseDragged(double double_1, double double_2, int int_1, double double_3, double double_4) { + public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { Point mouse = PointHelper.ofMouse(); - if (int_1 == 0) { + if (button == 0) { if (!dragged) { if (getGrabBounds().contains(mouse)) { startPoint = new Point(midPoint.x, midPoint.y); @@ -78,7 +77,7 @@ public boolean mouseDragged(double double_1, double double_2, int int_1, double return true; } for (GuiEventListener listener : children()) - if (listener.mouseDragged(double_1, double_2, int_1, double_3, double_4)) + if (listener.mouseDragged(mouseX, mouseY, button, deltaX, deltaY)) return true; return false; } @@ -86,15 +85,15 @@ public boolean mouseDragged(double double_1, double double_2, int int_1, double public abstract Point processMidPoint(Point midPoint, Point mouse, Point startPoint, Window window, int relateX, int relateY); @Override - public boolean mouseReleased(double double_1, double double_2, int int_1) { - if (int_1 == 0) + public boolean mouseReleased(double mouseX, double mouseY, int button) { + if (button == 0) if (dragged) { dragged = false; onMouseReleaseMidPoint(getMidPoint()); return true; } for (GuiEventListener listener : children()) - if (listener.mouseReleased(double_1, double_2, int_1)) + if (listener.mouseReleased(mouseX, mouseY, button)) return true; return false; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsingEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsingEntryListWidget.java index d38372e4a..1869936d0 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsingEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsingEntryListWidget.java @@ -33,10 +33,7 @@ import java.util.Map; public abstract class CollapsingEntryListWidget extends EntryListWidget { - private List | CollapsedStack*/ Object> collapsedStacks = new ArrayList<>(); private Int2ObjectMap collapsedStackIndexed = new Int2ObjectOpenHashMap<>(); - protected int updatedCount; - protected int lastUpdatedCount; public abstract List | List>*/ Object> getStacks(); @@ -46,17 +43,6 @@ protected final Int2ObjectMap getCollapsedStackIndexed() { return collapsedStackIndexed; } - @Override - public boolean isEmpty() { - return collapsedStacks.isEmpty(); - } - - @Override - protected void setCollapsedStacks(List | CollapsedStack*/ Object> stacks) { - this.collapsedStacks = stacks; - updateStacks(); - } - @Override public void updateEntriesPosition() { if (updatedCount != lastUpdatedCount) { @@ -69,6 +55,8 @@ public void updateEntriesPosition() { private void updateStacks() { lastUpdatedCount = updatedCount; + List | CollapsedStack*/ Object> collapsedStacks = EntryListEntries.INSTANCE.getCollapsedStacks(); + List | List>*/ Object> stacks = new ArrayList<>((int) (collapsedStacks.size() * 1.5)); Map | List>*/ Object, CollapsedStack> collapsedStackMap = new Reference2ObjectOpenHashMap<>(); Int2ObjectMap collapsedStackIndexed = new Int2ObjectOpenHashMap<>(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListEntries.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListEntries.java new file mode 100644 index 000000000..095c0fbb9 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListEntries.java @@ -0,0 +1,48 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.widget.entrylist; + +import java.util.ArrayList; +import java.util.List; + +public class EntryListEntries { + public static final EntryListEntries INSTANCE = new EntryListEntries(); + private List | CollapsedStack*/ Object> collapsedStacks = new ArrayList<>(); + + public void updateSearch(String searchTerm, boolean ignoreLastSearch, EntriesCallback callback) { + EntryListSearchManager.INSTANCE.update(searchTerm, ignoreLastSearch, stacks -> { + collapsedStacks = stacks; + callback.updateStacks(); + }); + } + + public List | CollapsedStack*/ Object> getCollapsedStacks() { + return collapsedStacks; + } + + @FunctionalInterface + public interface EntriesCallback { + void updateStacks(); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java index 71f837952..075dd910f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java @@ -71,6 +71,8 @@ public abstract class EntryListWidget extends WidgetWithBounds implements Overla private static final int SIZE = 18; protected final RegionRenderingDebugger debugger = new RegionRenderingDebugger(); protected Rectangle bounds, innerBounds; + protected int updatedCount; + protected int lastUpdatedCount; public final NumberAnimator scaleIndicator = ValueAnimator.ofDouble(0.0D) .withConvention(() -> 0.0D, 8000); @@ -266,13 +268,9 @@ public void updateEntriesPosition() { protected abstract void updateEntries(int entrySize, boolean zoomed); - public abstract boolean isEmpty(); - - protected abstract void setCollapsedStacks(List | CollapsedStack*/ Object> stacks); - public void updateSearch(String searchTerm, boolean ignoreLastSearch) { - EntryListSearchManager.INSTANCE.update(searchTerm, ignoreLastSearch, stacks -> { - setCollapsedStacks(stacks); + EntryListEntries.INSTANCE.updateSearch(searchTerm, ignoreLastSearch, () -> { + updatedCount++; updateEntriesPosition(); }); debugger.debugTime = ConfigObject.getInstance().doDebugRenderTimeRequired(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java index 0697fe71f..d8b77d6f6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java @@ -27,6 +27,9 @@ import me.shedaniel.rei.api.client.gui.widgets.TextField; import org.jetbrains.annotations.Nullable; +import java.util.function.Consumer; +import java.util.function.Function; + public interface DelegateTextField extends TextField { TextField delegateTextField(); @@ -61,6 +64,16 @@ default void setSuggestionRenderer(SuggestionRenderer renderer) { delegateTextField().setSuggestionRenderer(renderer); } + @Override + default void setTextTransformer(Function textTransformer) { + delegateTextField().setTextTransformer(textTransformer); + } + + @Override + default void setResponder(Consumer responder) { + delegateTextField().setResponder(responder); + } + @Override default String getText() { return delegateTextField().getText(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java index c0a128987..919108b6f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java @@ -43,6 +43,7 @@ import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; +import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListEntries; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.HighlightInfo; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.PartHighlightInfo; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.QuoteHighlightInfo; @@ -113,7 +114,7 @@ public FormattedCharSequence format(String text, int index) { return TextTransformations.forwardWithTransformation(text, (s, charIndex, c) -> { HighlightInfo arg = highlighter.highlighted[charIndex + index]; Style style = Style.EMPTY; - if (isMain && ScreenOverlayImpl.getEntryListWidget().isEmpty() && !textField.getText().isEmpty()) { + if (isMain && EntryListEntries.INSTANCE.isEmpty() && !textField.getText().isEmpty()) { style = ERROR_STYLE; } if (arg instanceof PartHighlightInfo part) { @@ -235,7 +236,7 @@ private void drawHint(PoseStack poses, int mouseX, int mouseY) { if (new Rectangle(x + 3, y + 3 + font.lineHeight * i, lineWidth, font.lineHeight).contains(mouseX, mouseY)) { Tooltip tooltip = pair.getFirst().provideTooltip(new Point(mouseX, mouseY)); if (tooltip != null) { - ScreenOverlayImpl.getInstance().clearTooltips(); + REIRuntime.getInstance().clearTooltips(); ScreenOverlayImpl.getInstance().renderTooltip(poses, tooltip); } } @@ -279,7 +280,7 @@ public int getBorderColor(TextField textField) { isHighlighting = isHighlighting && ConfigObject.getInstance().isInventoryHighlightingAllowed(); if (isMain && isHighlighting) { return 0xfff2ff0c; - } else if (isMain && ScreenOverlayImpl.getEntryListWidget().isEmpty() && !textField.getText().isEmpty()) { + } else if (isMain && EntryListEntries.INSTANCE.isEmpty() && !textField.getText().isEmpty()) { return 0xffff5555; } else { return TextField.BorderColorProvider.DEFAULT.getBorderColor(textField); @@ -375,7 +376,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { @Override public void setResponder(Consumer responder) { - textField.setResponder(highlighter.andThen(responder)); + DelegateTextField.super.setResponder(highlighter.andThen(responder)); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java index d607dba93..ab16bef86 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java @@ -27,7 +27,6 @@ import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.serialization.DataResult; import com.mojang.serialization.Lifecycle; -import dev.architectury.platform.Platform; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; import me.shedaniel.rei.api.client.ClientHelper; @@ -46,8 +45,6 @@ import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.registry.screen.ExclusionZones; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; -import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry; -import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.EntryStacks; @@ -55,11 +52,6 @@ import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; -import me.shedaniel.rei.impl.client.search.method.unihan.BomopofoInputMethod; -import me.shedaniel.rei.impl.client.search.method.unihan.JyutpingInputMethod; -import me.shedaniel.rei.impl.client.search.method.unihan.PinyinInputMethod; -import me.shedaniel.rei.impl.client.search.method.unihan.UniHanManager; -import me.shedaniel.rei.plugin.autocrafting.DefaultCategoryHandler; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.screens.Screen; @@ -133,19 +125,6 @@ public void registerFavorites(FavoriteEntryType.Registry registry) { registry.register(EntryStackFavoriteType.INSTANCE.id, EntryStackFavoriteType.INSTANCE); } - @Override - public void registerTransferHandlers(TransferHandlerRegistry registry) { - registry.register(new DefaultCategoryHandler()); - } - - @Override - public void registerInputMethods(InputMethodRegistry registry) { - UniHanManager manager = new UniHanManager(Platform.getConfigFolder().resolve("roughlyenoughitems/unihan.zip")); - registry.add(new ResourceLocation("rei:pinyin"), new PinyinInputMethod(manager)); - registry.add(new ResourceLocation("rei:jyutping"), new JyutpingInputMethod(manager)); - registry.add(new ResourceLocation("rei:bomopofo"), new BomopofoInputMethod(manager)); - } - private enum EntryStackFavoriteType implements FavoriteEntryType { INSTANCE(FavoriteEntryType.ENTRY_STACK); diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/common/networking/NetworkModule.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/common/networking/NetworkModule.java new file mode 100644 index 000000000..72ab29c8c --- /dev/null +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/common/networking/NetworkModule.java @@ -0,0 +1,43 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.networking; + +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public interface NetworkModule { + Object DELETE = new Object(); + Object CREATE = new Object(); + Object CREATE_HOTBAR = new Object(); + Object CREATE_GRAB = new Object(); + Object CREATE_MSG = new Object(); + Object NOT_ENOUGH_ITEMS = new Object(); + Object TRANSFER = new Object(); + + Object getKey(); + + boolean canUse(); + + void onInitialize(); +} From a6900532610247cae49f1c782442d07d8f7b1d2d Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 26 Aug 2022 16:48:42 +0900 Subject: [PATCH 08/20] It compiles now --- .../api/client/gui/SimpleDisplayRenderer.java | 14 +- .../rei/api/client/gui/widgets/Slot.java | 94 +++- .../rei/api/client/gui/widgets/TextField.java | 4 + .../rei/api/client/gui/widgets/Tooltip.java | 20 +- .../client/gui/widgets/TooltipContext.java | 2 +- .../rei/api/client/gui/widgets/Widgets.java | 6 +- .../registry/display/DisplayCategoryView.java | 2 +- .../rei/impl/client/ClientInternals.java | 16 +- .../provider/AutoCraftingEvaluator.java | 103 ++++ .../DelegatingFavoriteEntryProvider.java | 3 + .../FavoritesEntriesListProvider.java | 2 + .../MissingStacksTooltipProvider.java | 2 + .../impl/client/provider/OverlayTicker.java | 36 +- .../impl/client/provider/WidgetsProvider.java | 2 + .../CategoryIdentifierConstructor.java | 2 + .../provider/DeferringEntryTypeProvider.java | 2 + .../provider/EntryIngredientProvider.java | 2 + .../common/provider/EntryStackProvider.java | 2 + .../common/provider/NbtHasherProvider.java | 2 + .../provider/PluginManagerConstructor.java | 2 + .../categories/DefaultBrewingCategory.java | 12 +- .../categories/DefaultCampfireCategory.java | 2 +- .../categories/DefaultCompostingCategory.java | 2 +- .../categories/DefaultFuelCategory.java | 2 +- .../DefaultOxidationScrapingCategory.java | 2 +- .../categories/DefaultOxidizingCategory.java | 2 +- .../categories/DefaultPathingCategory.java | 2 +- .../categories/DefaultSmithingCategory.java | 2 +- .../DefaultStoneCuttingCategory.java | 2 +- .../categories/DefaultStrippingCategory.java | 2 +- .../categories/DefaultTillingCategory.java | 2 +- .../DefaultWaxScrapingCategory.java | 2 +- .../categories/DefaultWaxingCategory.java | 2 +- .../anvil/DefaultAnvilCategory.java | 2 +- .../beacon/DefaultBeaconBaseCategory.java | 2 +- .../beacon/DefaultBeaconPaymentCategory.java | 2 +- .../cooking/DefaultCookingCategory.java | 2 +- .../crafting/DefaultCraftingCategory.java | 2 +- .../categories/tag/DefaultTagCategory.java | 2 +- .../tag/ReferenceTagNodeWidget.java | 6 +- .../categories/tag/ValueTagNodeWidget.java | 2 +- .../fabric/MixinClientPacketListener.java | 4 +- .../forge/MixinClientPacketListener.java | 4 +- .../impl/client/config/ConfigObjectImpl.java | 1 + .../config/entries/ConfigAddonsEntry.java | 6 +- .../client/config/entries/TitleTextEntry.java | 2 +- .../UncertainDisplayViewingScreen.java | 8 +- .../gui/credits/CreditsEntryListWidget.java | 16 +- .../client/gui/credits/CreditsScreen.java | 2 +- .../config/entries/FilteringScreen.java | 6 +- .../rules/SearchFilteringRuleType.java | 2 +- .../client/init/CoreClientInitialization.java | 1 - .../impl/common/init/CoreInitialization.java | 3 +- .../common/plugins/PluginReloaderImpl.java | 4 + .../transfer/AutoCraftingEvaluatorImpl.java | 121 ++++- ...impl.client.provider.AutoCraftingEvaluator | 1 + .../rei/impl/client/view/ViewsImpl.java | 11 +- .../view/craftable/CraftableFilter.java | 24 +- ...iel.rei.impl.client.provider.OverlayTicker | 1 + .../BatchedEntryRendererManager.java | 10 +- .../DelegateWidgetWithTranslate.java | 4 +- .../gui/widget/basewidgets}/EntryWidget.java | 254 ++++++--- .../widget/basewidgets/ForwardingList.java | 10 - .../widget/basewidgets/OverflowWidget.java | 6 +- .../basewidgets/PaddedCenterWidget.java | 2 +- .../gui/widget/basewidgets/PaddedWidget.java | 2 +- .../widget/basewidgets/TextFieldWidget.java | 40 +- .../rei/RoughlyEnoughItemsCoreClient.java | 9 +- .../rei/impl/client/REIRuntimeImpl.java | 5 +- .../impl/client/gui/ScreenOverlayImpl.java | 486 +++--------------- .../client/gui/changelog/ChangelogLoader.java | 85 +-- .../impl/client/gui/changelog/JParseDown.java | 30 +- .../gui/changelog/JParseDownToMinecraft.java | 18 +- .../gui/dragging/CurrentDraggingStack.java | 4 +- .../gui/overlay/AbstractScreenOverlay.java | 345 +++++++++++++ .../gui/overlay/InternalOverlayBounds.java | 51 ++ .../screen/AbstractDisplayViewingScreen.java | 49 +- .../screen/CompositeDisplayViewingScreen.java | 8 +- .../screen/DefaultDisplayViewingScreen.java | 44 +- .../gui/widget/AutoCraftingButtonWidget.java | 29 +- .../widget/CraftableFilterButtonWidget.java | 7 +- .../DefaultDisplayChoosePageWidget.java | 193 ------- .../gui/widget/DisplayedEntryWidget.java | 95 ++-- .../client/gui/widget/DraggableWidget.java | 104 ---- .../widget/entrylist/EntryListStackEntry.java | 151 +++--- .../gui/widget/entrylist/EntryListWidget.java | 37 +- .../entrylist/PaginatedEntryListWidget.java | 78 +-- .../entrylist/ScrolledEntryListWidget.java | 40 +- .../favorites/history/DisplayEntry.java | 28 +- .../panel/rows/FavoritesPanelEntriesRow.java | 66 ++- .../region/EntryStacksRegionWidget.java | 29 +- .../gui/widget/region/RealRegionEntry.java | 13 +- .../gui/widget/region/RegionEntryWidget.java | 39 +- .../gui/widget/search/DelegateTextField.java | 10 + .../gui/widget/search/OverlaySearchField.java | 23 +- .../runtime/DefaultClientRuntimePlugin.java | 2 +- .../impl/client/gui/InternalCursorState.java | 32 ++ 97 files changed, 1611 insertions(+), 1418 deletions(-) create mode 100644 api/src/main/java/me/shedaniel/rei/impl/client/provider/AutoCraftingEvaluator.java rename runtime/src/main/java/me/shedaniel/rei/impl/common/util/Weather.java => api/src/main/java/me/shedaniel/rei/impl/client/provider/OverlayTicker.java (61%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingEvaluator.java => runtime-engine/transfer-handlers/src/main/java/me/shedaniel/rei/impl/client/transfer/AutoCraftingEvaluatorImpl.java (69%) create mode 100644 runtime-engine/transfer-handlers/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.AutoCraftingEvaluator create mode 100644 runtime-engine/views/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.OverlayTicker rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets}/EntryWidget.java (70%) create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java delete mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DefaultDisplayChoosePageWidget.java delete mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DraggableWidget.java create mode 100644 shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalCursorState.java diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/SimpleDisplayRenderer.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/SimpleDisplayRenderer.java index 92646aa0d..2270a8ab9 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/SimpleDisplayRenderer.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/SimpleDisplayRenderer.java @@ -66,9 +66,9 @@ protected SimpleDisplayRenderer(List input, List !stack.isEmpty())) - .disableBackground() - .disableHighlight() - .disableTooltips(); + .noBackground() + .noHighlight() + .noTooltips(); } public static List simplify(List original) { @@ -123,10 +123,10 @@ public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, int xx = bounds.x + 4, yy = bounds.y + 2; int j = 0; int itemsPerLine = getItemsPerLine(); - for (Slot entryWidget : inputWidgets) { - entryWidget.setZ(getZ() + 50); - entryWidget.getBounds().setLocation(xx, yy); - entryWidget.render(matrices, mouseX, mouseY, delta); + for (Slot slot : inputWidgets) { + slot.setZ(getZ() + 50); + slot.getBounds().setLocation(xx, yy); + slot.render(matrices, mouseX, mouseY, delta); xx += 18; j++; if (j >= getItemsPerLine() - 2) { diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java index 88220ecf2..71fa8f49c 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Slot.java @@ -26,17 +26,22 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; +import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.common.entry.EntryStack; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.List; -import java.util.function.UnaryOperator; +import java.util.function.*; public abstract class Slot extends WidgetWithBounds { public static final byte UN_MARKED = 0; public static final byte INPUT = 1; public static final byte OUTPUT = 2; + @ApiStatus.Experimental + public static final byte FAVORITE = 4; public final Slot unmarkInputOrOutput() { setNoticeMark(UN_MARKED); @@ -53,6 +58,14 @@ public final Slot markOutput() { return this; } + public final void size(float size) { + this.getBounds().setSize(size, size); + } + + public final void size(float width, float height) { + this.getBounds().setSize(width, height); + } + public abstract void setNoticeMark(byte mark); public abstract byte getNoticeMark(); @@ -70,6 +83,7 @@ public final Slot noInteractable() { return interactable(false); } + @Deprecated(forRemoval = true) public final Slot notInteractable() { return interactable(false); } @@ -87,11 +101,16 @@ public final Slot noFavoritesInteractable() { return interactableFavorites(false); } + @Deprecated(forRemoval = true) public final Slot notFavoritesInteractable() { return interactableFavorites(false); } - public abstract void setHighlightEnabled(boolean highlights); + public final void setHighlightEnabled(boolean highlights) { + setHighlightEnabled(slot -> highlights); + } + + public abstract void setHighlightEnabled(Predicate highlights); public abstract boolean isHighlightEnabled(); @@ -100,11 +119,27 @@ public final Slot highlightEnabled(boolean highlight) { return this; } + public abstract Slot highlightEnabled(Predicate highlight); + + public final Slot noHighlight() { + return highlightEnabled(false); + } + + public final Slot noHighlightIfEmpty() { + setHighlightEnabled(slot -> !slot.isEmpty()); + return this; + } + + @Deprecated(forRemoval = true) public final Slot disableHighlight() { return highlightEnabled(false); } - public abstract void setTooltipsEnabled(boolean tooltipsEnabled); + public void setTooltipsEnabled(boolean tooltipsEnabled) { + setTooltipsEnabled(slot -> tooltipsEnabled); + } + + public abstract void setTooltipsEnabled(Predicate tooltipsEnabled); public abstract boolean isTooltipsEnabled(); @@ -113,11 +148,22 @@ public final Slot tooltipsEnabled(boolean tooltipsEnabled) { return this; } + public abstract Slot tooltipsEnabled(Predicate tooltipsEnabled); + + public final Slot noTooltips() { + return tooltipsEnabled(false); + } + + @Deprecated(forRemoval = true) public final Slot disableTooltips() { return tooltipsEnabled(false); } - public abstract void setBackgroundEnabled(boolean backgroundEnabled); + public void setBackgroundEnabled(boolean backgroundEnabled) { + setBackgroundEnabled(slot -> backgroundEnabled); + } + + public abstract void setBackgroundEnabled(Predicate backgroundEnabled); public abstract boolean isBackgroundEnabled(); @@ -126,10 +172,26 @@ public final Slot backgroundEnabled(boolean backgroundEnabled) { return this; } + public abstract Slot backgroundEnabled(Predicate backgroundEnabled); + + public final Slot noBackground() { + return backgroundEnabled(false); + } + + @Deprecated(forRemoval = true) public final Slot disableBackground() { return backgroundEnabled(false); } + public abstract void setCyclingInterval(long cyclingInterval); + + public abstract long getCyclingInterval(); + + public final Slot cyclingInterval(long cyclingInterval) { + setCyclingInterval(cyclingInterval); + return this; + } + public abstract Slot clearEntries(); public abstract Slot entry(EntryStack stack); @@ -140,6 +202,10 @@ public final Slot disableBackground() { public abstract List> getEntries(); + public final boolean isEmpty() { + return getEntries().isEmpty(); + } + public abstract Rectangle getInnerBounds(); public abstract void drawBackground(PoseStack matrices, int mouseX, int mouseY, float delta); @@ -160,4 +226,24 @@ public Tooltip getCurrentTooltip(TooltipContext context) { public abstract void drawHighlighted(PoseStack matrices, int mouseX, int mouseY, float delta); public abstract void tooltipProcessor(UnaryOperator operator); + + public abstract void action(ActionPredicate predicate); + + @ApiStatus.Experimental + public abstract void setFavoriteEntryFunction(Function, FavoriteEntry> function); + + @ApiStatus.Experimental + public abstract Function, FavoriteEntry> getFavoriteEntryFunction(); + + @ApiStatus.Experimental + public abstract void setContainsPointFunction(BiPredicate function); + + @ApiStatus.Experimental + public abstract void appendContainsPointFunction(BiPredicate function); + + public interface ActionPredicate { + boolean doMouse(Slot slot, double mouseX, double mouseY, int button); + + boolean doKey(Slot slot, int keyCode, int scanCode, int modifiers); + } } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TextField.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TextField.java index 803502972..1757e77b5 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TextField.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TextField.java @@ -38,8 +38,12 @@ public interface TextField extends TickableWidget { void setFormatter(TextFormatter formatter); + TextFormatter getFormatter(); + void setSuggestionRenderer(SuggestionRenderer renderer); + SuggestionRenderer getSuggestionRenderer(); + String getText(); void setText(String text); diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java index 550c9b226..848e853de 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java @@ -66,8 +66,16 @@ static Tooltip create(@Nullable Point point, Component... texts) { return create(point, Arrays.asList(texts)); } + static Tooltip create(@Nullable TooltipContext context, Collection texts) { + return from(context, CollectionUtils.map(texts, Tooltip::entry)); + } + + static Tooltip create(@Nullable TooltipContext context, Component... texts) { + return create(context, Arrays.asList(texts)); + } + static Tooltip create(Collection texts) { - return create(null, texts); + return create((TooltipContext) null, texts); } static Tooltip create(Component... texts) { @@ -82,8 +90,16 @@ static Tooltip from(@Nullable Point point, Entry... entries) { return from(point, Arrays.asList(entries)); } + static Tooltip from(@Nullable TooltipContext context, Collection entries) { + return ClientInternals.createTooltip(context == null ? null : context.getPoint(), entries); + } + + static Tooltip from(@Nullable TooltipContext context, Entry... entries) { + return from(context, Arrays.asList(entries)); + } + static Tooltip from(Collection entries) { - return from(null, entries); + return from((TooltipContext) null, entries); } static Tooltip from(Entry... entries) { diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipContext.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipContext.java index cb20f2bd2..b2cabe322 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipContext.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipContext.java @@ -52,7 +52,7 @@ static TooltipContext of(Point point, @Nullable TooltipFlag flag, boolean isSear } static TooltipContext ofMouse() { - return TooltipContext.of(PointHelper.ofMouse()); + return TooltipContext.of(Widget.mouse()); } TooltipFlag getFlag(); diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java index 4e7e2d336..67dfe7cbb 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java @@ -260,11 +260,7 @@ private static boolean shouldRecipeBaseRender(Panel panel) { public static Panel createSlotBase(Rectangle rectangle) { - return ClientInternals.getWidgetsProvider().createPanelWidget(rectangle).yTextureOffset(-66).rendering(Widgets::shouldSlotBaseRender); - } - - private static boolean shouldSlotBaseRender(Panel panel) { - return true; + return ClientInternals.getWidgetsProvider().createPanelWidget(rectangle).yTextureOffset(-66); } public static Panel createSlotBase(Rectangle rectangle, int color) { diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayCategoryView.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayCategoryView.java index 47f3b9803..e78ac4ff4 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayCategoryView.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/display/DisplayCategoryView.java @@ -66,7 +66,7 @@ public interface DisplayCategoryView { * for how the tooltip is resolved. *

* It is recommended to mark these slots for I/O using {@link Slot#markInput()} and {@link Slot#markOutput()}, - * and the background of the slots may be disabled using {@link Slot#disableBackground()}. + * and the background of the slots may be disabled using {@link Slot#noBackground()}. *

* Arbitrary text may be added to the widgets list with {@link Widgets#createLabel(Point, Component)}, * you may configure the horizontal alignment of the text using {@link Label#centered()}, diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java b/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java index b684d3554..706ea27ad 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java @@ -33,12 +33,10 @@ import me.shedaniel.rei.api.client.registry.entry.PreFilteredEntryList; import me.shedaniel.rei.api.client.registry.screen.ClickArea; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; +import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.plugins.PluginManager; -import me.shedaniel.rei.impl.client.provider.DelegatingFavoriteEntryProvider; -import me.shedaniel.rei.impl.client.provider.FavoritesEntriesListProvider; -import me.shedaniel.rei.impl.client.provider.MissingStacksTooltipProvider; -import me.shedaniel.rei.impl.client.provider.WidgetsProvider; +import me.shedaniel.rei.impl.client.provider.*; import me.shedaniel.rei.impl.common.Internals; import net.minecraft.ReportedException; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; @@ -64,6 +62,8 @@ public final class ClientInternals { UnaryOperator.identity()); private static final DelegatingFavoriteEntryProvider DELEGATE_FAVORITE_ENTRY = resolveService(DelegatingFavoriteEntryProvider.class); private static final FavoritesEntriesListProvider FAVORITES_ENTRIES_LIST = resolveService(FavoritesEntriesListProvider.class); + private static final List OVERLAY_TICKERS = resolveServices(OverlayTicker.class); + private static final AutoCraftingEvaluator AUTO_CRAFTING_EVALUATOR = resolveService(AutoCraftingEvaluator.class); private static Function> favoriteEntryFromJson = (object) -> throwNotSetup(); private static Function clickAreaHandlerResult = (result) -> throwNotSetup(); private static BiConsumer, TooltipComponent> clientTooltipComponentProvider = (tooltip, result) -> throwNotSetup(); @@ -157,6 +157,14 @@ public static List getFavoritesEntriesList() { return FAVORITES_ENTRIES_LIST.get(); } + public static List getOverlayTickers() { + return OVERLAY_TICKERS; + } + + public static AutoCraftingEvaluator.Builder getAutoCraftingEvaluator(Display display) { + return AUTO_CRAFTING_EVALUATOR.builder(display); + } + public static DataResult favoriteEntryFromJson(CompoundTag tag) { return favoriteEntryFromJson.apply(tag); } diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/provider/AutoCraftingEvaluator.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/AutoCraftingEvaluator.java new file mode 100644 index 000000000..413c13d8c --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/AutoCraftingEvaluator.java @@ -0,0 +1,103 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.provider; + +import me.shedaniel.math.Point; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.registry.transfer.TransferHandler; +import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRenderer; +import me.shedaniel.rei.api.common.display.Display; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.function.BiConsumer; +import java.util.function.Consumer; + +public interface AutoCraftingEvaluator { + Builder builder(Display display); + + interface Builder { + Builder actuallyCraft(); + + default Builder actuallyCraft(boolean build) { + if (build) { + return actuallyCraft(); + } else { + return this; + } + } + + Builder stacked(); + + default Builder stacked(boolean build) { + if (build) { + return stacked(); + } else { + return this; + } + } + + Builder ids(@Nullable Collection ids); + + Builder buildRenderer(); + + default Builder buildRenderer(boolean build) { + if (build) { + return buildRenderer(); + } else { + return this; + } + } + + Builder buildTooltipRenderer(); + + default Builder buildTooltipRenderer(boolean build) { + if (build) { + return buildTooltipRenderer(); + } else { + return this; + } + } + + Result get(); + } + + interface Result { + int getTint(); + + boolean isSuccessful(); + + @Nullable + TransferHandler getSuccessfulHandler(); + + boolean isApplicable(); + + @Nullable + TransferHandlerRenderer getRenderer(); + + @Nullable + BiConsumer> getTooltipRenderer(); + } +} diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/provider/DelegatingFavoriteEntryProvider.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/DelegatingFavoriteEntryProvider.java index 2eec919f8..48a773dca 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/client/provider/DelegatingFavoriteEntryProvider.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/DelegatingFavoriteEntryProvider.java @@ -26,9 +26,12 @@ import com.mojang.serialization.DataResult; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import net.minecraft.nbt.CompoundTag; +import org.jetbrains.annotations.ApiStatus; +import org.spongepowered.asm.mixin.injection.Inject; import java.util.function.Supplier; +@ApiStatus.Internal public interface DelegatingFavoriteEntryProvider { FavoriteEntry delegate(Supplier> result, Supplier tag); } diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/provider/FavoritesEntriesListProvider.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/FavoritesEntriesListProvider.java index d2c1ec23c..05205b1da 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/client/provider/FavoritesEntriesListProvider.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/FavoritesEntriesListProvider.java @@ -24,9 +24,11 @@ package me.shedaniel.rei.impl.client.provider; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; +import org.jetbrains.annotations.ApiStatus; import java.util.List; +@ApiStatus.Internal public interface FavoritesEntriesListProvider { List get(); } diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/provider/MissingStacksTooltipProvider.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/MissingStacksTooltipProvider.java index b10675f1f..1d07c370f 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/client/provider/MissingStacksTooltipProvider.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/MissingStacksTooltipProvider.java @@ -25,9 +25,11 @@ import me.shedaniel.rei.api.common.entry.EntryIngredient; import net.minecraft.world.inventory.tooltip.TooltipComponent; +import org.jetbrains.annotations.ApiStatus; import java.util.List; +@ApiStatus.Internal public interface MissingStacksTooltipProvider { TooltipComponent provide(List stacks); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/util/Weather.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/OverlayTicker.java similarity index 61% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/util/Weather.java rename to api/src/main/java/me/shedaniel/rei/impl/client/provider/OverlayTicker.java index 09fbd0024..5f8fd1877 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/util/Weather.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/OverlayTicker.java @@ -21,41 +21,11 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.util; +package me.shedaniel.rei.impl.client.provider; import org.jetbrains.annotations.ApiStatus; @ApiStatus.Internal -public enum Weather { - CLEAR(0, "text.rei.weather.clear"), - RAIN(1, "text.rei.weather.rain"), - THUNDER(2, "text.rei.weather.thunder"); - - private final int id; - private final String translateKey; - - Weather(int id, String translateKey) { - this.id = id; - this.translateKey = translateKey; - } - - public static Weather byId(int id) { - return byId(id, CLEAR); - } - - public static Weather byId(int id, Weather defaultWeather) { - for (Weather weather : values()) { - if (weather.id == id) - return weather; - } - return defaultWeather; - } - - public int getId() { - return id; - } - - public String getTranslateKey() { - return translateKey; - } +public interface OverlayTicker { + void tick(); } diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/provider/WidgetsProvider.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/WidgetsProvider.java index 6d985e4a2..28d38c24c 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/client/provider/WidgetsProvider.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/WidgetsProvider.java @@ -33,10 +33,12 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FormattedText; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.ApiStatus; import java.util.List; import java.util.function.Supplier; +@ApiStatus.Internal public interface WidgetsProvider { boolean isRenderingPanel(Panel panel); diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/provider/CategoryIdentifierConstructor.java b/api/src/main/java/me/shedaniel/rei/impl/common/provider/CategoryIdentifierConstructor.java index 11b3b4928..a316f7605 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/common/provider/CategoryIdentifierConstructor.java +++ b/api/src/main/java/me/shedaniel/rei/impl/common/provider/CategoryIdentifierConstructor.java @@ -25,7 +25,9 @@ import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; +import org.jetbrains.annotations.ApiStatus; +@ApiStatus.Internal public interface CategoryIdentifierConstructor { CategoryIdentifier create(String location); } diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/provider/DeferringEntryTypeProvider.java b/api/src/main/java/me/shedaniel/rei/impl/common/provider/DeferringEntryTypeProvider.java index 3abf02a90..eb2240988 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/common/provider/DeferringEntryTypeProvider.java +++ b/api/src/main/java/me/shedaniel/rei/impl/common/provider/DeferringEntryTypeProvider.java @@ -25,7 +25,9 @@ import me.shedaniel.rei.api.common.entry.type.EntryType; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.ApiStatus; +@ApiStatus.Internal public interface DeferringEntryTypeProvider { EntryType get(ResourceLocation id); } diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryIngredientProvider.java b/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryIngredientProvider.java index 2a0ead5ab..5d86576a1 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryIngredientProvider.java +++ b/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryIngredientProvider.java @@ -25,7 +25,9 @@ import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; +import org.jetbrains.annotations.ApiStatus; +@ApiStatus.Internal public interface EntryIngredientProvider { EntryIngredient empty(); diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryStackProvider.java b/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryStackProvider.java index cc01fc8ff..91629b0ae 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryStackProvider.java +++ b/api/src/main/java/me/shedaniel/rei/impl/common/provider/EntryStackProvider.java @@ -26,7 +26,9 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import net.minecraft.util.Unit; +import org.jetbrains.annotations.ApiStatus; +@ApiStatus.Internal public interface EntryStackProvider { EntryStack empty(); diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/provider/NbtHasherProvider.java b/api/src/main/java/me/shedaniel/rei/impl/common/provider/NbtHasherProvider.java index b12d6910d..8cd56cc6e 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/common/provider/NbtHasherProvider.java +++ b/api/src/main/java/me/shedaniel/rei/impl/common/provider/NbtHasherProvider.java @@ -25,7 +25,9 @@ import me.shedaniel.rei.api.common.entry.comparison.EntryComparator; import net.minecraft.nbt.Tag; +import org.jetbrains.annotations.ApiStatus; +@ApiStatus.Internal public interface NbtHasherProvider { EntryComparator provide(String... ignoredKeys); } diff --git a/api/src/main/java/me/shedaniel/rei/impl/common/provider/PluginManagerConstructor.java b/api/src/main/java/me/shedaniel/rei/impl/common/provider/PluginManagerConstructor.java index b31d4bc45..ce530af90 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/common/provider/PluginManagerConstructor.java +++ b/api/src/main/java/me/shedaniel/rei/impl/common/provider/PluginManagerConstructor.java @@ -26,9 +26,11 @@ import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.plugins.PluginView; import me.shedaniel.rei.api.common.plugins.REIPlugin; +import org.jetbrains.annotations.ApiStatus; import java.util.function.UnaryOperator; +@ApiStatus.Internal public interface PluginManagerConstructor {

> PluginManager

create(Class

clazz, UnaryOperator> constructor); } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultBrewingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultBrewingCategory.java index 9e020da89..d52357628 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultBrewingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultBrewingCategory.java @@ -74,12 +74,12 @@ public List setupDisplay(DefaultBrewingDisplay display, Rectangle bounds int width = Mth.ceil(System.currentTimeMillis() / 250d % 18d); helper.blit(matrices, startPoint.x + 44, startPoint.y + 28, 103, 163, width, 4); })); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entry(EntryStacks.of(Items.BLAZE_POWDER)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 40, startPoint.y + 1)).entries(display.getInputEntries().get(0)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 63, startPoint.y + 1)).entries(display.getInputEntries().get(1)).disableBackground().markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 40, startPoint.y + 35)).entries(display.getOutput(0)).disableBackground().markOutput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 63, startPoint.y + 42)).entries(display.getOutput(1)).disableBackground().markOutput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 86, startPoint.y + 35)).entries(display.getOutput(2)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entry(EntryStacks.of(Items.BLAZE_POWDER)).noBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 40, startPoint.y + 1)).entries(display.getInputEntries().get(0)).noBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 63, startPoint.y + 1)).entries(display.getInputEntries().get(1)).noBackground().markInput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 40, startPoint.y + 35)).entries(display.getOutput(0)).noBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 63, startPoint.y + 42)).entries(display.getOutput(1)).noBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 86, startPoint.y + 35)).entries(display.getOutput(2)).noBackground().markOutput()); return widgets; } } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultCampfireCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultCampfireCategory.java index 9b88ec83f..7f8aaf7b5 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultCampfireCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultCampfireCategory.java @@ -70,7 +70,7 @@ public List setupDisplay(DefaultCampfireDisplay display, Rectangle bound new TranslatableComponent("category.rei.campfire.time", df.format(cookingTime / 20d))).noShadow().rightAligned().color(0xFF404040, 0xFFBBBBBB)); widgets.add(Widgets.createArrow(new Point(startPoint.x + 24, startPoint.y + 8)).animationDurationTicks(cookingTime)); widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)).entries(display.getInputEntries().get(0)).markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)).entries(display.getOutputEntries().get(0)).noBackground().markOutput()); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultCompostingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultCompostingCategory.java index aa402a34d..5ba549ce7 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultCompostingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultCompostingCategory.java @@ -109,7 +109,7 @@ public List setupDisplay(DefaultCompostingDisplay display, Rectangle bou } widgets.add(Widgets.createArrow(new Point(startingPoint.x - 1 - 5, startingPoint.y + 7 - 5))); widgets.add(Widgets.createResultSlotBackground(new Point(startingPoint.x + 33 - 5, startingPoint.y + 8 - 5))); - widgets.add(Widgets.createSlot(new Point(startingPoint.x + 33 - 5, startingPoint.y + 8 - 5)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startingPoint.x + 33 - 5, startingPoint.y + 8 - 5)).entries(display.getOutputEntries().get(0)).noBackground().markOutput()); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultFuelCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultFuelCategory.java index e2f4b05ad..dd968253c 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultFuelCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultFuelCategory.java @@ -88,7 +88,7 @@ public List setupDisplay(DefaultFuelDisplay display, Rectangle bounds) { @Override public DisplayRenderer getDisplayRenderer(DefaultFuelDisplay display) { - Slot slot = Widgets.createSlot(new Point(0, 0)).entries(display.getInputEntries().get(0)).disableBackground().disableHighlight(); + Slot slot = Widgets.createSlot(new Point(0, 0)).entries(display.getInputEntries().get(0)).noBackground().noHighlight(); String burnItems = DECIMAL_FORMAT.format(display.getFuelTime() / 200d); return new DisplayRenderer() { private TranslatableComponent text = new TranslatableComponent("category.rei.fuel.time_short.items", burnItems); diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultOxidationScrapingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultOxidationScrapingCategory.java index 4f5d1e849..079393311 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultOxidationScrapingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultOxidationScrapingCategory.java @@ -66,7 +66,7 @@ public List setupDisplay(DefaultOxidationScrapingDisplay display, Rectan widgets.add(Widgets.createArrow(new Point(startPoint.x + 27, startPoint.y + 4))); widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 5))); widgets.add(Widgets.createSlot(new Point(startPoint.x + 4, startPoint.y + 5)).entries(display.getIn()).markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).noBackground().markOutput()); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultOxidizingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultOxidizingCategory.java index a33ef331c..b35ae2628 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultOxidizingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultOxidizingCategory.java @@ -66,7 +66,7 @@ public List setupDisplay(DefaultOxidizingDisplay display, Rectangle boun widgets.add(Widgets.createArrow(new Point(startPoint.x + 27, startPoint.y + 4))); widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 5))); widgets.add(Widgets.createSlot(new Point(startPoint.x + 4, startPoint.y + 5)).entries(display.getIn()).markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).noBackground().markOutput()); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultPathingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultPathingCategory.java index e207046ff..dbcb2d401 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultPathingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultPathingCategory.java @@ -64,7 +64,7 @@ public List setupDisplay(DefaultPathingDisplay display, Rectangle bounds widgets.add(Widgets.createArrow(new Point(startPoint.x + 27, startPoint.y + 4))); widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 5))); widgets.add(Widgets.createSlot(new Point(startPoint.x + 4, startPoint.y + 5)).entries(display.getIn()).markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).noBackground().markOutput()); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultSmithingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultSmithingCategory.java index b62dc7f4d..aa44902d0 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultSmithingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultSmithingCategory.java @@ -65,7 +65,7 @@ public List setupDisplay(DefaultSmithingDisplay display, Rectangle bound widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 5))); widgets.add(Widgets.createSlot(new Point(startPoint.x + 4 - 22, startPoint.y + 5)).entries(display.getInputEntries().get(0)).markInput()); widgets.add(Widgets.createSlot(new Point(startPoint.x + 4, startPoint.y + 5)).entries(display.getInputEntries().get(1)).markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOutputEntries().get(0)).noBackground().markOutput()); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultStoneCuttingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultStoneCuttingCategory.java index 0a9ae4aba..9015231e5 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultStoneCuttingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultStoneCuttingCategory.java @@ -65,7 +65,7 @@ public List setupDisplay(DefaultStoneCuttingDisplay display, Rectangle b widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 5))); widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)) .entries(display.getOutputEntries().get(0)) - .disableBackground() + .noBackground() .markOutput()); widgets.add(Widgets.createSlot(new Point(startPoint.x + 4, startPoint.y + 5)) .entries(display.getInputEntries().get(0)).markInput()); diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultStrippingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultStrippingCategory.java index 8c0c6740f..3a5e87d50 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultStrippingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultStrippingCategory.java @@ -64,7 +64,7 @@ public List setupDisplay(DefaultStrippingDisplay display, Rectangle boun widgets.add(Widgets.createArrow(new Point(startPoint.x + 27, startPoint.y + 4))); widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 5))); widgets.add(Widgets.createSlot(new Point(startPoint.x + 4, startPoint.y + 5)).entries(display.getIn()).markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).noBackground().markOutput()); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultTillingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultTillingCategory.java index be0b862ba..a219e7c47 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultTillingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultTillingCategory.java @@ -64,7 +64,7 @@ public List setupDisplay(DefaultTillingDisplay display, Rectangle bounds widgets.add(Widgets.createArrow(new Point(startPoint.x + 27, startPoint.y + 4))); widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 5))); widgets.add(Widgets.createSlot(new Point(startPoint.x + 4, startPoint.y + 5)).entries(display.getIn()).markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).noBackground().markOutput()); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultWaxScrapingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultWaxScrapingCategory.java index 96c487fb2..a5003f836 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultWaxScrapingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultWaxScrapingCategory.java @@ -66,7 +66,7 @@ public List setupDisplay(DefaultWaxScrapingDisplay display, Rectangle bo widgets.add(Widgets.createArrow(new Point(startPoint.x + 27, startPoint.y + 4))); widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 5))); widgets.add(Widgets.createSlot(new Point(startPoint.x + 4, startPoint.y + 5)).entries(display.getIn()).markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).noBackground().markOutput()); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultWaxingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultWaxingCategory.java index fa95d2659..d40fce021 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultWaxingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultWaxingCategory.java @@ -66,7 +66,7 @@ public List setupDisplay(DefaultWaxingDisplay display, Rectangle bounds) widgets.add(Widgets.createArrow(new Point(startPoint.x + 27, startPoint.y + 4))); widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 5))); widgets.add(Widgets.createSlot(new Point(startPoint.x + 4, startPoint.y + 5)).entries(display.getIn()).markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOut()).noBackground().markOutput()); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/anvil/DefaultAnvilCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/anvil/DefaultAnvilCategory.java index b49249961..859d3d8d3 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/anvil/DefaultAnvilCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/anvil/DefaultAnvilCategory.java @@ -65,7 +65,7 @@ public List setupDisplay(DefaultAnvilDisplay display, Rectangle bounds) widgets.add(Widgets.createResultSlotBackground(new Point(startPoint.x + 61, startPoint.y + 5))); widgets.add(Widgets.createSlot(new Point(startPoint.x + 4 - 22, startPoint.y + 5)).entries(display.getInputEntries().get(0)).markInput()); widgets.add(Widgets.createSlot(new Point(startPoint.x + 4, startPoint.y + 5)).entries(display.getInputEntries().get(1)).markInput()); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 5)).entries(display.getOutputEntries().get(0)).noBackground().markOutput()); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconBaseCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconBaseCategory.java index 5d2b668e6..93502cfa0 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconBaseCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconBaseCategory.java @@ -87,7 +87,7 @@ public List setupDisplay(DefaultBeaconBaseDisplay display, Rectangle bou widgets.add(Widgets.createSlot(new Point(bounds.getCenterX() - 8, bounds.y + 3)).entry(EntryStacks.of(Blocks.BEACON))); Rectangle rectangle = new Rectangle(bounds.getCenterX() - (bounds.width / 2) - 1, bounds.y + 23, bounds.width + 2, bounds.height - 28); widgets.add(Widgets.createSlotBase(rectangle)); - widgets.add(new ScrollableSlotsWidget(rectangle, CollectionUtils.map(display.getEntries(), t -> Widgets.createSlot(new Point(0, 0)).disableBackground().entry(t)))); + widgets.add(new ScrollableSlotsWidget(rectangle, CollectionUtils.map(display.getEntries(), t -> Widgets.createSlot(new Point(0, 0)).noBackground().entry(t)))); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconPaymentCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconPaymentCategory.java index 17071e68d..c2ebdda40 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconPaymentCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconPaymentCategory.java @@ -87,7 +87,7 @@ public List setupDisplay(DefaultBeaconPaymentDisplay display, Rectangle widgets.add(Widgets.createSlot(new Point(bounds.getCenterX() - 8, bounds.y + 3)).entry(EntryStacks.of(Blocks.BEACON))); Rectangle rectangle = new Rectangle(bounds.getCenterX() - (bounds.width / 2) - 1, bounds.y + 23, bounds.width + 2, bounds.height - 28); widgets.add(Widgets.createSlotBase(rectangle)); - widgets.add(new ScrollableSlotsWidget(rectangle, CollectionUtils.map(display.getEntries(), t -> Widgets.createSlot(new Point(0, 0)).disableBackground().entry(t)))); + widgets.add(new ScrollableSlotsWidget(rectangle, CollectionUtils.map(display.getEntries(), t -> Widgets.createSlot(new Point(0, 0)).noBackground().entry(t)))); return widgets; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/cooking/DefaultCookingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/cooking/DefaultCookingCategory.java index 5e8b4c0a2..7e609774c 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/cooking/DefaultCookingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/cooking/DefaultCookingCategory.java @@ -72,7 +72,7 @@ public List setupDisplay(DefaultCookingDisplay display, Rectangle bounds .animationDurationTicks(cookingTime)); widgets.add(Widgets.createSlot(new Point(startPoint.x + 61, startPoint.y + 9)) .entries(display.getOutputEntries().get(0)) - .disableBackground() + .noBackground() .markOutput()); widgets.add(Widgets.createSlot(new Point(startPoint.x + 1, startPoint.y + 1)) .entries(display.getInputEntries().get(0)) diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java index 55f0ba48a..5e348ce3e 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/crafting/DefaultCraftingCategory.java @@ -80,7 +80,7 @@ public List setupDisplay(DefaultCraftingDisplay display, Rectangle bo slots.get(ingredient.getIndex()).entries(ingredient.get()); } widgets.addAll(slots); - widgets.add(Widgets.createSlot(new Point(startPoint.x + 95, startPoint.y + 19)).entries(display.getOutputEntries().get(0)).disableBackground().markOutput()); + widgets.add(Widgets.createSlot(new Point(startPoint.x + 95, startPoint.y + 19)).entries(display.getOutputEntries().get(0)).noBackground().markOutput()); if (display.isShapeless()) { widgets.add(Widgets.createShapelessIcon(bounds)); } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/DefaultTagCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/DefaultTagCategory.java index 1b1ac544e..9f7b4d867 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/DefaultTagCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/DefaultTagCategory.java @@ -149,7 +149,7 @@ public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, @Override @Nullable public Tooltip getTooltip(TooltipContext context) { - return Tooltip.create(context.getPoint(), new TextComponent(holder.unwrapKey().map(key -> key.location().toString()).orElse("null"))); + return Tooltip.create(context, new TextComponent(holder.unwrapKey().map(key -> key.location().toString()).orElse("null"))); } }); } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/ReferenceTagNodeWidget.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/ReferenceTagNodeWidget.java index 019e4f3d2..f98bfb805 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/ReferenceTagNodeWidget.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/ReferenceTagNodeWidget.java @@ -55,9 +55,9 @@ public ReferenceTagNodeWidget(TagNode node, Function, EntryStack this.overflowBounds = overflowBounds; this.bounds = new Rectangle(0, 0, 24, 23); this.slot = Widgets.createSlot(new Rectangle(0, 0, 18, 18)) - .disableBackground() - .disableHighlight() - .disableTooltips() + .noBackground() + .noHighlight() + .noTooltips() .entries(EntryIngredients.ofTag(node.getReference(), mapper)); this.children = Collections.singletonList(this.slot); } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/ValueTagNodeWidget.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/ValueTagNodeWidget.java index 5936e1842..f53fd92d9 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/ValueTagNodeWidget.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/ValueTagNodeWidget.java @@ -66,7 +66,7 @@ public ValueTagNodeWidget(TagNode node, Function, EntryStack> ma int y = i / width; Slot slot = Widgets.createSlot(new Rectangle(x * 16 + 5, y * 16 + 5, 18, 18)) .entry(mapper.apply(holder)) - .disableBackground(); + .noBackground(); this.widgets.add(slot); i++; } diff --git a/fabric/src/main/java/me/shedaniel/rei/mixin/fabric/MixinClientPacketListener.java b/fabric/src/main/java/me/shedaniel/rei/mixin/fabric/MixinClientPacketListener.java index c98edb2c9..63ff50dec 100644 --- a/fabric/src/main/java/me/shedaniel/rei/mixin/fabric/MixinClientPacketListener.java +++ b/fabric/src/main/java/me/shedaniel/rei/mixin/fabric/MixinClientPacketListener.java @@ -23,7 +23,7 @@ package me.shedaniel.rei.mixin.fabric; -import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; +import me.shedaniel.rei.impl.client.init.CoreClientInitialization; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket; import net.minecraft.world.item.crafting.RecipeManager; @@ -40,6 +40,6 @@ public class MixinClientPacketListener { @Inject(method = "handleUpdateRecipes", at = @At("HEAD")) private void handleUpdateRecipes(ClientboundUpdateRecipesPacket clientboundUpdateRecipesPacket, CallbackInfo ci) { - RoughlyEnoughItemsCoreClient.PRE_UPDATE_RECIPES.invoker().update(recipeManager); + CoreClientInitialization.PRE_UPDATE_RECIPES.invoker().update(recipeManager); } } \ No newline at end of file diff --git a/forge/src/main/java/me/shedaniel/rei/mixin/forge/MixinClientPacketListener.java b/forge/src/main/java/me/shedaniel/rei/mixin/forge/MixinClientPacketListener.java index 252a365b6..6efe7beb2 100644 --- a/forge/src/main/java/me/shedaniel/rei/mixin/forge/MixinClientPacketListener.java +++ b/forge/src/main/java/me/shedaniel/rei/mixin/forge/MixinClientPacketListener.java @@ -23,7 +23,7 @@ package me.shedaniel.rei.mixin.forge; -import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; +import me.shedaniel.rei.impl.client.init.CoreClientInitialization; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.network.protocol.game.ClientboundUpdateRecipesPacket; import net.minecraft.world.item.crafting.RecipeManager; @@ -40,6 +40,6 @@ public class MixinClientPacketListener { @Inject(method = "handleUpdateRecipes", at = @At("HEAD")) private void handleUpdateRecipes(ClientboundUpdateRecipesPacket clientboundUpdateRecipesPacket, CallbackInfo ci) { - RoughlyEnoughItemsCoreClient.PRE_UPDATE_RECIPES.invoker().update(recipeManager); + CoreClientInitialization.PRE_UPDATE_RECIPES.invoker().update(recipeManager); } } \ No newline at end of file diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java index e13b0e54d..141900f2e 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/ConfigObjectImpl.java @@ -54,6 +54,7 @@ import java.util.ArrayList; import java.util.List; +@SuppressWarnings("FieldMayBeFinal") @ApiStatus.Internal @Config(name = "roughlyenoughitems/config") @Environment(EnvType.CLIENT) diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/ConfigAddonsEntry.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/ConfigAddonsEntry.java index 017201a14..f05a4c98e 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/ConfigAddonsEntry.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/ConfigAddonsEntry.java @@ -44,11 +44,11 @@ @ApiStatus.Internal public class ConfigAddonsEntry extends AbstractConfigListEntry { - private int width; - private AbstractWidget buttonWidget = new Button(0, 0, 0, 20, NarratorChatListener.NO_TITLE, button -> { + private final int width; + private final AbstractWidget buttonWidget = new Button(0, 0, 0, 20, NarratorChatListener.NO_TITLE, button -> { Minecraft.getInstance().setScreen(new ConfigAddonsScreen(Minecraft.getInstance().screen)); }); - private List children = ImmutableList.of(buttonWidget); + private final List children = ImmutableList.of(buttonWidget); public ConfigAddonsEntry(int width) { super(NarratorChatListener.NO_TITLE, false); diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/TitleTextEntry.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/TitleTextEntry.java index 3e2bdc48a..049753e9e 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/TitleTextEntry.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/TitleTextEntry.java @@ -39,7 +39,7 @@ @ApiStatus.Internal public class TitleTextEntry extends AbstractConfigListEntry { - private Component text; + private final Component text; public TitleTextEntry(Component text) { super(NarratorChatListener.NO_TITLE, false); diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/UncertainDisplayViewingScreen.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/UncertainDisplayViewingScreen.java index 21ce7ac95..d8e07bc3d 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/UncertainDisplayViewingScreen.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/config/entries/UncertainDisplayViewingScreen.java @@ -76,12 +76,12 @@ public class UncertainDisplayViewingScreen extends Screen { private boolean original; private double frame = 0; private double target = 0; - private BooleanConsumer callback; + private final BooleanConsumer callback; private Button button; - private Screen parent; + private final Screen parent; private Widget slider; - private boolean showTips; - public NumberAnimator scroll = ValueAnimator.ofDouble(); + private final boolean showTips; + public final NumberAnimator scroll = ValueAnimator.ofDouble(); private List allModsUsingJEI = null; private boolean jeiEnabled = false; diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java index 58cca6382..2182f01f2 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsEntryListWidget.java @@ -97,7 +97,7 @@ public List narratables() { } public static class TextCreditsItem extends CreditsItem { - private Component text; + private final Component text; public TextCreditsItem(Component text) { this.text = text; @@ -120,9 +120,9 @@ public boolean changeFocus(boolean boolean_1) { } public static class TranslationCreditsItem extends CreditsItem { - private Component language; - private List translators; - private int maxWidth; + private final Component language; + private final List translators; + private final int maxWidth; public TranslationCreditsItem(Component language, Component translators, int width, int maxWidth) { this.language = language; @@ -152,11 +152,11 @@ public boolean changeFocus(boolean boolean_1) { } public static class LinkItem extends CreditsItem { - private Component text; - private List textSplit; - private String link; + private final Component text; + private final List textSplit; + private final String link; private boolean contains; - private boolean rainbow; + private final boolean rainbow; public LinkItem(Component text, String link, int width, boolean rainbow) { this.text = text; diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java index 8ca4fe7ef..70834e457 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java @@ -50,7 +50,7 @@ @ApiStatus.Internal public class CreditsScreen extends Screen { - private Screen parent; + private final Screen parent; private AbstractButton buttonDone; private CreditsEntryListWidget entryListWidget; diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java index 1e4df400b..fafd59de8 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java @@ -452,9 +452,9 @@ private FilteringListEntry(int x, int y) { super(Widgets.createSlot(new Point(x, y)) .noFavoritesInteractable() .noInteractable() - .disableBackground() - .disableTooltips() - .disableHighlight()); + .noBackground() + .noTooltips() + .noHighlight()); this.slot = (Slot) widget; this.backupY = y; } diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java index b1f932022..930a46975 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRuleType.java @@ -108,7 +108,7 @@ public void addEntries(Consumer entryConsumer) { entryStacks = EntryRegistry.getInstance().getEntryStacks().parallel() .filter(filter) .map(EntryStack::normalize) - .map(stack -> Widgets.createSlot(new Rectangle(0, 0, 18, 18)).disableBackground().entry(stack)) + .map(stack -> Widgets.createSlot(new Rectangle(0, 0, 18, 18)).noBackground().entry(stack)) .collect(Collectors.toList()); }); if (entry != null) widget.setValue(entry.getWidget().getValue()); diff --git a/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/client/init/CoreClientInitialization.java b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/client/init/CoreClientInitialization.java index 44df96bc4..32168ec63 100644 --- a/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/client/init/CoreClientInitialization.java +++ b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/client/init/CoreClientInitialization.java @@ -82,7 +82,6 @@ public void onInitializeClient() { MutableLong startReload = new MutableLong(-1); MutableLong endReload = new MutableLong(-1); PRE_UPDATE_RECIPES.register(recipeManager -> { - PluginReloaderImpl.PERFORMANCE_LOGGER.clear(); CoreInitialization.reloadPlugins(startReload, ReloadStage.START); }); ClientRecipeUpdateEvent.EVENT.register(recipeManager -> { diff --git a/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java index c5945ead1..ff034ccf2 100644 --- a/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java +++ b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java @@ -38,9 +38,9 @@ import me.shedaniel.rei.api.common.registry.RecipeManagerContext; import me.shedaniel.rei.api.common.registry.ReloadStage; import me.shedaniel.rei.api.common.transfer.info.MenuInfoRegistry; -import me.shedaniel.rei.impl.common.Internals; import me.shedaniel.rei.impl.client.init.CoreClientInitialization; import me.shedaniel.rei.impl.common.InternalLogger; +import me.shedaniel.rei.impl.common.Internals; import net.minecraft.server.packs.PackType; import net.minecraft.util.Unit; import org.apache.commons.lang3.mutable.MutableLong; @@ -104,7 +104,6 @@ public static void reloadPlugins(MutableLong lastReload, @Nullable ReloadStage s } lastReload.setValue(System.currentTimeMillis()); } - if (start == null) PluginReloaderImpl.PERFORMANCE_LOGGER.clear(); if (Platform.getEnvironment() == Env.CLIENT) { if (CoreClientInitialization.reloadPluginsClient(start)) return; } diff --git a/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java index 8078879ac..312d4e7e4 100644 --- a/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java +++ b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java @@ -131,6 +131,10 @@ private void queueExecutionClient(Runnable runnable) { } public void pre(PluginManager

manager, Class

pluginClass, List> plugins, ReloadStage stage) { + if (stage == ReloadStage.START && manager == PluginManager.getActiveInstances().get(0)) { + PERFORMANCE_LOGGER.clear(); + } + this.forcedMainThread = false; this.forceMainThreadStopwatch.reset(); this.reloadStopwatch.reset().start(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingEvaluator.java b/runtime-engine/transfer-handlers/src/main/java/me/shedaniel/rei/impl/client/transfer/AutoCraftingEvaluatorImpl.java similarity index 69% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingEvaluator.java rename to runtime-engine/transfer-handlers/src/main/java/me/shedaniel/rei/impl/client/transfer/AutoCraftingEvaluatorImpl.java index 94ead5360..b694eaf91 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingEvaluator.java +++ b/runtime-engine/transfer-handlers/src/main/java/me/shedaniel/rei/impl/client/transfer/AutoCraftingEvaluatorImpl.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.transfer; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.REIRuntime; @@ -33,6 +33,7 @@ import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRenderer; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.client.provider.AutoCraftingEvaluator; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; @@ -41,6 +42,7 @@ import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -48,23 +50,101 @@ import java.util.Locale; import java.util.function.BiConsumer; import java.util.function.Consumer; -import java.util.function.Supplier; -public class AutoCraftingEvaluator { - public static class AutoCraftingResult { +public class AutoCraftingEvaluatorImpl implements AutoCraftingEvaluator { + @Override + public Builder builder(Display display) { + return new Builder() { + private boolean actuallyCraft = false; + private boolean stacked = false; + @Nullable + private Collection ids = display.provideInternalDisplayIds(); + private boolean buildRenderer = false; + private boolean buildTooltipRenderer = false; + + @Override + public Builder actuallyCraft() { + this.actuallyCraft = true; + return this; + } + + @Override + public Builder stacked() { + this.stacked = true; + return this; + } + + @Override + public Builder ids(@Nullable Collection ids) { + this.ids = ids; + return this; + } + + @Override + public Builder buildRenderer() { + this.buildRenderer = true; + return this; + } + + @Override + public Builder buildTooltipRenderer() { + this.buildTooltipRenderer = true; + return this; + } + + @Override + public Result get() { + return evaluateAutoCrafting(actuallyCraft, stacked, display, buildRenderer, buildTooltipRenderer, ids); + } + }; + } + + public static class AutoCraftingResult implements AutoCraftingEvaluator.Result { public int tint = 0; public boolean successful = false; public TransferHandler successfulHandler; public boolean hasApplicable = false; public TransferHandlerRenderer renderer; public BiConsumer> tooltipRenderer; + + @Override + public int getTint() { + return tint; + } + + @Override + public boolean isSuccessful() { + return successful; + } + + @Override + public TransferHandler getSuccessfulHandler() { + return successfulHandler; + } + + @Override + public boolean isApplicable() { + return hasApplicable; + } + + @Override + public TransferHandlerRenderer getRenderer() { + return renderer; + } + + @Override + public BiConsumer> getTooltipRenderer() { + return tooltipRenderer; + } } - public static AutoCraftingResult evaluateAutoCrafting(boolean actuallyCrafting, boolean stackedCrafting, Display display, Supplier> idsSupplier) { + public static AutoCraftingResult evaluateAutoCrafting(boolean actuallyCrafting, boolean stackedCrafting, Display display, + boolean buildRenderer, boolean buildTooltipRenderer, + @Nullable Collection ids) { AbstractContainerScreen containerScreen = REIRuntime.getInstance().getPreviousContainerScreen(); AutoCraftingResult result = new AutoCraftingResult(); final List errorTooltip = new ArrayList<>(); - result.tooltipRenderer = (pos, sink) -> { + result.tooltipRenderer = !buildTooltipRenderer ? null : (pos, sink) -> { List str = new ArrayList<>(errorTooltip); if (ConfigObject.getInstance().isFavoritesEnabled()) { @@ -72,17 +152,14 @@ public static AutoCraftingResult evaluateAutoCrafting(boolean actuallyCrafting, str.add(Tooltip.entry(new TranslatableComponent("text.rei.save.recipes", new TextComponent(ConfigObject.getInstance().getFavoriteKeyCode().getLocalizedName().getString().toUpperCase(Locale.ROOT)).withStyle(ChatFormatting.BOLD)).withStyle(ChatFormatting.GRAY))); } - if (Minecraft.getInstance().options.advancedItemTooltips && idsSupplier != null) { - Collection locations = idsSupplier.get(); - if (!locations.isEmpty()) { - str.add(Tooltip.entry(new TextComponent(" "))); - for (ResourceLocation location : locations) { - String t = I18n.get("text.rei.recipe_id", "", location.toString()); - if (t.startsWith("\n")) { - t = t.substring("\n".length()); - } - str.add(Tooltip.entry(new TextComponent(t).withStyle(ChatFormatting.GRAY))); + if (Minecraft.getInstance().options.advancedItemTooltips && ids != null && !ids.isEmpty()) { + str.add(Tooltip.entry(new TextComponent(" "))); + for (ResourceLocation location : ids) { + String t = I18n.get("text.rei.recipe_id", "", location.toString()); + if (t.startsWith("\n")) { + t = t.substring("\n".length()); } + str.add(Tooltip.entry(new TextComponent(t).withStyle(ChatFormatting.GRAY))); } } @@ -115,12 +192,14 @@ public static AutoCraftingResult evaluateAutoCrafting(boolean actuallyCrafting, result.hasApplicable = true; result.tint = transferResult.getColor(); - TransferHandlerRenderer transferHandlerRenderer = transferResult.getRenderer(transferHandler, context); - if (transferHandlerRenderer != null) { - result.renderer = transferHandlerRenderer; + if (buildRenderer) { + TransferHandlerRenderer transferHandlerRenderer = transferResult.getRenderer(transferHandler, context); + if (transferHandlerRenderer != null) { + result.renderer = transferHandlerRenderer; + } } - if (transferResult.getTooltipRenderer() != null) { + if (buildTooltipRenderer && transferResult.getTooltipRenderer() != null) { BiConsumer tooltipRenderer = transferResult.getTooltipRenderer(); result.tooltipRenderer = (point, tooltipConsumer) -> tooltipRenderer.accept(point, tooltipConsumer::accept); } @@ -144,6 +223,8 @@ public static AutoCraftingResult evaluateAutoCrafting(boolean actuallyCrafting, } } + if (!buildTooltipRenderer) return result; + if (!result.hasApplicable) { errorTooltip.clear(); errorTooltip.add(Tooltip.entry(new TranslatableComponent("error.rei.not.supported.move.items").withStyle(ChatFormatting.RED))); diff --git a/runtime-engine/transfer-handlers/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.AutoCraftingEvaluator b/runtime-engine/transfer-handlers/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.AutoCraftingEvaluator new file mode 100644 index 000000000..53e00b26e --- /dev/null +++ b/runtime-engine/transfer-handlers/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.AutoCraftingEvaluator @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.transfer.AutoCraftingEvaluatorImpl \ No newline at end of file diff --git a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java index 1ba0b9e4f..3483b1ee3 100644 --- a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java +++ b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java @@ -53,7 +53,8 @@ import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryIngredients; import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.client.gui.widget.AutoCraftingEvaluator; +import me.shedaniel.rei.impl.client.ClientInternals; +import me.shedaniel.rei.impl.client.provider.AutoCraftingEvaluator; import me.shedaniel.rei.impl.client.util.CrashReportUtils; import me.shedaniel.rei.impl.client.view.craftable.CraftableFilter; import me.shedaniel.rei.impl.common.InternalLogger; @@ -319,11 +320,11 @@ private static Iterable sortAutoCrafting(List displays) { Set applicableDisplays = new LinkedHashSet<>(); for (Display display : displays) { - AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, null); + AutoCraftingEvaluator.Result result = ClientInternals.getAutoCraftingEvaluator(display).get(); - if (result.successful) { + if (result.isSuccessful()) { successfulDisplays.add(display); - } else if (result.hasApplicable) { + } else if (result.isApplicable()) { applicableDisplays.add(display); } } @@ -451,7 +452,7 @@ public CategoryIdentifier getCategoryIdentifier() { int slotsCraftable = 0; boolean containsNonEmpty = false; List requiredInput = display.getRequiredEntries(); - Long2LongMap invCount = new Long2LongOpenHashMap(info == null ? CraftableFilter.INSTANCE.getInvStacks() : Long2LongMaps.EMPTY_MAP); + Long2LongMap invCount = new Long2LongOpenHashMap(info == null ? CraftableFilter.getInvStacks() : Long2LongMaps.EMPTY_MAP); for (SlotAccessor inputSlot : inputSlots) { ItemStack stack = inputSlot.getItemStack(); diff --git a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/craftable/CraftableFilter.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/craftable/CraftableFilter.java index f004bd0ed..56be8000c 100644 --- a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/craftable/CraftableFilter.java +++ b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/craftable/CraftableFilter.java @@ -32,6 +32,8 @@ import me.shedaniel.rei.api.common.entry.comparison.ComparisonContext; import me.shedaniel.rei.api.common.entry.type.EntryDefinition; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; +import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.impl.client.provider.OverlayTicker; import net.minecraft.client.Minecraft; import net.minecraft.core.NonNullList; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -41,12 +43,16 @@ import java.util.Optional; -public class CraftableFilter { - public static final CraftableFilter INSTANCE = new CraftableFilter(); - private Long2LongMap invStacks = new Long2LongOpenHashMap(); - private Long2LongMap containerStacks = new Long2LongOpenHashMap(); +public class CraftableFilter implements OverlayTicker { + private static Long2LongMap invStacks = new Long2LongOpenHashMap(); + private static Long2LongMap containerStacks = new Long2LongOpenHashMap(); + @Override public void tick() { + if (Minecraft.getInstance().player == null || PluginManager.areAnyReloading() || Minecraft.getInstance().player.tickCount % 5 != 0) { + return; + } + Optional overlay = REIRuntime.getInstance().getOverlay(); if (overlay.isEmpty() || overlay.get().isSearchReloadQueued()) return; if (!ConfigManager.getInstance().isCraftableOnlyEnabled()) return; @@ -57,7 +63,7 @@ public void tick() { throwable.printStackTrace(); currentStacks = Long2LongMaps.EMPTY_MAP; } - if (!currentStacks.equals(this.invStacks)) { + if (!currentStacks.equals(CraftableFilter.invStacks)) { invStacks = currentStacks; overlay.ifPresent(ScreenOverlay::queueReloadSearch); return; @@ -69,18 +75,18 @@ public void tick() { throwable.printStackTrace(); currentStacks = Long2LongMaps.EMPTY_MAP; } - if (!currentStacks.equals(this.containerStacks)) { + if (!currentStacks.equals(CraftableFilter.containerStacks)) { containerStacks = currentStacks; overlay.ifPresent(ScreenOverlay::queueReloadSearch); } } - public Long2LongMap getInvStacks() { + public static Long2LongMap getInvStacks() { return invStacks; } @ApiStatus.Internal - public Long2LongMap getInventoryItemsTypes() { + public static Long2LongMap getInventoryItemsTypes() { EntryDefinition definition; try { definition = VanillaEntryTypes.ITEM.getDefinition(); @@ -99,7 +105,7 @@ public Long2LongMap getInventoryItemsTypes() { } @ApiStatus.Internal - public Long2LongMap getContainerItemsTypes() { + public static Long2LongMap getContainerItemsTypes() { EntryDefinition definition; try { definition = VanillaEntryTypes.ITEM.getDefinition(); diff --git a/runtime-engine/views/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.OverlayTicker b/runtime-engine/views/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.OverlayTicker new file mode 100644 index 000000000..fd16783b5 --- /dev/null +++ b/runtime-engine/views/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.OverlayTicker @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.view.craftable.CraftableFilter \ No newline at end of file diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java index 2a0e46726..c98e0ad5a 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java @@ -50,10 +50,10 @@ import java.util.*; final class BatchedEntryRendererManager extends BatchedSlots implements ForwardingList { - private boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); - private Int2ObjectMap> grouping = new Int2ObjectOpenHashMap<>(); - private List toRender = new ArrayList<>(); - private List delegateList = new DelegatedSlotList(); + private final boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); + private final Int2ObjectMap> grouping = new Int2ObjectOpenHashMap<>(); + private final List toRender = new ArrayList<>(); + private final List delegateList = new DelegatedSlotList(); private int size; public boolean debug; public MutableInt debugSize = new MutableInt(); @@ -125,7 +125,7 @@ public void render(boolean debugTime, MutableInt size, MutableLong time, PoseSta public List groupingsAsList() { return CollectionUtils.concatUnmodifiable((Iterable>) () -> new AbstractIterator<>() { - Iterator> groups = grouping.values().iterator(); + final Iterator> groups = grouping.values().iterator(); @Nullable @Override diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DelegateWidgetWithTranslate.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DelegateWidgetWithTranslate.java index e9f4b1b59..5ccbf70da 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DelegateWidgetWithTranslate.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/DelegateWidgetWithTranslate.java @@ -34,10 +34,10 @@ import java.util.function.Supplier; -final class DelegateWidgetWithTranslate extends DelegateWidget { +class DelegateWidgetWithTranslate extends DelegateWidget { private final Supplier translate; - public DelegateWidgetWithTranslate(WidgetWithBounds widget, Supplier translate) { + DelegateWidgetWithTranslate(WidgetWithBounds widget, Supplier translate) { super(widget); this.translate = translate; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/EntryWidget.java similarity index 70% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/EntryWidget.java index 7b049fdbc..b830b7d59 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/EntryWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.widget.basewidgets; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.systems.RenderSystem; @@ -42,6 +42,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.search.method.InputMethod; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; @@ -54,37 +55,49 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.TextComponent; -import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.function.BiPredicate; +import java.util.function.Function; +import java.util.function.Predicate; import java.util.function.UnaryOperator; import java.util.stream.Collectors; import java.util.stream.Stream; @SuppressWarnings("UnstableApiUsage") -public class EntryWidget extends Slot implements DraggableStackProviderWidget { - @ApiStatus.Internal - public static long stackDisplayOffset = 0; +final class EntryWidget extends Slot implements DraggableStackProviderWidget { + private static long stackDisplayOffset = 0; + private final NumberAnimator darkHighlightedAlpha = ValueAnimator.ofFloat() + .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()); + private final Rectangle bounds; @ApiStatus.Internal - private byte noticeMark = 0; - protected boolean highlight = true; - protected boolean tooltips = true; - protected boolean background = true; - protected boolean interactable = true; - protected boolean interactableFavorites = true; - protected boolean wasClicked = false; - private Rectangle bounds; + private byte noticeMark = Slot.UN_MARKED; + private long cyclingInterval = 1000L; + private Predicate highlight = slot -> true; + private Predicate tooltips = slot -> true; + private Predicate background = slot -> true; + private Predicate interactable = slot -> true; + private Predicate interactableFavorites = slot -> true; + private Function, @Nullable FavoriteEntry> favoriteEntryFunction = stack -> { + FavoriteEntry entry = FavoriteEntry.fromEntryStack(stack.normalize()); + return entry.isInvalid() ? null : entry; + }; + private BiPredicate containsPointFunction = (slot, point) -> { + Rectangle bounds = slot.getBounds(); + return point.x >= bounds.x + 1 && point.y >= bounds.y + 1 && point.x <= bounds.getMaxX() - 1 && point.y <= bounds.getMaxY() - 1; + }; + private boolean wasClicked = false; private List> entryStacks; @Nullable private Set> tooltipProcessors; - public ResourceLocation tagMatch; - public boolean removeTagMatch = true; + @Nullable + private Set actions; - public EntryWidget(Point point) { + EntryWidget(Point point) { this(new Rectangle(point.x - 1, point.y - 1, 18, 18)); } @@ -105,53 +118,81 @@ public void setNoticeMark(byte noticeMark) { @Override public void setInteractable(boolean interactable) { - this.interactable = interactable; - this.interactableFavorites = interactableFavorites && interactable; + this.interactable = slot -> interactable; + this.interactableFavorites = this.interactableFavorites.and(slot -> interactable); } @Override public boolean isInteractable() { - return this.interactable; + return this.interactable.test(this); } @Override public void setInteractableFavorites(boolean interactableFavorites) { - this.interactableFavorites = interactableFavorites && interactable; + this.interactableFavorites = this.interactable.and(slot -> interactableFavorites); } @Override public boolean isInteractableFavorites() { - return interactableFavorites; + return interactableFavorites.test(this); } @Override public boolean isHighlightEnabled() { - return highlight; + return highlight.test(this); } @Override - public void setHighlightEnabled(boolean highlights) { + public void setHighlightEnabled(Predicate highlights) { this.highlight = highlights; } @Override - public void setTooltipsEnabled(boolean tooltipsEnabled) { + public Slot highlightEnabled(Predicate highlight) { + this.highlight = this.highlight.and(highlight); + return this; + } + + @Override + public void setTooltipsEnabled(Predicate tooltipsEnabled) { this.tooltips = tooltipsEnabled; } + @Override + public Slot tooltipsEnabled(Predicate tooltipsEnabled) { + this.tooltips = this.tooltips.and(tooltipsEnabled); + return this; + } + @Override public boolean isTooltipsEnabled() { - return tooltips; + return tooltips.test(this); } @Override - public void setBackgroundEnabled(boolean backgroundEnabled) { + public void setBackgroundEnabled(Predicate backgroundEnabled) { this.background = backgroundEnabled; } + @Override + public Slot backgroundEnabled(Predicate backgroundEnabled) { + this.background = this.background.and(backgroundEnabled); + return this; + } + @Override public boolean isBackgroundEnabled() { - return background; + return background.test(this); + } + + @Override + public void setCyclingInterval(long cyclingInterval) { + this.cyclingInterval = cyclingInterval; + } + + @Override + public long getCyclingInterval() { + return cyclingInterval; } @Override @@ -171,7 +212,6 @@ public EntryWidget entry(EntryStack stack) { } entryStacks.add(stack); } - if (removeTagMatch) tagMatch = null; return this; } @@ -182,7 +222,6 @@ public EntryWidget entries(Collection> stacks) { entryStacks = new ArrayList<>(entryStacks); } entryStacks.addAll(stacks); - if (removeTagMatch) tagMatch = null; } return this; } @@ -194,11 +233,7 @@ public EntryStack getCurrentEntry() { return EntryStack.empty(); if (size == 1) return entryStacks.get(0); - return entryStacks.get(Mth.floor(((System.currentTimeMillis() + stackDisplayOffset) / getCyclingInterval() % (double) size))); - } - - protected long getCyclingInterval() { - return 1000; + return entryStacks.get(Mth.floor(((System.currentTimeMillis() + stackDisplayOffset) / cyclingInterval % (double) size))); } @Override @@ -221,11 +256,11 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { drawBackground(matrices, mouseX, mouseY, delta); drawCurrentEntry(matrices, mouseX, mouseY, delta); - boolean highlighted = containsMouse(mouseX, mouseY); - if (isTooltipsEnabled() && highlighted) { + boolean hovered = containsMouse(mouseX, mouseY); + if (isTooltipsEnabled() && hovered) { queueTooltip(matrices, mouseX, mouseY, delta); } - if (isHighlightEnabled() && highlighted) { + if (isHighlightEnabled() && hovered) { drawHighlighted(matrices, mouseX, mouseY, delta); } drawExtra(matrices, mouseX, mouseY, delta); @@ -237,30 +272,34 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { @Override public void drawBackground(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (background) { - darkBackgroundAlpha.update(delta); - RenderSystem.enableBlend(); - RenderSystem.blendFuncSeparate(770, 771, 1, 0); - RenderSystem.blendFunc(770, 771); - RenderSystem.setShaderTexture(0, InternalTextures.CHEST_GUI_TEXTURE); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - blit(matrices, bounds.x, bounds.y, 0, 222, bounds.width, bounds.height); - if (darkBackgroundAlpha.value() > 0.0F) { - RenderSystem.setShaderTexture(0, InternalTextures.CHEST_GUI_TEXTURE_DARK); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, darkBackgroundAlpha.value()); - blit(matrices, bounds.x, bounds.y, 0, 222, bounds.width, bounds.height); + if (isBackgroundEnabled()) { + if (bounds.width == 16 && bounds.height == 16) { + darkBackgroundAlpha.update(delta); + RenderSystem.enableBlend(); + RenderSystem.blendFuncSeparate(770, 771, 1, 0); + RenderSystem.blendFunc(770, 771); + RenderSystem.setShaderTexture(0, InternalTextures.CHEST_GUI_TEXTURE); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + blit(matrices, bounds.x, bounds.y, 0, 222, bounds.width, bounds.height); + if (darkBackgroundAlpha.value() > 0.0F) { + RenderSystem.setShaderTexture(0, InternalTextures.CHEST_GUI_TEXTURE_DARK); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, darkBackgroundAlpha.value()); + blit(matrices, bounds.x, bounds.y, 0, 222, bounds.width, bounds.height); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + } + } else { + Widgets.createSlotBase(bounds).render(matrices, mouseX, mouseY, delta); } } } - protected void drawCurrentEntry(PoseStack matrices, int mouseX, int mouseY, float delta) { + private void drawCurrentEntry(PoseStack matrices, int mouseX, int mouseY, float delta) { EntryStack entry = getCurrentEntry(); entry.setZ(100); entry.render(matrices, getInnerBounds(), mouseX, mouseY, delta); } - protected void queueTooltip(PoseStack matrices, int mouseX, int mouseY, float delta) { + private void queueTooltip(PoseStack matrices, int mouseX, int mouseY, float delta) { Tooltip tooltip = getCurrentTooltip(TooltipContext.ofMouse()); if (tooltip != null) { tooltip.queue(); @@ -276,14 +315,15 @@ public Tooltip getCurrentTooltip(TooltipContext context) { Tooltip tooltip = getCurrentEntry().getTooltip(context); if (tooltip != null) { - if (interactableFavorites && ConfigObject.getInstance().doDisplayFavoritesTooltip() && !ConfigObject.getInstance().getFavoriteKeyCode().isUnknown()) { + if (isInteractableFavorites() && ConfigObject.getInstance().doDisplayFavoritesTooltip() && !ConfigObject.getInstance().getFavoriteKeyCode().isUnknown()) { String name = ConfigObject.getInstance().getFavoriteKeyCode().getLocalizedName().getString(); - if (reverseFavoritesAction()) + if (isFavorites()) { tooltip.addAllTexts(Stream.of(I18n.get("text.rei.remove_favorites_tooltip", name).split("\n")) .map(TextComponent::new).collect(Collectors.toList())); - else + } else { tooltip.addAllTexts(Stream.of(I18n.get("text.rei.favorites_tooltip", name).split("\n")) .map(TextComponent::new).collect(Collectors.toList())); + } } if (tooltipProcessors != null) { @@ -309,10 +349,6 @@ public Tooltip getCurrentTooltip(TooltipContext context) { return tooltip; } - private final NumberAnimator darkHighlightedAlpha = ValueAnimator.ofFloat() - .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) - .asFloat(); - @Override public void drawHighlighted(PoseStack matrices, int mouseX, int mouseY, float delta) { darkHighlightedAlpha.update(delta); @@ -331,7 +367,7 @@ public List children() { return Collections.emptyList(); } - protected boolean wasClicked() { + private boolean wasClicked() { boolean wasClicked = this.wasClicked; this.wasClicked = false; return wasClicked; @@ -341,18 +377,42 @@ protected boolean wasClicked() { public void tooltipProcessor(UnaryOperator operator) { if (tooltipProcessors == null) { tooltipProcessors = Collections.singleton(operator); - } else { + } else if (!tooltipProcessors.contains(operator)) { if (!(tooltipProcessors instanceof LinkedHashSet)) { tooltipProcessors = new LinkedHashSet<>(tooltipProcessors); } tooltipProcessors.add(operator); + } else if (tooltipProcessors.size() == 1) { + tooltipProcessors = Collections.singleton(operator); + } else { + tooltipProcessors.remove(operator); + tooltipProcessors.add(operator); + } + } + + @Override + public void action(ActionPredicate predicate) { + if (actions == null) { + actions = Collections.singleton(predicate); + } else if (!actions.contains(predicate)) { + if (!(actions instanceof LinkedHashSet)) { + actions = new LinkedHashSet<>(actions); + } + actions.add(predicate); + } else if (actions.size() == 1) { + actions = Collections.singleton(predicate); + } else { + actions.remove(predicate); + actions.add(predicate); } } @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { - if (containsMouse(mouseX, mouseY)) + if (containsMouse(mouseX, mouseY)) { this.wasClicked = true; + } + return super.mouseClicked(mouseX, mouseY, button); } @@ -372,23 +432,29 @@ public boolean mouseScrolled(double mouseX, double mouseY, double amount) { @Override public boolean mouseReleased(double mouseX, double mouseY, int button) { - if (!interactable) + if (!isInteractable()) return false; if (wasClicked() && containsMouse(mouseX, mouseY)) { - if (doAction(mouseX, mouseY, button)) { - return true; - } + return doAction(mouseX, mouseY, button); } return false; } - protected boolean doAction(double mouseX, double mouseY, int button) { - if (interactableFavorites && ConfigObject.getInstance().isFavoritesEnabled() && !getCurrentEntry().isEmpty()) { + private boolean doAction(double mouseX, double mouseY, int button) { + if (actions != null) { + for (ActionPredicate action : actions) { + if (action.doMouse(this, mouseX, mouseY, button)) { + return true; + } + } + } + + if (isInteractableFavorites() && ConfigObject.getInstance().isFavoritesEnabled() && !getCurrentEntry().isEmpty()) { ModifierKeyCode keyCode = ConfigObject.getInstance().getFavoriteKeyCode(); if (keyCode.matchesMouse(button)) { FavoriteEntry favoriteEntry = asFavoriteEntry(); if (favoriteEntry != null) { - if (reverseFavoritesAction()) { + if (isFavorites()) { ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); } else { ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); @@ -406,25 +472,39 @@ else if ((ConfigObject.getInstance().getUsageKeybind().getType() != InputConstan return false; } - @ApiStatus.Internal - @Nullable - protected FavoriteEntry asFavoriteEntry() { - FavoriteEntry entry = FavoriteEntry.fromEntryStack(getCurrentEntry().normalize()); - return entry.isInvalid() ? null : entry; + @Override + public void setFavoriteEntryFunction(Function, FavoriteEntry> function) { + this.favoriteEntryFunction = function; + } + + @Override + public Function, FavoriteEntry> getFavoriteEntryFunction() { + return favoriteEntryFunction; + } + + @Override + public void setContainsPointFunction(BiPredicate containsPointFunction) { + this.containsPointFunction = containsPointFunction; + } + + @Override + public void appendContainsPointFunction(BiPredicate function) { + containsPointFunction = containsPointFunction.and(function); } @ApiStatus.Internal - public boolean cancelDeleteItems(EntryStack stack) { - return false; + @Nullable + private FavoriteEntry asFavoriteEntry() { + return favoriteEntryFunction.apply(getCurrentEntry()); } - protected boolean reverseFavoritesAction() { - return false; + private boolean isFavorites() { + return noticeMark == Slot.FAVORITE; } @Override public boolean containsMouse(double mouseX, double mouseY) { - return mouseX >= bounds.x + 1 && mouseY >= bounds.y + 1 && mouseX <= bounds.getMaxX() - 1 && mouseY <= bounds.getMaxY() - 1; + return containsPointFunction.test(this, new Point(mouseX, mouseY)); } @Override @@ -437,13 +517,21 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { } public boolean keyPressedIgnoreContains(int keyCode, int scanCode, int modifiers) { - if (!interactable) return false; + if (!isInteractable()) return false; - if (interactableFavorites && ConfigObject.getInstance().isFavoritesEnabled() && !getCurrentEntry().isEmpty()) { + if (actions != null) { + for (ActionPredicate action : actions) { + if (action.doKey(this, keyCode, scanCode, modifiers)) { + return true; + } + } + } + + if (isInteractableFavorites() && ConfigObject.getInstance().isFavoritesEnabled() && !getCurrentEntry().isEmpty()) { if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { FavoriteEntry favoriteEntry = asFavoriteEntry(); if (favoriteEntry != null) { - if (reverseFavoritesAction()) { + if (isFavorites()) { ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); } else { ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); @@ -452,10 +540,12 @@ public boolean keyPressedIgnoreContains(int keyCode, int scanCode, int modifiers } } } + if (ConfigObject.getInstance().getRecipeKeybind().matchesKey(keyCode, scanCode)) return ViewSearchBuilder.builder().addRecipesFor(getCurrentEntry()).open(); else if (ConfigObject.getInstance().getUsageKeybind().matchesKey(keyCode, scanCode)) return ViewSearchBuilder.builder().addUsagesFor(getCurrentEntry()).open(); + return false; } @@ -464,7 +554,7 @@ else if (ConfigObject.getInstance().getUsageKeybind().matchesKey(keyCode, scanCo public DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) { if (!getCurrentEntry().isEmpty() && containsMouse(mouseX, mouseY)) { return new DraggableStack() { - EntryStack stack = getCurrentEntry().copy() + final EntryStack stack = getCurrentEntry().copy() .removeSetting(EntryStack.Settings.RENDERER) .removeSetting(EntryStack.Settings.FLUID_RENDER_RATIO); diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ForwardingList.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ForwardingList.java index 5e3093bf8..2d8c2d3d3 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ForwardingList.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ForwardingList.java @@ -104,16 +104,6 @@ default void clear() { delegate().clear(); } - @Override - default boolean equals(Object o) { - return delegate().equals(o); - } - - @Override - default int hashCode() { - return delegate().hashCode(); - } - @Override default E get(int index) { return delegate().get(index); diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/OverflowWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/OverflowWidget.java index 998a905f5..e2102cc10 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/OverflowWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/OverflowWidget.java @@ -30,10 +30,10 @@ import me.shedaniel.clothconfig2.api.scroll.ScrollingContainer; import me.shedaniel.math.FloatingPoint; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; import me.shedaniel.rei.api.client.gui.widgets.CloseableScissors; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; +import me.shedaniel.rei.impl.client.gui.InternalCursorState; @SuppressWarnings("UnstableApiUsage") final class OverflowWidget extends DelegateWidgetWithTranslate { @@ -43,7 +43,7 @@ final class OverflowWidget extends DelegateWidgetWithTranslate { private final ValueAnimator velocity; private boolean dragging; - public OverflowWidget(Rectangle bounds, WidgetWithBounds widget) { + OverflowWidget(Rectangle bounds, WidgetWithBounds widget) { super(widget, Matrix4f::new); this.bounds = bounds; this.scale = ValueAnimator.ofFloat() @@ -78,7 +78,7 @@ public void render(PoseStack poseStack, int mouseX, int mouseY, float delta) { widgetBounds.height - getBounds().height * scale.value(), delta, .0001) - (widgetBounds.height - getBounds().height / 2 * scale.value()) )); } - if (!RoughlyEnoughItemsCoreClient.isLeftMousePressed) { + if (!InternalCursorState.isLeftMousePressed) { this.translate.setAs(new FloatingPoint(this.translate.value().x + this.velocity.value().x, this.translate.value().y + this.velocity.value().y)); } this.velocity.update(delta); diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedCenterWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedCenterWidget.java index 29263c9ac..3a532edac 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedCenterWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedCenterWidget.java @@ -30,7 +30,7 @@ final class PaddedCenterWidget extends DelegateWidgetWithTranslate { private final Rectangle bounds; - public PaddedCenterWidget(Rectangle bounds, WidgetWithBounds widget) { + PaddedCenterWidget(Rectangle bounds, WidgetWithBounds widget) { super(widget, Matrix4f::new); this.bounds = bounds; } diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedWidget.java index 9f8fb6186..76fdd91b4 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PaddedWidget.java @@ -30,7 +30,7 @@ final class PaddedWidget extends DelegateWidgetWithTranslate { private final int padLeft, padRight, padTop, padBottom; - public PaddedWidget(int padLeft, int padRight, int padTop, int padBottom, WidgetWithBounds widget) { + PaddedWidget(int padLeft, int padRight, int padTop, int padBottom, WidgetWithBounds widget) { super(widget, Matrix4f::new); this.padLeft = padLeft; this.padRight = padRight; diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java index 1948d9abf..c71d9fd83 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java @@ -47,19 +47,19 @@ @ApiStatus.Internal final class TextFieldWidget extends WidgetWithBounds implements TextField { - protected Function textTransformer = SharedConstants::filterText; - protected int frame; - protected boolean editable = true; - protected int firstCharacterIndex; - protected int cursorPos; - protected int highlightPos; - protected int editableColor = 0xe0e0e0; - protected int notEditableColor = 0x707070; - protected TextFormatter formatter = TextFormatter.DEFAULT; - protected SuggestionRenderer suggestionRenderer = (matrices, x, y, color) -> + private final Rectangle bounds; + private Function textTransformer = SharedConstants::filterText; + private int frame; + private boolean editable = true; + private int firstCharacterIndex; + private int cursorPos; + private int highlightPos; + private int editableColor = 0xe0e0e0; + private int notEditableColor = 0x707070; + private TextFormatter formatter = TextFormatter.DEFAULT; + private SuggestionRenderer suggestionRenderer = (matrices, x, y, color) -> this.font.drawShadow(matrices, this.font.plainSubstrByWidth(this.suggestion, this.getWidth()), x, y, color); - protected BorderColorProvider borderColorProvider = BorderColorProvider.DEFAULT; - private Rectangle bounds; + private BorderColorProvider borderColorProvider = BorderColorProvider.DEFAULT; private String text = ""; private int maxLength = 32; private boolean hasBorder = true; @@ -72,7 +72,7 @@ final class TextFieldWidget extends WidgetWithBounds implements TextField { private BooleanConsumer focusedResponder = bool -> {}; private Predicate filter = s -> true; - public TextFieldWidget(Rectangle bounds) { + TextFieldWidget(Rectangle bounds) { this.bounds = bounds; } @@ -120,11 +120,21 @@ public void setFormatter(TextFormatter formatter) { this.formatter = formatter; } + @Override + public TextFormatter getFormatter() { + return formatter; + } + @Override public void setSuggestionRenderer(SuggestionRenderer suggestionRenderer) { this.suggestionRenderer = suggestionRenderer; } + @Override + public SuggestionRenderer getSuggestionRenderer() { + return suggestionRenderer; + } + @Override public void tick() { this.frame++; @@ -472,11 +482,11 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { } } - protected void renderSuggestion(PoseStack matrices, int x, int y) { + private void renderSuggestion(PoseStack matrices, int x, int y) { this.suggestionRenderer.renderSuggestion(matrices, x, y, -8355712); } - protected void renderSelection(PoseStack matrices, int x1, int y1, int x2, int y2, int color) { + private void renderSelection(PoseStack matrices, int x1, int y1, int x2, int y2, int color) { int tmp; if (x1 < x2) { tmp = x1; diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java index 2c8abbdb7..435bdc722 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java @@ -51,6 +51,7 @@ import me.shedaniel.rei.api.common.util.ImmutableTextComponent; import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.client.REIRuntimeImpl; +import me.shedaniel.rei.impl.client.gui.InternalCursorState; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.widget.CatchingExceptionUtils; import me.shedaniel.rei.impl.client.gui.widget.TooltipImpl; @@ -94,8 +95,6 @@ @Environment(EnvType.CLIENT) public class RoughlyEnoughItemsCoreClient { - public static boolean isLeftMousePressed = false; - public static void attachClientInternals() { CatchingExceptionUtils.attach(); ClientInternals.attachInstance((Function>) (object) -> { @@ -260,7 +259,8 @@ private void registerEvents() { } }); ClientScreenInputEvent.MOUSE_CLICKED_PRE.register((minecraftClient, screen, mouseX, mouseY, button) -> { - isLeftMousePressed = true; + if (button == 0) InternalCursorState.isLeftMousePressed = true; + if (button == 1) InternalCursorState.isRightMousePressed = true; if (shouldReturn(screen) || screen instanceof DisplayScreen) return EventResult.pass(); resetFocused(screen); @@ -274,7 +274,8 @@ private void registerEvents() { return EventResult.pass(); }); ClientScreenInputEvent.MOUSE_RELEASED_PRE.register((minecraftClient, screen, mouseX, mouseY, button) -> { - isLeftMousePressed = false; + if (button == 0) InternalCursorState.isLeftMousePressed = false; + if (button == 1) InternalCursorState.isRightMousePressed = false; if (shouldReturn(screen) || screen instanceof DisplayScreen) return EventResult.pass(); resetFocused(screen); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java index 5cff0c22d..88f2d8bdd 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java @@ -48,6 +48,7 @@ import me.shedaniel.rei.impl.client.gui.hints.HintProvider; import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; +import me.shedaniel.rei.impl.client.provider.OverlayTicker; import me.shedaniel.rei.impl.common.Internals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -274,7 +275,9 @@ public void onInitializeClient() { ClientTickEvent.CLIENT_POST.register(minecraft -> { if (isOverlayVisible() && REIRuntime.getInstance().getOverlay().isPresent()) { REIRuntime.getInstance().getSearchTextField().tick(); - ScreenOverlayImpl.getInstance().tick(); + for (OverlayTicker ticker : ClientInternals.getOverlayTickers()) { + ticker.tick(); + } } }); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java index 3f8fb9be9..1943ad379 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java @@ -23,37 +23,17 @@ package me.shedaniel.rei.impl.client.gui; -import com.google.common.collect.Lists; import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; -import me.shedaniel.rei.api.client.favorites.FavoriteEntry; -import me.shedaniel.rei.api.client.gui.config.DisplayPanelLocation; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; -import me.shedaniel.rei.api.client.gui.drag.DraggingContext; -import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentProvider; -import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentVisitor; import me.shedaniel.rei.api.client.gui.widgets.TextField; -import me.shedaniel.rei.api.client.gui.widgets.Tooltip; -import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.overlay.OverlayListWidget; -import me.shedaniel.rei.api.client.overlay.ScreenOverlay; -import me.shedaniel.rei.api.client.registry.screen.ClickArea; -import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; -import me.shedaniel.rei.api.client.view.ViewSearchBuilder; -import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.plugins.PluginManager; -import me.shedaniel.rei.impl.client.gui.craftable.CraftableFilter; -import me.shedaniel.rei.impl.client.gui.dragging.CurrentDraggingStack; -import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; -import me.shedaniel.rei.impl.client.gui.menu.MenuAccessImpl; -import me.shedaniel.rei.impl.client.gui.widget.*; +import me.shedaniel.rei.impl.client.gui.overlay.AbstractScreenOverlay; +import me.shedaniel.rei.impl.client.gui.widget.ConfigButtonWidget; +import me.shedaniel.rei.impl.client.gui.widget.CraftableFilterButtonWidget; import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget; import me.shedaniel.rei.impl.client.gui.widget.entrylist.PaginatedEntryListWidget; import me.shedaniel.rei.impl.client.gui.widget.entrylist.ScrolledEntryListWidget; @@ -61,137 +41,54 @@ import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.network.chat.Component; -import net.minecraft.world.InteractionResult; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -import java.util.List; import java.util.Objects; import java.util.Optional; -import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; - @ApiStatus.Internal -public abstract class ScreenOverlayImpl extends ScreenOverlay { - private static EntryListWidget entryListWidget = null; - private static FavoritesListWidget favoritesListWidget = null; - private static OverlaySearchField searchField = null; - private final List widgets = Lists.newLinkedList(); - public boolean shouldReload = false; - public boolean shouldReloadSearch = false; - private Rectangle bounds; - private Widget configButton; - private CurrentDraggingStack draggingStack = new CurrentDraggingStack(); - @Nullable - public DefaultDisplayChoosePageWidget choosePageWidget; - private MenuAccessImpl menuAccess = new MenuAccessImpl(); +public abstract class ScreenOverlayImpl extends AbstractScreenOverlay { + private EntryListWidget entryListWidget = null; + private FavoritesListWidget favoritesListWidget = null; + private OverlaySearchField searchField = null; public static EntryListWidget getEntryListWidget() { - boolean widgetScrolled = ConfigObject.getInstance().isEntryListWidgetScrolled(); - - if (entryListWidget != null) { - if (widgetScrolled && entryListWidget instanceof ScrolledEntryListWidget) { - return entryListWidget; - } else if (!widgetScrolled && entryListWidget instanceof PaginatedEntryListWidget) { - return entryListWidget; - } - } - - entryListWidget = widgetScrolled ? new ScrolledEntryListWidget() : new PaginatedEntryListWidget(); - - ScreenOverlayImpl overlay = ScreenOverlayImpl.getInstance(); - Rectangle overlayBounds = overlay.bounds; - entryListWidget.updateArea(Objects.requireNonNullElse(overlayBounds, new Rectangle()), overlay.getSearchField().getText()); - entryListWidget.updateEntriesPosition(); - - return entryListWidget; + return getInstance().getEntryList(); } @Nullable public static FavoritesListWidget getFavoritesListWidget() { - return favoritesListWidget; + return getInstance().getFavoritesListNullable(); } public static ScreenOverlayImpl getInstance() { return (ScreenOverlayImpl) REIRuntime.getInstance().getOverlay().get(); } - public void tick() { - if (searchField != null) { - if (Minecraft.getInstance().player != null && !PluginManager.areAnyReloading() && Minecraft.getInstance().player.tickCount % 5 == 0) { - CraftableFilter.INSTANCE.tick(); - } - } - } - @Override - public void queueReloadOverlay() { - shouldReload = true; - } - - @Override - public void queueReloadSearch() { - shouldReloadSearch = true; - } - - @Override - public boolean isOverlayReloadQueued() { - return shouldReload; - } - - @Override - public boolean isSearchReloadQueued() { - return shouldReloadSearch || shouldReload; - } - - @Override - public DraggingContext getDraggingContext() { - return draggingStack; - } - - protected boolean hasSpace() { - return !this.bounds.isEmpty(); - } - public void init() { - this.draggingStack.set(DraggableComponentProvider.from(ScreenRegistry.getInstance()::getDraggableComponentProviders), - DraggableComponentVisitor.from(ScreenRegistry.getInstance()::getDraggableComponentVisitors)); + super.init(); - this.shouldReload = false; - this.shouldReloadSearch = false; - this.children().clear(); - this.bounds = calculateOverlayBounds(); - - if (choosePageWidget != null) { - this.widgets.add(choosePageWidget); - } + TextField searchField = getSearchField(); + searchField.asWidget().getBounds().setBounds(getSearchFieldArea()); + this.children().add(searchField.asWidget()); if (ConfigObject.getInstance().isFavoritesEnabled()) { - if (favoritesListWidget == null) { - favoritesListWidget = new FavoritesListWidget(); - } - favoritesListWidget.favoritePanel.resetRows(); - this.widgets.add(favoritesListWidget); + getFavoritesListWidget().favoritePanel.resetRows(); + this.children().add(getFavoritesListWidget()); } - TextField searchField = getSearchField(); - searchField.asWidget().getBounds().setBounds(getSearchFieldArea()); - this.widgets.add(searchField.asWidget()); - EntryListWidget entryListWidget = getEntryListWidget(); - entryListWidget.updateArea(this.bounds, searchField.getText()); - this.widgets.add(entryListWidget); + entryListWidget.updateArea(this.getBounds(), searchField.getText()); + this.children().add(entryListWidget); searchField.setResponder(s -> entryListWidget.updateSearch(s, false)); entryListWidget.init(this); - this.widgets.add(configButton = ConfigButtonWidget.create(this)); + this.children().add(ConfigButtonWidget.create(this)); if (ConfigObject.getInstance().isCraftableFilterEnabled()) { - this.widgets.add(CraftableFilterButtonWidget.create(this)); + this.children().add(CraftableFilterButtonWidget.create(this)); } - - this.widgets.add(draggingStack); } private Rectangle getSearchFieldArea() { @@ -207,12 +104,12 @@ private Rectangle getSearchFieldArea() { } private Rectangle getTopSideSearchFieldArea(int widthRemoved) { - return new Rectangle(bounds.x + 2, 4, bounds.width - 6 - widthRemoved, 18); + return new Rectangle(getBounds().x + 2, 4, getBounds().width - 6 - widthRemoved, 18); } private Rectangle getBottomSideSearchFieldArea(int widthRemoved) { Window window = Minecraft.getInstance().getWindow(); - return new Rectangle(bounds.x + 2, window.getGuiScaledHeight() - 22, bounds.width - 6 - widthRemoved, 18); + return new Rectangle(getBounds().x + 2, window.getGuiScaledHeight() - 22, getBounds().width - 6 - widthRemoved, 18); } private Rectangle getCenterSearchFieldArea(int widthRemoved) { @@ -222,179 +119,15 @@ private Rectangle getCenterSearchFieldArea(int widthRemoved) { } @Override - public Rectangle getBounds() { - return bounds; - } - - @Override - public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (shouldReload || !calculateOverlayBounds().equals(bounds)) { - init(); - getEntryListWidget().updateSearch(REIRuntime.getInstance().getSearchTextField().getText(), true); - } else { - for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(minecraft.screen)) { - if (decider != null && decider.shouldRecalculateArea(ConfigObject.getInstance().getDisplayPanelLocation(), bounds)) { - init(); - break; - } - } - } - if (shouldReloadSearch) { - shouldReloadSearch = false; - getEntryListWidget().updateSearch(getSearchField().getText(), true); - } - if (OverlaySearchField.isHighlighting) { - EntryHighlighter.render(matrices); - } - if (!hasSpace()) return; - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); - this.renderWidgets(matrices, mouseX, mouseY, delta); - if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { - Screen screen = Minecraft.getInstance().screen; - ClickArea.ClickAreaContext context = createClickAreaContext(mouseX, mouseY, screen); - List clickAreaTooltips = ScreenRegistry.getInstance().getClickAreaTooltips((Class) screen.getClass(), context); - if (clickAreaTooltips != null && !clickAreaTooltips.isEmpty()) { - Tooltip.create(clickAreaTooltips).queue(); - } - } - } - - private ClickArea.ClickAreaContext createClickAreaContext(double mouseX, double mouseY, Screen screen) { - return new ClickArea.ClickAreaContext<>() { - @Override - public Screen getScreen() { - return screen; - } - - @Override - public Point getMousePosition() { - return new Point(mouseX, mouseY); - } - }; - } - - private static Rectangle calculateOverlayBounds() { - Rectangle bounds = ScreenRegistry.getInstance().getOverlayBounds(ConfigObject.getInstance().getDisplayPanelLocation(), Minecraft.getInstance().screen); - - int widthReduction = (int) Math.round(bounds.width * (1 - ConfigObject.getInstance().getHorizontalEntriesBoundariesPercentage())); - if (ConfigObject.getInstance().getDisplayPanelLocation() == DisplayPanelLocation.RIGHT) - bounds.x += widthReduction; - bounds.width -= widthReduction; - int maxWidth = (int) Math.ceil(entrySize() * ConfigObject.getInstance().getHorizontalEntriesBoundariesColumns() + entrySize() * 0.75); - if (bounds.width > maxWidth) { - if (ConfigObject.getInstance().getDisplayPanelLocation() == DisplayPanelLocation.RIGHT) - bounds.x += bounds.width - maxWidth; - bounds.width = maxWidth; - } - - return bounds; - } - - public void lateRender(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (REIRuntime.getInstance().isOverlayVisible() && hasSpace()) { - getSearchField().laterRender(matrices, mouseX, mouseY, delta); - for (Widget widget : widgets) { - if (widget instanceof LateRenderable && widget != menuAccess.widget()) - widget.render(matrices, mouseX, mouseY, delta); - } - matrices.pushPose(); - matrices.translate(0, 0, 500); - menuAccess.lateRender(matrices, mouseX, mouseY, delta); - matrices.popPose(); - if (choosePageWidget != null) { - setBlitOffset(500); - Window window = Minecraft.getInstance().getWindow(); - this.fillGradient(matrices, 0, 0, window.getGuiScaledWidth(), window.getGuiScaledHeight(), -1072689136, -804253680); - setBlitOffset(0); - choosePageWidget.render(matrices, mouseX, mouseY, delta); - } - } - if (choosePageWidget == null) { - Tooltip tooltip = TooltipQueue.get(); - - if (tooltip != null) { - renderTooltip(matrices, tooltip); - } - } - - REIRuntime.getInstance().clearTooltips(); - if (REIRuntime.getInstance().isOverlayVisible()) { - menuAccess.afterRender(); - } - } - - @Override - public void renderTooltip(PoseStack matrices, Tooltip tooltip) { - renderTooltipInner(minecraft.screen, matrices, tooltip, tooltip.getX(), tooltip.getY()); - } - - protected abstract void renderTooltipInner(Screen screen, PoseStack matrices, Tooltip tooltip, int mouseX, int mouseY); - - public void renderWidgets(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (!REIRuntime.getInstance().isOverlayVisible()) - return; - for (Widget widget : widgets) { - if (!(widget instanceof LateRenderable)) - widget.render(matrices, mouseX, mouseY, delta); - } - } - - @Override - public boolean mouseScrolled(double mouseX, double mouseY, double amount) { - if (!REIRuntime.getInstance().isOverlayVisible()) - return false; - if (menuAccess.mouseScrolled(mouseX, mouseY, amount)) - return true; - if (isInside(mouseX, mouseY) && getEntryListWidget().mouseScrolled(mouseX, mouseY, amount)) { - return true; - } - if (isNotInExclusionZones(PointHelper.getMouseX(), PointHelper.getMouseY())) { - if (favoritesListWidget != null && favoritesListWidget.mouseScrolled(mouseX, mouseY, amount)) - return true; - } - for (Widget widget : widgets) - if (widget != getEntryListWidget() && (favoritesListWidget == null || widget != favoritesListWidget) - && widget != menuAccess.widget() - && widget.mouseScrolled(mouseX, mouseY, amount)) - return true; - return false; + protected void updateSearch() { + getEntryListWidget().updateSearch(getSearchField().getText(), true); } @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (super.keyPressed(keyCode, scanCode, modifiers)) return true; if (!hasSpace()) return false; - if (REIRuntime.getInstance().isOverlayVisible()) { - if (keyCode == 256 && choosePageWidget != null) { - choosePageWidget = null; - return true; - } - if (choosePageWidget != null) - return choosePageWidget.keyPressed(keyCode, scanCode, modifiers); - if (getSearchField().keyPressed(keyCode, scanCode, modifiers)) - return true; - for (GuiEventListener listener : widgets) - if (listener != getSearchField() && listener.keyPressed(keyCode, scanCode, modifiers)) - return true; - } - if (ConfigObject.getInstance().getHideKeybind().matchesKey(keyCode, scanCode)) { - REIRuntime.getInstance().toggleOverlayVisible(); - return true; - } - EntryStack stack = ScreenRegistry.getInstance().getFocusedStack(Minecraft.getInstance().screen, PointHelper.ofMouse()); - if (stack != null && !stack.isEmpty()) { - stack = stack.copy(); - if (ConfigObject.getInstance().getRecipeKeybind().matchesKey(keyCode, scanCode)) { - return ViewSearchBuilder.builder().addRecipesFor(stack).open(); - } else if (ConfigObject.getInstance().getUsageKeybind().matchesKey(keyCode, scanCode)) { - return ViewSearchBuilder.builder().addUsagesFor(stack).open(); - } else if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { - FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); - ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); - return true; - } - } - if (!REIRuntime.getInstance().isOverlayVisible()) - return false; + if (!REIRuntime.getInstance().isOverlayVisible()) return false; if (ConfigObject.getInstance().getFocusSearchFieldKeybind().matchesKey(keyCode, scanCode)) { getSearchField().setFocused(true); setFocused(getSearchField()); @@ -405,108 +138,11 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { return false; } - @Override - public boolean keyReleased(int keyCode, int scanCode, int modifiers) { - if (!hasSpace()) return false; - if (REIRuntime.getInstance().isOverlayVisible()) { - if (choosePageWidget == null) { - if (getSearchField().keyReleased(keyCode, scanCode, modifiers)) - return true; - for (GuiEventListener listener : widgets) - if (listener != getSearchField() && listener == getFocused() && listener.keyPressed(keyCode, scanCode, modifiers)) - return true; - } - } - return false; - } - - @Override - public boolean charTyped(char character, int modifiers) { - if (!REIRuntime.getInstance().isOverlayVisible()) - return false; - if (!hasSpace()) return false; - if (choosePageWidget != null) { - return choosePageWidget.charTyped(character, modifiers); - } - if (getSearchField().charTyped(character, modifiers)) - return true; - for (GuiEventListener listener : widgets) - if (listener != getSearchField() && listener.charTyped(character, modifiers)) - return true; - return false; - } - - @Override - public List children() { - return widgets; - } - @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (super.mouseClicked(mouseX, mouseY, button)) return true; boolean visible = REIRuntime.getInstance().isOverlayVisible(); - if (choosePageWidget != null) { - if (choosePageWidget.containsMouse(mouseX, mouseY)) { - return choosePageWidget.mouseClicked(mouseX, mouseY, button); - } else { - choosePageWidget = null; - init(); - return false; - } - } - if (!hasSpace()) return false; - if (visible && configButton.mouseClicked(mouseX, mouseY, button)) { - this.setFocused(configButton); - if (button == 0) - this.setDragging(true); - return true; - } - if (ConfigObject.getInstance().getHideKeybind().matchesMouse(button)) { - REIRuntime.getInstance().toggleOverlayVisible(); - return REIRuntime.getInstance().isOverlayVisible(); - } - EntryStack stack = ScreenRegistry.getInstance().getFocusedStack(Minecraft.getInstance().screen, PointHelper.ofMouse()); - if (stack != null && !stack.isEmpty()) { - stack = stack.copy(); - if (ConfigObject.getInstance().getRecipeKeybind().matchesMouse(button)) { - return ViewSearchBuilder.builder().addRecipesFor(stack).open(); - } else if (ConfigObject.getInstance().getUsageKeybind().matchesMouse(button)) { - return ViewSearchBuilder.builder().addUsagesFor(stack).open(); - } else if (visible && ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { - FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); - ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); - return true; - } - } - if (visible) { - Widget menuWidget = menuAccess.widget(); - if (menuWidget != null && menuWidget.mouseClicked(mouseX, mouseY, button)) { - this.setFocused(menuWidget); - if (button == 0) - this.setDragging(true); - getSearchField().setFocused(false); - return true; - } - } - if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { - Screen screen = Minecraft.getInstance().screen; - ClickArea.ClickAreaContext context = createClickAreaContext(mouseX, mouseY, screen); - if (ScreenRegistry.getInstance().executeClickArea((Class) screen.getClass(), context)) { - return true; - } - } - if (!visible) { - return false; - } - for (GuiEventListener element : widgets) { - if (element != configButton && element != menuAccess.widget() && element.mouseClicked(mouseX, mouseY, button)) { - this.setFocused(element); - if (button == 0) - this.setDragging(true); - if (!(element instanceof OverlaySearchField)) - getSearchField().setFocused(false); - return true; - } - } + if (!hasSpace() || !visible) return false; if (ConfigObject.getInstance().getFocusSearchFieldKeybind().matchesMouse(button)) { getSearchField().setFocused(true); setFocused(getSearchField().asWidget()); @@ -518,53 +154,47 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { } @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { - if (!REIRuntime.getInstance().isOverlayVisible()) - return false; - if (!hasSpace()) return false; - if (choosePageWidget != null) { - return choosePageWidget.mouseDragged(mouseX, mouseY, button, deltaX, deltaY); - } - return (this.getFocused() != null && this.isDragging() && button == 0) && this.getFocused().mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + public void setFocused(@Nullable GuiEventListener focused) { + super.setFocused(focused); + getSearchField().setFocused(focused == getSearchField().asWidget()); } @Override - public GuiEventListener getFocused() { - if (choosePageWidget != null) - return choosePageWidget; - return super.getFocused(); - } - - public boolean isInside(double mouseX, double mouseY) { - return bounds.contains(mouseX, mouseY) && isNotInExclusionZones(mouseX, mouseY); - } - - @Override - public boolean isNotInExclusionZones(double mouseX, double mouseY) { - for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(Minecraft.getInstance().screen)) { - InteractionResult in = decider.isInZone(mouseX, mouseY); - if (in != InteractionResult.PASS) - return in == InteractionResult.SUCCESS; + public EntryListWidget getEntryList() { + boolean widgetScrolled = ConfigObject.getInstance().isEntryListWidgetScrolled(); + + if (entryListWidget != null) { + if (widgetScrolled && entryListWidget instanceof ScrolledEntryListWidget) { + return entryListWidget; + } else if (!widgetScrolled && entryListWidget instanceof PaginatedEntryListWidget) { + return entryListWidget; + } } - return true; - } - - public boolean isInside(Point point) { - return isInside(point.getX(), point.getY()); - } - - @Override - public OverlayListWidget getEntryList() { - return getEntryListWidget(); + + entryListWidget = widgetScrolled ? new ScrolledEntryListWidget() : new PaginatedEntryListWidget(); + + Rectangle overlayBounds = getBounds(); + entryListWidget.updateArea(Objects.requireNonNullElse(overlayBounds, new Rectangle()), getSearchField().getText()); + entryListWidget.updateEntriesPosition(); + + return entryListWidget; } @Override public Optional getFavoritesList() { - return Optional.ofNullable(getFavoritesListWidget()); + return Optional.ofNullable(getFavoritesListNullable()); } - public MenuAccess menuAccess() { - return menuAccess; + private FavoritesListWidget getFavoritesListNullable() { + if (ConfigObject.getInstance().isFavoritesEnabled()) { + if (favoritesListWidget == null) { + favoritesListWidget = new FavoritesListWidget(); + } + + return favoritesListWidget; + } else { + return favoritesListWidget = null; + } } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/ChangelogLoader.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/ChangelogLoader.java index ae5a41def..b2bd91d0e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/ChangelogLoader.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/ChangelogLoader.java @@ -62,13 +62,14 @@ public static boolean hasVisited() { try (InputStreamReader reader = new FileReader(file)) { String version = IOUtils.toString(reader).trim(); - InputStream changesJsonStream = ChangelogLoader.class.getClassLoader().getResourceAsStream("roughlyenoughitems.changes.json"); - if (changesJsonStream != null) { - JsonObject object = JsonParser.parseReader(new InputStreamReader(changesJsonStream)) - .getAsJsonObject(); - String currentVersion = object.getAsJsonPrimitive("version").getAsString(); - if (currentVersion.equals(version)) { - visited = true; + try (InputStream changesJsonStream = ChangelogLoader.class.getClassLoader().getResourceAsStream("roughlyenoughitems.changes.json")) { + if (changesJsonStream != null) { + JsonObject object = JsonParser.parseReader(new InputStreamReader(changesJsonStream)) + .getAsJsonObject(); + String currentVersion = object.getAsJsonPrimitive("version").getAsString(); + if (currentVersion.equals(version)) { + visited = true; + } } } } catch (IOException e) { @@ -92,47 +93,49 @@ public void add(Function function) { visited = true; BuilderImpl builder = new BuilderImpl(); - InputStream changesJsonStream = ChangelogLoader.class.getClassLoader().getResourceAsStream("roughlyenoughitems.changes.json"); - if (changesJsonStream == null) { - builder.add(new TranslatableComponent("rei.changelog.error.missingChangelogFile")); - } else { - JsonObject object = JsonParser.parseReader(new InputStreamReader(changesJsonStream)) - .getAsJsonObject(); - String version = object.getAsJsonPrimitive("version").getAsString(); - Path file = Platform.getConfigFolder().resolve("roughlyenoughitems/changelog.txt"); - try { - Files.write(file, version.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); - } catch (IOException e) { - e.printStackTrace(); - } - - InputStream changelogStream = ChangelogLoader.class.getClassLoader().getResourceAsStream("roughlyenoughitems/" + version + "/changelog.md"); - - if (changelogStream == null) { + try (InputStream changesJsonStream = ChangelogLoader.class.getClassLoader().getResourceAsStream("roughlyenoughitems.changes.json")) { + if (changesJsonStream == null) { builder.add(new TranslatableComponent("rei.changelog.error.missingChangelogFile")); } else { + JsonObject object = JsonParser.parseReader(new InputStreamReader(changesJsonStream)) + .getAsJsonObject(); + String version = object.getAsJsonPrimitive("version").getAsString(); + Path file = Platform.getConfigFolder().resolve("roughlyenoughitems/changelog.txt"); try { - JParseDown parseDown = new JParseDown(); - LinkedList blocks = parseDown.linesElements(IOUtils.readLines(changelogStream, StandardCharsets.UTF_8).toArray(new String[0])); - for (JParseDown.Block block : blocks) { - if (block.autoBreak) { - builder.add(width -> new ErrorsEntryListWidget.EmptyEntry(6)); - } - Builder blockBuilder = builder; - if (block instanceof JParseDown.BlockHeader) { - blockBuilder = function -> { - builder.add(width -> new ErrorsEntryListWidget.ScaledEntry(function.apply(Math.round(width / 1.5F)), 1.5F)); - }; - } - JParseDownToMinecraft.build(blockBuilder, block); - if (block.autoBreak) { - builder.add(width -> new ErrorsEntryListWidget.EmptyEntry(6)); + Files.writeString(file, version, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); + } catch (IOException e) { + e.printStackTrace(); + } + + try (InputStream changelogStream = ChangelogLoader.class.getClassLoader().getResourceAsStream("roughlyenoughitems/" + version + "/changelog.md")) { + if (changelogStream == null) { + builder.add(new TranslatableComponent("rei.changelog.error.missingChangelogFile")); + } else { + try { + JParseDown parseDown = new JParseDown(); + LinkedList blocks = parseDown.linesElements(IOUtils.readLines(changelogStream, StandardCharsets.UTF_8).toArray(new String[0])); + for (JParseDown.Block block : blocks) { + if (block.autoBreak) { + builder.add(width -> new ErrorsEntryListWidget.EmptyEntry(6)); + } + Builder blockBuilder = builder; + if (block instanceof JParseDown.BlockHeader) { + blockBuilder = function -> { + builder.add(width -> new ErrorsEntryListWidget.ScaledEntry(function.apply(Math.round(width / 1.5F)), 1.5F)); + }; + } + JParseDownToMinecraft.build(blockBuilder, block); + if (block.autoBreak) { + builder.add(width -> new ErrorsEntryListWidget.EmptyEntry(6)); + } + } + } catch (IOException e) { + builder.add(new TranslatableComponent("rei.changelog.error.failedToReadChangelogFile")); } } - } catch (IOException e) { - builder.add(new TranslatableComponent("rei.changelog.error.failedToReadChangelogFile")); } } + } catch (IOException e) { } Minecraft.getInstance().setScreen(new ErrorsScreen(new TranslatableComponent("text.rei.changelog.title"), builder.components, Minecraft.getInstance().screen, true)); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/JParseDown.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/JParseDown.java index 6165f6a7a..01c306726 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/JParseDown.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/JParseDown.java @@ -64,10 +64,13 @@ public Line(String line) { } } - public abstract static class Component { + public static class Component { public String markup = null; public boolean hidden = false; public HashSet> nonNestables = new HashSet<>(); + + protected Component() { + } } public interface BlockType { @@ -366,11 +369,11 @@ public class BlockList extends Block { public String markerTypeRegex; public LinkedList lines = new LinkedList<>(); - + public BlockList() { autoBreak = true; } - + public static Block startBlock(JParseDown parseDown, Line line, Block block) { boolean ordered; String pattern; @@ -404,9 +407,9 @@ public static Block startBlock(JParseDown parseDown, Line line, Block block) { b.pattern = pattern; b.ordered = ordered; b.marker = marker; - b.markerType = !ordered ? - markerWithoutWhitespace : - markerWithoutWhitespace.substring(markerWithoutWhitespace.length() - 1, markerWithoutWhitespace.length()); + b.markerType = ordered ? + markerWithoutWhitespace.substring(markerWithoutWhitespace.length() - 1) : + markerWithoutWhitespace; b.markerTypeRegex = Pattern.quote(b.markerType); b.lines.add(body); @@ -476,9 +479,8 @@ public boolean isCompletable() { @Override public Block completeBlock() { - if (loose) { - if (!lines.getLast().isEmpty()) - lines.add(""); + if (loose && !lines.getLast().isEmpty()) { + lines.add(""); } return this; } @@ -573,7 +575,7 @@ public static class BlockHorizontalRule extends Block { public BlockHorizontalRule() { autoBreak = true; } - + @Override public Collection inline(JParseDown parseDown) { return Collections.singletonList(new InlineHorizontalRule()); @@ -613,7 +615,7 @@ public BlockReference(String id, ReferenceData data) { public static Block startBlock(JParseDown parseDown, Line line, Block block) { Matcher m; if (line.text.indexOf(']') >= 0 && (m = Pattern.compile("^\\[(.+?)\\]:[ ]*+?(?:[ ]+[\"\\'(](.+)[\"\\')])?[ ]*+$").matcher(line.text)).find()) { - String id = m.group(1).toLowerCase(); + String id = m.group(1).toLowerCase(Locale.ROOT); ReferenceData data = new ReferenceData(parseDown.convertUrl(m.group(2)), m.group(3)); parseDown.referenceDefinitions.put(id, data); return new BlockReference(id, data); @@ -634,11 +636,11 @@ public String toString() { } } - public abstract static class Inline extends Component { + public static class Inline extends Component { public int extent; public int position = -1; - public Inline() { + protected Inline() { } public Inline setExtent(String s) { @@ -834,7 +836,7 @@ public static Inline inline(JParseDown parseDown, String text, String context) { InlineLink link = (InlineLink) InlineLink.inline(parseDown, text, context); if (link == null) return null; - + return new InlineImage(link.url, link.text).setExtent(link.extent + 1); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/JParseDownToMinecraft.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/JParseDownToMinecraft.java index 9145a6298..0b0afaa00 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/JParseDownToMinecraft.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/changelog/JParseDownToMinecraft.java @@ -73,15 +73,17 @@ public static void build(ChangelogLoader.Builder builder, JParseDown.Block block } else if (inline instanceof JParseDown.InlineHorizontalRule) { builder.add(ErrorsEntryListWidget.HorizontalRuleEntry::new); } else if (inline instanceof JParseDown.InlineImage) { - InputStream stream = builder.getClass().getClassLoader().getResourceAsStream(((JParseDown.InlineImage) inline).src); - if (stream != null) { - try { - DynamicTexture texture = new DynamicTexture(NativeImage.read(stream)); - ResourceLocation id = Minecraft.getInstance().getTextureManager().register("rei_md_image_", texture); - builder.add(width -> new ErrorsEntryListWidget.ImageEntry(width, texture, id)); - } catch (IOException e) { - e.printStackTrace(); + try (InputStream stream = builder.getClass().getClassLoader().getResourceAsStream(((JParseDown.InlineImage) inline).src)) { + if (stream != null) { + try { + DynamicTexture texture = new DynamicTexture(NativeImage.read(stream)); + ResourceLocation id = Minecraft.getInstance().getTextureManager().register("rei_md_image_", texture); + builder.add(width -> new ErrorsEntryListWidget.ImageEntry(width, texture, id)); + } catch (IOException e) { + e.printStackTrace(); + } } + } catch (IOException e) { } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java index add5f947b..50d6ab020 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java @@ -29,7 +29,6 @@ import me.shedaniel.math.FloatingRectangle; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; import me.shedaniel.rei.api.client.gui.drag.DraggableBoundsProvider; import me.shedaniel.rei.api.client.gui.drag.DraggableStack; import me.shedaniel.rei.api.client.gui.drag.DraggedAcceptorResult; @@ -38,6 +37,7 @@ import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentProvider; import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentVisitor; import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.impl.client.gui.InternalCursorState; import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; import net.minecraft.Util; import net.minecraft.client.Minecraft; @@ -101,7 +101,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { hash = shapeBounds.hash; } - if (!RoughlyEnoughItemsCoreClient.isLeftMousePressed) { + if (!InternalCursorState.isLeftMousePressed) { drop(); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java new file mode 100644 index 000000000..e78f36704 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java @@ -0,0 +1,345 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.overlay; + +import com.google.common.collect.Lists; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; +import me.shedaniel.math.impl.PointHelper; +import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.favorites.FavoriteEntry; +import me.shedaniel.rei.api.client.gui.drag.DraggingContext; +import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentProvider; +import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentVisitor; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.api.client.registry.screen.ClickArea; +import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; +import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; +import me.shedaniel.rei.api.client.view.ViewSearchBuilder; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.impl.client.gui.dragging.CurrentDraggingStack; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccessImpl; +import me.shedaniel.rei.impl.client.gui.widget.EntryHighlighter; +import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; +import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.world.InteractionResult; + +import java.util.List; + +public abstract class AbstractScreenOverlay extends ScreenOverlay { + private final List widgets = Lists.newLinkedList(); + private final CurrentDraggingStack draggingStack = new CurrentDraggingStack(); + private final MenuAccessImpl menuAccess = new MenuAccessImpl(); + private final Rectangle bounds = new Rectangle(); + private boolean shouldReload = false; + private boolean shouldReloadSearch = false; + + @Override + public void queueReloadOverlay() { + shouldReload = true; + } + + @Override + public void queueReloadSearch() { + shouldReloadSearch = true; + } + + @Override + public boolean isOverlayReloadQueued() { + return shouldReload; + } + + @Override + public boolean isSearchReloadQueued() { + return shouldReloadSearch || shouldReload; + } + + @Override + public DraggingContext getDraggingContext() { + return draggingStack; + } + + @Override + public List children() { + return widgets; + } + + @Override + public Rectangle getBounds() { + return bounds; + } + + protected boolean hasSpace() { + return !this.bounds.isEmpty(); + } + + public void init() { + this.draggingStack.set(DraggableComponentProvider.from(ScreenRegistry.getInstance()::getDraggableComponentProviders), + DraggableComponentVisitor.from(ScreenRegistry.getInstance()::getDraggableComponentVisitors)); + + this.shouldReload = false; + this.shouldReloadSearch = false; + this.bounds.setBounds(InternalOverlayBounds.calculateOverlayBounds()); + this.widgets.clear(); + this.widgets.add(draggingStack); + } + + @Override + public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { + if (shouldReload || !InternalOverlayBounds.calculateOverlayBounds().equals(bounds)) { + init(); + updateSearch(); + } else { + for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(minecraft.screen)) { + if (decider != null && decider.shouldRecalculateArea(ConfigObject.getInstance().getDisplayPanelLocation(), bounds)) { + init(); + break; + } + } + } + if (shouldReloadSearch) { + shouldReloadSearch = false; + updateSearch(); + } + if (OverlaySearchField.isHighlighting) { + EntryHighlighter.render(matrices); + } + if (!hasSpace()) return; + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); + this.renderWidgets(matrices, mouseX, mouseY, delta); + if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { + Screen screen = Minecraft.getInstance().screen; + ClickArea.ClickAreaContext context = createClickAreaContext(mouseX, mouseY, screen); + List clickAreaTooltips = ScreenRegistry.getInstance().getClickAreaTooltips((Class) screen.getClass(), context); + if (clickAreaTooltips != null && !clickAreaTooltips.isEmpty()) { + Tooltip.create(clickAreaTooltips).queue(); + } + } + } + + public void lateRender(PoseStack matrices, int mouseX, int mouseY, float delta) { + if (REIRuntime.getInstance().isOverlayVisible() && hasSpace()) { + getSearchField().asWidget().render(matrices, mouseX, mouseY, delta); + for (Widget widget : widgets) { + if (widget instanceof LateRenderable && widget != menuAccess.widget()) + widget.render(matrices, mouseX, mouseY, delta); + } + matrices.pushPose(); + matrices.translate(0, 0, 500); + menuAccess.lateRender(matrices, mouseX, mouseY, delta); + matrices.popPose(); + } + + REIRuntime.getInstance().clearTooltips(); + if (REIRuntime.getInstance().isOverlayVisible()) { + menuAccess.afterRender(); + } + } + + @Override + public void renderTooltip(PoseStack matrices, Tooltip tooltip) { + renderTooltipInner(minecraft.screen, matrices, tooltip, tooltip.getX(), tooltip.getY()); + } + + protected abstract void renderTooltipInner(Screen screen, PoseStack matrices, Tooltip tooltip, int mouseX, int mouseY); + + public void renderWidgets(PoseStack matrices, int mouseX, int mouseY, float delta) { + if (!REIRuntime.getInstance().isOverlayVisible()) + return; + for (Widget widget : widgets) { + if (!(widget instanceof LateRenderable)) + widget.render(matrices, mouseX, mouseY, delta); + } + } + + private ClickArea.ClickAreaContext createClickAreaContext(double mouseX, double mouseY, Screen screen) { + return new ClickArea.ClickAreaContext<>() { + @Override + public Screen getScreen() { + return screen; + } + + @Override + public Point getMousePosition() { + return new Point(mouseX, mouseY); + } + }; + } + + protected abstract void updateSearch(); + + public MenuAccess menuAccess() { + return menuAccess; + } + + public boolean isInside(double mouseX, double mouseY) { + return bounds.contains(mouseX, mouseY) && isNotInExclusionZones(mouseX, mouseY); + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + boolean visible = REIRuntime.getInstance().isOverlayVisible(); + if (!hasSpace()) return false; + if (ConfigObject.getInstance().getHideKeybind().matchesMouse(button)) { + REIRuntime.getInstance().toggleOverlayVisible(); + return REIRuntime.getInstance().isOverlayVisible(); + } + EntryStack stack = ScreenRegistry.getInstance().getFocusedStack(Minecraft.getInstance().screen, PointHelper.ofMouse()); + if (stack != null && !stack.isEmpty()) { + stack = stack.copy(); + if (ConfigObject.getInstance().getRecipeKeybind().matchesMouse(button)) { + return ViewSearchBuilder.builder().addRecipesFor(stack).open(); + } else if (ConfigObject.getInstance().getUsageKeybind().matchesMouse(button)) { + return ViewSearchBuilder.builder().addUsagesFor(stack).open(); + } else if (visible && ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { + FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); + ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); + return true; + } + } + if (visible) { + Widget menuWidget = menuAccess.widget(); + if (menuWidget != null && menuWidget.mouseClicked(mouseX, mouseY, button)) { + this.setFocused(menuWidget); + if (button == 0) + this.setDragging(true); + return true; + } + } + if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { + Screen screen = Minecraft.getInstance().screen; + ClickArea.ClickAreaContext context = createClickAreaContext(mouseX, mouseY, screen); + if (ScreenRegistry.getInstance().executeClickArea((Class) screen.getClass(), context)) { + return true; + } + } + if (!visible) { + return false; + } + for (GuiEventListener element : widgets) { + if (element != menuAccess.widget() && element.mouseClicked(mouseX, mouseY, button)) { + this.setFocused(element); + if (button == 0) + this.setDragging(true); + return true; + } + } + return false; + } + + @Override + public boolean mouseScrolled(double mouseX, double mouseY, double amount) { + if (!REIRuntime.getInstance().isOverlayVisible()) + return false; + if (menuAccess.mouseScrolled(mouseX, mouseY, amount)) + return true; + for (Widget widget : widgets) + if (widget != menuAccess.widget() + && widget.mouseScrolled(mouseX, mouseY, amount)) + return true; + return false; + } + + @Override + public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { + if (!REIRuntime.getInstance().isOverlayVisible()) + return false; + if (!hasSpace()) return false; + return (this.getFocused() != null && this.isDragging() && button == 0) && this.getFocused().mouseDragged(mouseX, mouseY, button, deltaX, deltaY); + } + + @Override + public boolean keyPressed(int keyCode, int scanCode, int modifiers) { + if (!hasSpace()) return false; + if (REIRuntime.getInstance().isOverlayVisible()) { + for (GuiEventListener listener : widgets) + if (listener.keyPressed(keyCode, scanCode, modifiers)) + return true; + } + if (ConfigObject.getInstance().getHideKeybind().matchesKey(keyCode, scanCode)) { + REIRuntime.getInstance().toggleOverlayVisible(); + return true; + } + EntryStack stack = ScreenRegistry.getInstance().getFocusedStack(Minecraft.getInstance().screen, PointHelper.ofMouse()); + if (stack != null && !stack.isEmpty()) { + stack = stack.copy(); + if (ConfigObject.getInstance().getRecipeKeybind().matchesKey(keyCode, scanCode)) { + return ViewSearchBuilder.builder().addRecipesFor(stack).open(); + } else if (ConfigObject.getInstance().getUsageKeybind().matchesKey(keyCode, scanCode)) { + return ViewSearchBuilder.builder().addUsagesFor(stack).open(); + } else if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { + FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); + ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); + return true; + } + } + return false; + } + + @Override + public boolean keyReleased(int keyCode, int scanCode, int modifiers) { + if (!hasSpace()) return false; + if (REIRuntime.getInstance().isOverlayVisible()) { + for (GuiEventListener listener : widgets) + if (listener == getFocused() && listener.keyPressed(keyCode, scanCode, modifiers)) + return true; + } + return false; + } + + @Override + public boolean charTyped(char character, int modifiers) { + if (!REIRuntime.getInstance().isOverlayVisible()) + return false; + if (!hasSpace()) return false; + for (GuiEventListener listener : widgets) + if (listener.charTyped(character, modifiers)) + return true; + return false; + } + + @Override + public boolean isNotInExclusionZones(double mouseX, double mouseY) { + for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(Minecraft.getInstance().screen)) { + InteractionResult in = decider.isInZone(mouseX, mouseY); + if (in != InteractionResult.PASS) + return in == InteractionResult.SUCCESS; + } + return true; + } + + public boolean isInside(Point point) { + return isInside(point.getX(), point.getY()); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java new file mode 100644 index 000000000..4b9aa557d --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java @@ -0,0 +1,51 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.overlay; + +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.gui.config.DisplayPanelLocation; +import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; +import net.minecraft.client.Minecraft; + +import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; + +class InternalOverlayBounds { + static Rectangle calculateOverlayBounds() { + Rectangle bounds = ScreenRegistry.getInstance().getOverlayBounds(ConfigObject.getInstance().getDisplayPanelLocation(), Minecraft.getInstance().screen); + + int widthReduction = (int) Math.round(bounds.width * (1 - ConfigObject.getInstance().getHorizontalEntriesBoundariesPercentage())); + if (ConfigObject.getInstance().getDisplayPanelLocation() == DisplayPanelLocation.RIGHT) + bounds.x += widthReduction; + bounds.width -= widthReduction; + int maxWidth = (int) Math.ceil(entrySize() * ConfigObject.getInstance().getHorizontalEntriesBoundariesColumns() + entrySize() * 0.75); + if (bounds.width > maxWidth) { + if (ConfigObject.getInstance().getDisplayPanelLocation() == DisplayPanelLocation.RIGHT) + bounds.x += bounds.width - maxWidth; + bounds.width = maxWidth; + } + + return bounds; + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java index 2dc2e452c..4e3f612df 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java @@ -48,7 +48,6 @@ import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.ClientHelperImpl; -import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget; import me.shedaniel.rei.impl.display.DisplaySpec; import net.minecraft.ChatFormatting; @@ -64,6 +63,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.util.Mth; import net.minecraft.world.inventory.tooltip.TooltipComponent; @@ -176,13 +176,13 @@ protected void transformResultNotice(List setupDisplay, List setupDisplay, List> noticeStacks) { if (noticeStacks.isEmpty()) return; - for (EntryWidget widget : Widgets.walk(setupDisplay, EntryWidget.class::isInstance)) { - if (widget.getNoticeMark() == marker && widget.getEntries().size() > 1) { + for (Slot slot : Widgets.walk(setupDisplay, Slot.class::isInstance)) { + if (slot.getNoticeMark() == marker && slot.getEntries().size() > 1) { for (EntryStack noticeStack : noticeStacks) { - EntryStack stack = CollectionUtils.findFirstOrNullEqualsExact(widget.getEntries(), noticeStack); + EntryStack stack = CollectionUtils.findFirstOrNullEqualsExact(slot.getEntries(), noticeStack); if (stack != null) { - widget.clearEntries(); - widget.entry(stack); + slot.clearEntries(); + slot.entry(stack); break; } } @@ -191,12 +191,12 @@ private static void transformNotice(int marker, List } protected void transformFiltering(List setupDisplay) { - for (EntryWidget widget : Widgets.walk(setupDisplay, EntryWidget.class::isInstance)) { - if (widget.getEntries().size() > 1) { - Collection> refiltered = EntryRegistry.getInstance().refilterNew(false, widget.getEntries()); + for (Slot slot : Widgets.walk(setupDisplay, Slot.class::isInstance)) { + if (slot.getEntries().size() > 1) { + Collection> refiltered = EntryRegistry.getInstance().refilterNew(false, slot.getEntries()); if (!refiltered.isEmpty()) { - widget.clearEntries(); - widget.entries(refiltered); + slot.clearEntries(); + slot.entries(refiltered); } } } @@ -204,11 +204,14 @@ protected void transformFiltering(List setupDisplay) protected void setupTags(List widgets) { outer: - for (EntryWidget widget : Widgets.walk(widgets, EntryWidget.class::isInstance)) { - if (widget.getNoticeMark() != EntryWidget.INPUT) continue; - addCyclingTooltip(widget); - widget.removeTagMatch = false; - if (widget.getEntries().size() <= 1) continue; + for (Slot widget : Widgets.walk(widgets, Slot.class::isInstance)) { + if (widget.getNoticeMark() != Slot.INPUT) continue; + + if (widget.getEntries().size() <= 1) { + addCyclingTooltip(widget, null); + continue; + } + EntryType type = null; for (EntryStack entry : widget.getEntries()) { if (type == null) { @@ -233,14 +236,16 @@ protected void setupTags(List widgets) { TagKey firstOrNull = CollectionUtils.findFirstOrNull(collection::iterator, key -> CollectionUtils.allMatch(objects, holder -> ((Holder) holder).is((TagKey) key))); if (firstOrNull != null) { - widget.tagMatch = firstOrNull.location(); + addCyclingTooltip(widget, firstOrNull.location()); + } else { + addCyclingTooltip(widget, null); } } } private static final int MAX_WIDTH = 200; - private void addCyclingTooltip(EntryWidget widget) { + private void addCyclingTooltip(Slot widget, @Nullable ResourceLocation tagMatch) { class TooltipProcessor implements UnaryOperator, TooltipComponent, ClientTooltipComponent { @Override public Tooltip apply(Tooltip tooltip) { @@ -272,7 +277,7 @@ public int getHeight() { int w = Math.max(1, MAX_WIDTH / entrySize); int height = Math.min(6, Mth.ceil(widget.getEntries().size() / (float) w)) * entrySize + 2; height += 12; - if (widget.tagMatch != null) height += 12; + if (tagMatch != null) height += 12; return height; } @@ -283,7 +288,7 @@ public int getWidth(Font font) { int size = widget.getEntries().size(); int width = Math.min(size, w) * entrySize; width = Math.max(width, font.width(new TranslatableComponent("text.rei.accepts"))); - if (widget.tagMatch != null) width = Math.max(width, font.width(new TranslatableComponent("text.rei.tag_accept", widget.tagMatch.toString()))); + if (tagMatch != null) width = Math.max(width, font.width(new TranslatableComponent("text.rei.tag_accept", tagMatch.toString()))); return width; } @@ -316,10 +321,10 @@ public void renderText(Font font, int x, int y, Matrix4f pose, MultiBufferSource font.drawInBatch(new TranslatableComponent("text.rei.accepts").withStyle(ChatFormatting.GRAY), x, y + 2, -1, true, pose, buffers, false, 0, 15728880); - if (widget.tagMatch != null) { + if (tagMatch != null) { int entrySize = EntryListWidget.entrySize(); int w = Math.max(1, MAX_WIDTH / entrySize); - font.drawInBatch(new TranslatableComponent("text.rei.tag_accept", widget.tagMatch.toString()) + font.drawInBatch(new TranslatableComponent("text.rei.tag_accept", tagMatch.toString()) .withStyle(ChatFormatting.GRAY), x, y + 16 + Math.min(6, Mth.ceil(widget.getEntries().size() / (float) w)) * entrySize, -1, true, pose, buffers, false, 0, 15728880); 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 f4957da0c..72d632e36 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 @@ -48,7 +48,6 @@ import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.widget.AutoCraftingButtonWidget; -import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import me.shedaniel.rei.impl.client.gui.widget.TabWidget; import me.shedaniel.rei.impl.display.DisplaySpec; import net.minecraft.client.Minecraft; @@ -139,7 +138,9 @@ public void init() { widgets.add(Widgets.createSlotBase(new Rectangle(xx - 1, yy - 1, 2 + w * 16, 2 + h * 16))); int index = 0; for (EntryIngredient workingStation : workstations) { - widgets.add(new DefaultDisplayViewingScreen.WorkstationSlotWidget(xx, yy, workingStation)); + widgets.add(Widgets.createSlot(new Point(xx, yy)) + .entries(workingStation) + .noBackground()); index++; xx += 16; if (index >= ww) { @@ -169,9 +170,6 @@ public void init() { transformFiltering(setupDisplay); transformIngredientNotice(setupDisplay, ingredientStackToNotice); transformResultNotice(setupDisplay, resultStackToNotice); - for (EntryWidget widget : Widgets.walk(widgets, EntryWidget.class::isInstance)) { - widget.removeTagMatch = true; - } this.widgets.addAll(setupDisplay); Optional supplier = CategoryRegistry.getInstance().get(category.getCategoryIdentifier()).getPlusButtonArea(); if (supplier.isPresent() && supplier.get().get(recipeBounds) != null) 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 97b08d0dd..a29319dac 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 @@ -56,16 +56,15 @@ import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.RecipeDisplayExporter; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.toast.ExportRecipeIdentifierToast; -import me.shedaniel.rei.impl.client.gui.widget.*; +import me.shedaniel.rei.impl.client.gui.widget.AutoCraftingButtonWidget; +import me.shedaniel.rei.impl.client.gui.widget.DisplayCompositeWidget; +import me.shedaniel.rei.impl.client.gui.widget.TabWidget; 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; import net.minecraft.client.gui.screens.ConfirmScreen; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.resources.language.I18n; import net.minecraft.client.resources.sounds.SimpleSoundInstance; @@ -232,19 +231,12 @@ public void init() { DefaultDisplayViewingScreen.this.init(); }).tooltipLine(new TranslatableComponent("text.rei.previous_page"))); this.widgets.add(Widgets.createClickableLabel(new Point(bounds.getCenterX(), bounds.getY() + 21), NarratorChatListener.NO_TITLE, label -> { - if (!Screen.hasShiftDown()) { - page = 0; - DefaultDisplayViewingScreen.this.init(); - } else { - ScreenOverlayImpl.getInstance().choosePageWidget = new DefaultDisplayChoosePageWidget(page -> { - DefaultDisplayViewingScreen.this.page = page; - DefaultDisplayViewingScreen.this.init(); - }, page, getCurrentTotalPages()); - } + page = 0; + DefaultDisplayViewingScreen.this.init(); }).onRender((matrices, label) -> { label.setMessage(new ImmutableTextComponent(String.format("%d/%d", page + 1, getCurrentTotalPages()))); label.setClickable(getCurrentTotalPages() > 1); - }).tooltipFunction(label -> label.isClickable() ? new Component[]{new TranslatableComponent("text.rei.go_back_first_page"), new TextComponent(" "), new TranslatableComponent("text.rei.shift_click_to", new TranslatableComponent("text.rei.choose_page")).withStyle(ChatFormatting.GRAY)} : null)); + }).tooltipFunction(label -> label.isClickable() ? new Component[]{new TranslatableComponent("text.rei.go_back_first_page")} : null)); this.widgets.add(recipeNext = Widgets.createButton(new Rectangle(bounds.getMaxX() - 17, bounds.getY() + 19, 12, 12), ImmutableTextComponent.EMPTY) .onClick(button -> { page++; @@ -303,9 +295,6 @@ private void initDisplays() { transformFiltering(setupDisplay); transformIngredientNotice(setupDisplay, ingredientStackToNotice); transformResultNotice(setupDisplay, resultStackToNotice); - for (EntryWidget widget : Widgets.walk(widgets, EntryWidget.class::isInstance)) { - widget.removeTagMatch = true; - } this.recipeBounds.put(displayBounds, Pair.of(display, setupDisplay)); this.widgets.add(new DisplayCompositeWidget(display, setupDisplay, displayBounds)); if (plusButtonArea.isPresent()) { @@ -328,7 +317,9 @@ private void initWorkstations(List widgets) { int index = 0; xx += (innerWidth - 1) * 16; for (EntryIngredient workingStation : workstations) { - widgets.add(new WorkstationSlotWidget(xx, yy, workingStation)); + widgets.add(Widgets.createSlot(new Point(xx, yy)) + .entries(workingStation) + .noBackground()); index++; yy += 16; if (index >= hh) { @@ -494,9 +485,6 @@ private boolean checkExportDisplays() { transformFiltering(setupDisplay); transformIngredientNotice(setupDisplay, ingredientStackToNotice); transformResultNotice(setupDisplay, resultStackToNotice); - for (EntryWidget widget : Widgets.walk(widgets(), EntryWidget.class::isInstance)) { - widget.removeTagMatch = true; - } RecipeDisplayExporter.exportRecipeDisplay(displayBounds, spec, setupDisplay, false); } @@ -553,19 +541,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { } return true; } - return super.mouseClicked(mouseX, mouseY, button); - } - - public static class WorkstationSlotWidget extends EntryWidget { - public WorkstationSlotWidget(int x, int y, EntryIngredient widgets) { - super(new Point(x, y)); - entries(widgets); - disableBackground(); - } - @Override - public boolean containsMouse(double mouseX, double mouseY) { - return getInnerBounds().contains(mouseX, mouseY); - } + return super.mouseClicked(mouseX, mouseY, button); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java index 9beda75c0..f05c24317 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java @@ -31,9 +31,11 @@ import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.common.display.Display; +import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.toast.CopyRecipeIdentifierToast; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; +import me.shedaniel.rei.impl.client.provider.AutoCraftingEvaluator; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.Component; @@ -50,24 +52,31 @@ public static Widget create(Rectangle displayBounds, Rectangle rectangle, Compon Button autoCraftingButton = Widgets.createButton(rectangle, text) .focusable(false) .onClick(button -> { - AutoCraftingEvaluator.evaluateAutoCrafting(true, Screen.hasShiftDown(), displaySupplier.get(), idsSupplier); + ClientInternals.getAutoCraftingEvaluator(displaySupplier.get()) + .actuallyCraft() + .stacked(Screen.hasShiftDown()) + .get(); }); return new DelegateWidget(autoCraftingButton) { @Override public void render(PoseStack poses, int mouseX, int mouseY, float delta) { - AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, displaySupplier.get(), idsSupplier); + AutoCraftingEvaluator.Result result = ClientInternals.getAutoCraftingEvaluator(displaySupplier.get()) + .buildRenderer() + .buildTooltipRenderer(autoCraftingButton.isFocused() || containsMouse(mouseX, mouseY)) + .ids(idsSupplier == null ? null : idsSupplier.get()) + .get(); - autoCraftingButton.setEnabled(result.successful); - autoCraftingButton.setTint(result.tint); + autoCraftingButton.setEnabled(result.isSuccessful()); + autoCraftingButton.setTint(result.getTint()); - if (result.hasApplicable) { + if (result.isApplicable()) { autoCraftingButton.setText(text); } else { autoCraftingButton.setText(new TextComponent("!")); } - if (result.hasApplicable && (containsMouse(mouseX, mouseY) || autoCraftingButton.isFocused()) && result.renderer != null) { - result.renderer.render(poses, mouseX, mouseY, delta, setupDisplay, displayBounds, displaySupplier.get()); + if (result.isApplicable() && (containsMouse(mouseX, mouseY) || autoCraftingButton.isFocused()) && result.getRenderer() != null) { + result.getRenderer().render(poses, mouseX, mouseY, delta, setupDisplay, displayBounds, displaySupplier.get()); } this.widget.render(poses, mouseX, mouseY, delta); @@ -80,9 +89,9 @@ public void render(PoseStack poses, int mouseX, int mouseY, float delta) { } } - private void tryTooltip(AutoCraftingEvaluator.AutoCraftingResult result, Point point) { - if (result.tooltipRenderer != null) { - result.tooltipRenderer.accept(point, Tooltip::queue); + private void tryTooltip(AutoCraftingEvaluator.Result result, Point point) { + if (result.getTooltipRenderer() != null) { + result.getTooltipRenderer().accept(point, Tooltip::queue); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java index 8358bbbf2..7d88521d4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java @@ -29,10 +29,7 @@ import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; -import me.shedaniel.rei.api.client.gui.widgets.Button; -import me.shedaniel.rei.api.client.gui.widgets.Tooltip; -import me.shedaniel.rei.api.client.gui.widgets.Widget; -import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.client.overlay.OverlayListWidget; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.search.method.InputMethod; @@ -155,7 +152,7 @@ public static List createInputMethodEntries(List !Objects.equals(config.getInputMethodId(), pair.getKey())) - .withTooltip(() -> Tooltip.create(Widget.mouse(), pair.getValue().getDescription())) + .withTooltip(() -> Tooltip.create(TooltipContext.ofMouse(), pair.getValue().getDescription())) ) .toList(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DefaultDisplayChoosePageWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DefaultDisplayChoosePageWidget.java deleted file mode 100644 index 1815822b4..000000000 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DefaultDisplayChoosePageWidget.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.widget; - -import com.google.common.collect.Lists; -import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.client.REIRuntime; -import me.shedaniel.rei.api.client.gui.widgets.*; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import net.minecraft.client.Minecraft; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.util.Mth; -import org.jetbrains.annotations.ApiStatus; - -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.function.IntConsumer; - -@ApiStatus.Internal -public class DefaultDisplayChoosePageWidget extends DraggableWidget { - - private int currentPage; - private int maxPage; - private Rectangle bounds, grabBounds, dragBounds; - private List widgets; - private IntConsumer callback; - private TextField textFieldWidget; - private Panel base1, base2; - private Button btnDone; - - public DefaultDisplayChoosePageWidget(IntConsumer callback, int currentPage, int maxPage) { - this.callback = callback; - this.currentPage = currentPage; - this.maxPage = maxPage; - initWidgets(getMidPoint()); - } - - @Override - public Rectangle getBounds() { - return bounds; - } - - @Override - public Rectangle getGrabBounds() { - return grabBounds; - } - - @Override - public Rectangle getDragBounds() { - return dragBounds; - } - - @Override - public boolean containsMouse(double mouseX, double mouseY) { - return getBounds().contains(mouseX, mouseY) || new Rectangle(bounds.x + bounds.width - 50, bounds.y + bounds.height - 3, 50, 36).contains(mouseX, mouseY); - } - - @Override - public void updateWidgets(Point midPoint) { - this.bounds = new Rectangle(midPoint.x - 50, midPoint.y - 20, 100, 40); - this.grabBounds = new Rectangle(midPoint.x - 50, midPoint.y - 20, 100, 16); - this.dragBounds = new Rectangle(midPoint.x - 50, midPoint.y - 20, 100, 70); - base1.getBounds().setLocation(bounds.x + bounds.width - 50, bounds.y + bounds.height - 6); - base2.getBounds().setBounds(bounds); - textFieldWidget.asWidget().getBounds().setLocation(bounds.x + 7, bounds.y + 16); - btnDone.getBounds().setLocation(bounds.x + bounds.width - 45, bounds.y + bounds.height + 3); - } - - @Override - protected void initWidgets(Point midPoint) { - this.bounds = new Rectangle(midPoint.x - 50, midPoint.y - 20, 100, 40); - this.grabBounds = new Rectangle(midPoint.x - 50, midPoint.y - 20, 100, 16); - this.dragBounds = new Rectangle(midPoint.x - 50, midPoint.y - 20, 100, 70); - this.widgets = Lists.newArrayList(); - this.widgets.add(base1 = Widgets.createCategoryBase(new Rectangle(bounds.x + bounds.width - 50, bounds.y + bounds.height - 6, 50, 36))); - this.widgets.add(base2 = Widgets.createCategoryBase(bounds)); - this.widgets.add(new Widget() { - - private TranslatableComponent text = new TranslatableComponent("text.rei.choose_page"); - - @Override - public List children() { - return Collections.emptyList(); - } - - @Override - public void render(PoseStack matrices, int i, int i1, float v) { - font.draw(matrices, text.getVisualOrderText(), bounds.x + 5, bounds.y + 5, REIRuntime.getInstance().isDarkThemeEnabled() ? 0xFFBBBBBB : 0xFF404040); - String endString = String.format(" /%d", maxPage); - int width = font.width(endString); - font.draw(matrices, endString, bounds.x + bounds.width - 5 - width, bounds.y + 22, REIRuntime.getInstance().isDarkThemeEnabled() ? 0xFFBBBBBB : 0xFF404040); - } - }); - String endString = String.format(" /%d", maxPage); - int width = font.width(endString); - this.widgets.add((textFieldWidget = Widgets.createTextField(new Rectangle(bounds.x + 7, bounds.y + 16, bounds.width - width - 12, 18))).asWidget()); - textFieldWidget.setMaxLength(10000); - textFieldWidget.setTextTransformer(s -> { - StringBuilder builder = new StringBuilder(); - for (char ch : s.toCharArray()) { - if (Character.isDigit(ch)) - builder.append(ch); - } - - return builder.toString(); - }); - textFieldWidget.setText(String.valueOf(currentPage + 1)); - widgets.add(btnDone = Widgets.createButton(new Rectangle(bounds.x + bounds.width - 45, bounds.y + bounds.height + 3, 40, 20), new TranslatableComponent("gui.done")) - .onClick(button -> { - callback.accept(Mth.clamp(getIntFromString(textFieldWidget.getText()).orElse(0) - 1, 0, maxPage - 1)); - ScreenOverlayImpl.getInstance().choosePageWidget = null; - })); - textFieldWidget.setFocused(true); - } - - @Override - public Point processMidPoint(Point midPoint, Point mouse, Point startPoint, Window window, int relateX, int relateY) { - return new Point(Mth.clamp(mouse.x - relateX, getDragBounds().width / 2, window.getGuiScaledWidth() - getDragBounds().width / 2), Mth.clamp(mouse.y - relateY, 20, window.getGuiScaledHeight() - 50)); - } - - @Override - public List children() { - return widgets; - } - - @Override - public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - matrices.pushPose(); - matrices.translate(0, 0, 800); - for (Widget widget : widgets) { - widget.render(matrices, mouseX, mouseY, delta); - } - matrices.popPose(); - } - - @Override - public boolean charTyped(char character, int modifiers) { - for (Widget widget : widgets) - if (widget.charTyped(character, modifiers)) - return true; - return false; - } - - @Override - public boolean keyPressed(int keyCode, int scanCode, int modifiers) { - if (keyCode == 335 || keyCode == 257) { - callback.accept(Mth.clamp(getIntFromString(textFieldWidget.getText()).orElse(0) - 1, 0, maxPage - 1)); - ScreenOverlayImpl.getInstance().choosePageWidget = null; - return true; - } - for (Widget widget : widgets) - if (widget.keyPressed(keyCode, scanCode, modifiers)) - return true; - return false; - } - - public Optional getIntFromString(String s) { - try { - return Optional.of(Integer.valueOf(s)); - } catch (Exception ignored) { - } - return Optional.empty(); - } - - @Override - public void onMouseReleaseMidPoint(Point midPoint) { - } -} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java index de04449c7..ed64c8d35 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java @@ -24,15 +24,14 @@ package me.shedaniel.rei.impl.client.gui.widget; import com.google.common.base.Suppliers; -import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.ItemCheatingMode; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; +import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; -import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; import me.shedaniel.rei.api.client.registry.transfer.TransferHandler; @@ -41,25 +40,27 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.plugins.PluginManager; -import me.shedaniel.rei.api.common.util.EntryStacks; +import me.shedaniel.rei.impl.client.ClientInternals; +import me.shedaniel.rei.impl.client.provider.AutoCraftingEvaluator; import net.minecraft.ChatFormatting; import net.minecraft.Util; import net.minecraft.client.KeyMapping; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; -import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.sounds.SoundEvents; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.Nullable; import java.util.ConcurrentModificationException; import java.util.List; import java.util.function.Supplier; +import java.util.function.UnaryOperator; -public abstract class DisplayedEntryWidget extends EntryWidget { +public abstract class DisplayedEntryWidget extends GuiComponent implements UnaryOperator, Slot.ActionPredicate { + public final Slot slot; private long lastCheckTime = -1; private long lastCheckedTime = -1; private Display display; @@ -67,30 +68,19 @@ public abstract class DisplayedEntryWidget extends EntryWidget { public int backupY; - protected DisplayedEntryWidget(Point point, int entrySize) { - super(point); - this.backupY = point.y; - getBounds().width = getBounds().height = entrySize; + protected DisplayedEntryWidget(Slot slot) { + this.slot = slot; + slot.tooltipProcessor(this); + slot.noHighlightIfEmpty(); + slot.tooltipsEnabled(s -> !ClientHelper.getInstance().isCheating() || Minecraft.getInstance().screen instanceof DisplayScreen || Minecraft.getInstance().player.containerMenu.getCarried().isEmpty()); + slot.action(this); + this.backupY = slot.getBounds().y; } @Override - public void drawHighlighted(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (!getCurrentEntry().isEmpty()) - super.drawHighlighted(matrices, mouseX, mouseY, delta); - } - - @Override - public void queueTooltip(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && !minecraft.player.containerMenu.getCarried().isEmpty()) { - return; - } - super.queueTooltip(matrices, mouseX, mouseY, delta); - } - - @Override - protected boolean doAction(double mouseX, double mouseY, int button) { + public boolean doMouse(Slot slot, double mouseX, double mouseY, int button) { if (ClientHelper.getInstance().isCheating() && !Screen.hasControlDown() && !(Minecraft.getInstance().screen instanceof DisplayScreen)) { - EntryStack entry = getCurrentEntry().copy(); + EntryStack entry = slot.getCurrentEntry().copy(); if (!entry.isEmpty()) { if (entry.getType() != VanillaEntryTypes.ITEM) { EntryStack cheatsAs = entry.cheatsAs(); @@ -119,7 +109,7 @@ protected boolean doAction(double mouseX, double mouseY, int button) { TransferHandler.Result transferResult = handler.handle(context); if (transferResult.isBlocking()) { - minecraft.getSoundManager().play(SimpleSoundInstance.forUI(SoundEvents.UI_BUTTON_CLICK, 1.0F)); + Widgets.produceClickSound(); if (transferResult.isReturningToScreen() && Minecraft.getInstance().screen != containerScreen) { Minecraft.getInstance().setScreen(containerScreen); REIRuntime.getInstance().getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); @@ -132,30 +122,13 @@ protected boolean doAction(double mouseX, double mouseY, int button) { } } - return super.doAction(mouseX, mouseY, button); - } - - @Override - public boolean cancelDeleteItems(EntryStack stack) { - if (!interactable || !ConfigObject.getInstance().isGrabbingItems()) - return super.cancelDeleteItems(stack); - if (ClientHelper.getInstance().isCheating() && !Screen.hasControlDown() && !(Minecraft.getInstance().screen instanceof DisplayScreen)) { - EntryStack entry = getCurrentEntry().copy(); - if (!entry.isEmpty()) { - if (entry.getType() != VanillaEntryTypes.ITEM) { - EntryStack cheatsAs = entry.cheatsAs(); - entry = cheatsAs.isEmpty() ? entry : cheatsAs; - } - return EntryStacks.equalsExact(entry, stack); - } - } - return super.cancelDeleteItems(stack); + return false; } @Override - public boolean keyPressedIgnoreContains(int keyCode, int scanCode, int modifiers) { + public boolean doKey(Slot slot, int keyCode, int scanCode, int modifiers) { if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen)) { - EntryStack entry = getCurrentEntry().copy(); + EntryStack entry = slot.getCurrentEntry().copy(); if (!entry.isEmpty()) { if (entry.getType() != VanillaEntryTypes.ITEM) { EntryStack cheatsAs = entry.cheatsAs(); @@ -174,14 +147,12 @@ public boolean keyPressedIgnoreContains(int keyCode, int scanCode, int modifiers } } - return super.keyPressedIgnoreContains(keyCode, scanCode, modifiers); + return false; } @Override - public @Nullable Tooltip getCurrentTooltip(TooltipContext context) { - Tooltip tooltip = super.getCurrentTooltip(context); - - if (tooltip != null && !(Minecraft.getInstance().screen instanceof DisplayScreen)) { + public Tooltip apply(Tooltip tooltip) { + if (!(Minecraft.getInstance().screen instanceof DisplayScreen)) { boolean exists = getTransferHandler(false) != null; if (!exists) { @@ -217,12 +188,13 @@ private TransferHandler _getTransferHandler() { try { for (List displays : DisplayRegistry.getInstance().getAll().values()) { for (Display display : displays) { - if (Views.getInstance().isRecipesFor(getEntries(), display)) { - AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, null); - if (result.successful) { + if (Views.getInstance().isRecipesFor(slot.getEntries(), display)) { + AutoCraftingEvaluator.Result result = ClientInternals.getAutoCraftingEvaluator(display).get(); + + if (result.isSuccessful()) { this.display = display; this.displayTooltipComponent = Suppliers.memoize(() -> new DisplayTooltipComponent(display)); - return result.successfulHandler; + return result.getSuccessfulHandler(); } } } @@ -242,10 +214,11 @@ private TransferHandler getTransferHandler(boolean query) { } if (display != null) { - if (Views.getInstance().isRecipesFor(getEntries(), display)) { - AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, null); - if (result.successful) { - return result.successfulHandler; + if (Views.getInstance().isRecipesFor(slot.getEntries(), display)) { + AutoCraftingEvaluator.Result result = ClientInternals.getAutoCraftingEvaluator(display).get(); + + if (result.isSuccessful()) { + return result.getSuccessfulHandler(); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DraggableWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DraggableWidget.java deleted file mode 100644 index 0eafebd75..000000000 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DraggableWidget.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.widget; - -import com.mojang.blaze3d.platform.Window; -import me.shedaniel.math.Point; -import me.shedaniel.math.Rectangle; -import me.shedaniel.math.impl.PointHelper; -import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.components.events.GuiEventListener; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal -public abstract class DraggableWidget extends WidgetWithBounds { - public boolean dragged = false; - private Point midPoint, startPoint; - private int relateX, relateY; - - public DraggableWidget(Point startingPoint) { - initWidgets(midPoint = startingPoint); - } - - public DraggableWidget() { - this(new Point(Minecraft.getInstance().getWindow().getGuiScaledWidth() / 2, Minecraft.getInstance().getWindow().getGuiScaledHeight() / 2)); - } - - protected abstract void initWidgets(Point midPoint); - - public abstract void updateWidgets(Point midPoint); - - public abstract Rectangle getGrabBounds(); - - public abstract Rectangle getDragBounds(); - - public final Point getMidPoint() { - return midPoint; - } - - @Override - public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) { - Point mouse = PointHelper.ofMouse(); - if (button == 0) { - if (!dragged) { - if (getGrabBounds().contains(mouse)) { - startPoint = new Point(midPoint.x, midPoint.y); - relateX = mouse.x - midPoint.x; - relateY = mouse.y - midPoint.y; - dragged = true; - } - } else { - Window window = minecraft.getWindow(); - midPoint = processMidPoint(midPoint, mouse, startPoint, window, relateX, relateY); - updateWidgets(midPoint); - } - return true; - } - for (GuiEventListener listener : children()) - if (listener.mouseDragged(mouseX, mouseY, button, deltaX, deltaY)) - return true; - return false; - } - - public abstract Point processMidPoint(Point midPoint, Point mouse, Point startPoint, Window window, int relateX, int relateY); - - @Override - public boolean mouseReleased(double mouseX, double mouseY, int button) { - if (button == 0) - if (dragged) { - dragged = false; - onMouseReleaseMidPoint(getMidPoint()); - return true; - } - for (GuiEventListener listener : children()) - if (listener.mouseReleased(mouseX, mouseY, button)) - return true; - return false; - } - - public void onMouseReleaseMidPoint(Point midPoint) { - } - -} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java index b1f6c5dcf..fa8104cd0 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java @@ -31,16 +31,22 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.ClientHelper; +import me.shedaniel.rei.api.client.entry.renderer.EntryRenderer; +import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; import me.shedaniel.rei.impl.client.gui.widget.DisplayedEntryWidget; import net.minecraft.ChatFormatting; +import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.Mth; import net.minecraft.world.inventory.tooltip.TooltipComponent; import org.jetbrains.annotations.Nullable; +import org.w3c.dom.css.Rect; import java.util.List; @@ -50,102 +56,98 @@ public class EntryListStackEntry extends DisplayedEntryWidget { private final CollapsingEntryListWidget parent; public EntryStack our; + public Widget extra; private NumberAnimator size = null; private CollapsedStack collapsedStack = null; private List collapsedBounds = null; - public EntryListStackEntry(CollapsingEntryListWidget parent, int x, int y, int entrySize, boolean zoomed) { - super(new Point(x, y), entrySize); + public EntryListStackEntry(CollapsingEntryListWidget parent, Slot slot, int entrySize, boolean zoomed) { + super(slot); this.parent = parent; + slot.size(entrySize); + slot.noBackground(); + slot.cyclingInterval(100L); + slot.appendContainsPointFunction((s, point) -> parent.containsChecked(point.x, point.y, true)); + if (zoomed) { - disableHighlight(); + slot.noHighlight(); size = ValueAnimator.ofDouble(1f) .withConvention(() -> { double mouseX = PointHelper.getMouseFloatingX(); double mouseY = PointHelper.getMouseFloatingY(); - int x1 = getBounds().getCenterX() - entrySize / 2; - int y1 = getBounds().getCenterY() - entrySize / 2; + int x1 = slot.getBounds().getCenterX() - entrySize / 2; + int y1 = slot.getBounds().getCenterY() - entrySize / 2; boolean hovering = mouseX >= x1 && mouseX < x1 + entrySize && mouseY >= y1 && mouseY < y1 + entrySize; return hovering ? 1.5 : 1.0; }, 200); } + + this.extra = new Widget() { + @Override + public void render(PoseStack poses, int mouseX, int mouseY, float delta) { + drawBackground(poses, mouseX, mouseY, delta); + drawExtra(poses, mouseX, mouseY, delta); + } + + @Override + public List children() { + return List.of(); + } + }; } - @Override - public void drawExtra(PoseStack matrices, int mouseX, int mouseY, float delta) { + public static EntryListStackEntry createSlot(CollapsingEntryListWidget parent, int x, int y, int entrySize, boolean zoomed) { + return new EntryListStackEntry(parent, Widgets.createSlot(new Point(x, y)), entrySize, zoomed); + } + + private void drawExtra(PoseStack matrices, int mouseX, int mouseY, float delta) { if (size != null) { size.update(delta); - int centerX = getBounds().getCenterX(); - int centerY = getBounds().getCenterY(); + int centerX = slot.getBounds().getCenterX(); + int centerY = slot.getBounds().getCenterY(); int entrySize = (int) Math.round(entrySize() * size.value()); - getBounds().setBounds(centerX - entrySize / 2, centerY - entrySize / 2, entrySize, entrySize); - } - super.drawExtra(matrices, mouseX, mouseY, delta); - } - - @Override - public EntryStack getCurrentEntry() { - if (our != null) { - if (CachedEntryListRender.cachedTextureLocation != null) { - return our; - } + slot.getBounds().setBounds(centerX - entrySize / 2, centerY - entrySize / 2, entrySize, entrySize); } - - return super.getCurrentEntry(); } - @Override - public boolean containsMouse(double mouseX, double mouseY) { - return super.containsMouse(mouseX, mouseY) && parent.containsChecked(mouseX, mouseY, true); - } - - @Override - public void drawBackground(PoseStack matrices, int mouseX, int mouseY, float delta) { - Rectangle bounds = getBounds(); + private void drawBackground(PoseStack matrices, int mouseX, int mouseY, float delta) { + Rectangle bounds = slot.getBounds(); if (collapsedStack != null) { fillGradient(matrices, bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), 0x34FFFFFF, 0x34FFFFFF); } - - super.drawBackground(matrices, mouseX, mouseY, delta); } - @Override - protected void drawCurrentEntry(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (collapsedStack != null && !collapsedStack.isExpanded()) { - Rectangle bounds = getBounds(); - List> stacks = collapsedStack.getIngredient(); - float fullSize = bounds.getWidth(); - - matrices.pushPose(); - matrices.translate(0, 0, 10); + protected void drawCollapsedStack(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { + List> stacks = collapsedStack.getIngredient(); + float fullSize = bounds.getWidth(); + + matrices.pushPose(); + matrices.translate(0, 0, 10); + + for (int i = stacks.size() - 1; i >= 0; i--) { + EntryStack stack = stacks.get(i); - for (int i = stacks.size() - 1; i >= 0; i--) { - EntryStack stack = stacks.get(i); - - if (i >= collapsedBounds.size()) { - continue; - } - - FloatingRectangle value = collapsedBounds.get(i); - double x = bounds.x + value.x * fullSize; - double y = bounds.y + value.y * fullSize; - - double scaledSize = value.width * fullSize; - - stack.render(matrices, new Rectangle(x - scaledSize / 2, y - scaledSize / 2, scaledSize, scaledSize), mouseX, mouseY, delta); - - matrices.translate(0, 0, 10); + if (i >= collapsedBounds.size()) { + continue; } - matrices.popPose(); - } else { - super.drawCurrentEntry(matrices, mouseX, mouseY, delta); + FloatingRectangle value = collapsedBounds.get(i); + double x = bounds.x + value.x * fullSize; + double y = bounds.y + value.y * fullSize; + + double scaledSize = value.width * fullSize; + + stack.render(matrices, new Rectangle(x - scaledSize / 2, y - scaledSize / 2, scaledSize, scaledSize), mouseX, mouseY, delta); + + matrices.translate(0, 0, 10); } + + matrices.popPose(); } @Override - protected boolean doAction(double mouseX, double mouseY, int button) { + public boolean doMouse(Slot slot, double mouseX, double mouseY, int button) { if (collapsedStack != null) { parent.updatedCount++; collapsedStack.setExpanded(!collapsedStack.isExpanded()); @@ -154,7 +156,7 @@ protected boolean doAction(double mouseX, double mouseY, int button) { return true; } - return super.doAction(mouseX, mouseY, button); + return super.doMouse(slot, mouseX, mouseY, button); } public void collapsed(CollapsedStack collapsedStack) { @@ -174,11 +176,10 @@ else if (ingredient.size() == 1) { } @Override - @Nullable - public Tooltip getCurrentTooltip(Point point) { + public Tooltip apply(Tooltip tooltip) { if (this.collapsedStack != null) { if (!this.collapsedStack.isExpanded()) { - Tooltip tooltip = Tooltip.create(point, new TranslatableComponent("text.rei.collapsed.entry", collapsedStack.getName())); + tooltip = Tooltip.create(new Point(tooltip.getX(), tooltip.getY()), new TranslatableComponent("text.rei.collapsed.entry", collapsedStack.getName())); tooltip.add((TooltipComponent) new CollapsedEntriesTooltip(collapsedStack)); tooltip.add(new TranslatableComponent("text.rei.collapsed.entry.hint.expand", collapsedStack.getName(), collapsedStack.getIngredient().size()) .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC)); @@ -187,8 +188,8 @@ public Tooltip getCurrentTooltip(Point point) { } } - Tooltip tooltip = super.getCurrentTooltip(point); - if (tooltip != null && this.collapsedStack != null) { + tooltip = super.apply(tooltip); + if (this.collapsedStack != null) { tooltip.entries().add(Mth.clamp(tooltip.entries().size() - 1, 0, tooltip.entries().size() - 1), Tooltip.entry(new TranslatableComponent("text.rei.collapsed.entry.hint.collapse", collapsedStack.getName(), collapsedStack.getIngredient().size()) .withStyle(ChatFormatting.GRAY, ChatFormatting.ITALIC))); } @@ -200,8 +201,18 @@ public CollapsedStack getCollapsedStack() { return collapsedStack; } - @Override - protected long getCyclingInterval() { - return 100; + public void updateEntries() { + if (collapsedStack != null && !collapsedStack.isExpanded()) { + EntryStack rewrap = slot.getCurrentEntry().rewrap(); + slot.clearEntries(); + slot.entry(ClientEntryStacks.setRenderer(rewrap, (EntryRenderer) (entry, matrices, bounds, mouseX, mouseY, delta) -> { + drawCollapsedStack(matrices, bounds, mouseX, mouseY, delta); + })); + } else if (our != null) { + if (CachedEntryListRender.cachedTextureLocation != null) { + slot.clearEntries(); + slot.entry(our); + } + } } } \ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java index 075dd910f..2781431c1 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java @@ -50,7 +50,6 @@ import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; import me.shedaniel.rei.impl.client.gui.widget.region.RegionRenderingDebugger; import net.minecraft.client.Minecraft; @@ -200,9 +199,9 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { EntryStack cheatsAs = stack.cheatsAs(); stack = cheatsAs.isEmpty() ? stack : cheatsAs; } - for (Widget child : children()) { - if (child.containsMouse(mouseX, mouseY) && child instanceof EntryWidget widget) { - if (widget.cancelDeleteItems(stack)) { + for (Slot slot : getSlots()) { + if (slot.containsMouse(mouseX, mouseY)) { + if (cancelDeleteItems(slot, stack)) { return; } } @@ -229,7 +228,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { @Override public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (containsChecked(mouse(), false)) - for (Widget widget : getEntryWidgets()) + for (Widget widget : getSlots()) if (widget.keyPressed(keyCode, scanCode, modifiers)) return true; return false; @@ -282,7 +281,7 @@ public void updateSearch(String searchTerm, boolean ignoreLastSearch) { @Override public List children() { - return getEntryWidgets(); + return getSlots(); } @Override @@ -306,9 +305,9 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { } boolean canDelete = true; - for (Widget child : children()) { - if (child.containsMouse(mouseX, mouseY) && child instanceof EntryWidget widget) { - if (widget.cancelDeleteItems(stack)) { + for (Slot slot : getSlots()) { + if (slot.containsMouse(mouseX, mouseY)) { + if (cancelDeleteItems(slot, stack)) { canDelete = false; break; } @@ -327,11 +326,27 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { return false; } + private boolean cancelDeleteItems(Slot slot, EntryStack stack) { + if (!slot.isInteractable() || !ConfigObject.getInstance().isGrabbingItems()) + return false; + if (ClientHelper.getInstance().isCheating() && !Screen.hasControlDown() && !(Minecraft.getInstance().screen instanceof DisplayScreen)) { + EntryStack entry = slot.getCurrentEntry().copy(); + if (!entry.isEmpty()) { + if (entry.getType() != VanillaEntryTypes.ITEM) { + EntryStack cheatsAs = entry.cheatsAs(); + entry = cheatsAs.isEmpty() ? entry : cheatsAs; + } + return EntryStacks.equalsExact(entry, stack); + } + } + return false; + } + @Override public EntryStack getFocusedStack() { Point mouse = mouse(); if (containsChecked(mouse, false)) { - for (Slot entry : getEntryWidgets()) { + for (Slot entry : getSlots()) { EntryStack currentEntry = entry.getCurrentEntry(); if (!currentEntry.isEmpty() && entry.containsMouse(mouse)) { return currentEntry.copy(); @@ -341,7 +356,7 @@ public EntryStack getFocusedStack() { return EntryStack.empty(); } - protected abstract List getEntryWidgets(); + protected abstract List getSlots(); public void init(ScreenOverlayImpl overlay) { } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java index 79072c5da..83e0f7d45 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.client.gui.widget.entrylist; +import com.google.common.collect.Iterators; import com.google.common.collect.Lists; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; @@ -31,10 +32,7 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; -import me.shedaniel.rei.api.client.gui.widgets.BatchedSlots; -import me.shedaniel.rei.api.client.gui.widgets.Button; -import me.shedaniel.rei.api.client.gui.widgets.Widget; -import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; @@ -43,19 +41,13 @@ import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.changelog.ChangelogLoader; import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; -import me.shedaniel.rei.impl.client.gui.widget.DefaultDisplayChoosePageWidget; -import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; -import net.minecraft.ChatFormatting; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.Mth; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Random; +import java.util.*; import java.util.stream.Stream; public class PaginatedEntryListWidget extends CollapsingEntryListWidget { @@ -86,10 +78,10 @@ protected void renderEntries(boolean fastEntryRendering, PoseStack matrices, int } if (entry.our == null) { - CachedEntryListRender.Sprite sprite = CachedEntryListRender.get(entry.getCurrentEntry()); + CachedEntryListRender.Sprite sprite = CachedEntryListRender.get(entry.slot.getCurrentEntry()); if (sprite != null) { CachingEntryRenderer renderer = new CachingEntryRenderer(sprite, this::getBlitOffset); - entry.our = ClientEntryStacks.setRenderer(entry.getCurrentEntry().copy().cast(), stack -> renderer); + entry.our = ClientEntryStacks.setRenderer(entry.slot.getCurrentEntry().copy().cast(), stack -> renderer); } } } @@ -100,13 +92,27 @@ protected void renderEntries(boolean fastEntryRendering, PoseStack matrices, int for (EntryListStackEntry entry : entries) { CollapsedStack collapsedStack = entry.getCollapsedStack(); if (collapsedStack != null && !collapsedStack.isExpanded()) { - slots.addUnbatched(entry); + slots.addUnbatched(entry.slot); } else { - slots.add(entry); + slots.add(entry.slot); } } } else { - slots.addAllUnbatched(entries); + slots.addAllUnbatched(new AbstractCollection<>() { + @Override + public Iterator iterator() { + return Iterators.transform(entries.iterator(), entry -> entry.slot); + } + + @Override + public int size() { + return entries.size(); + } + }); + } + + for (EntryListStackEntry entry : entries) { + entry.extra.render(matrices, mouseX, mouseY, delta); } if (debugger.debugTime) slots.addDebugger(debugger.size, debugger.time); @@ -132,7 +138,7 @@ protected void updateEntries(int entrySize, boolean zoomed) { int slotX = currentX * entrySize + innerBounds.x; int slotY = currentY * entrySize + innerBounds.y; if (notSteppingOnExclusionZones(slotX - 1, slotY - 1, entrySize, entrySize)) { - entries.add((EntryListStackEntry) new EntryListStackEntry(this, slotX, slotY, entrySize, zoomed).disableBackground()); + entries.add(EntryListStackEntry.createSlot(this, slotX, slotY, entrySize, zoomed)); } } } @@ -144,14 +150,17 @@ protected void updateEntries(int entrySize, boolean zoomed) { /*EntryStack | List>*/ Object stack = subList.get(i); EntryListStackEntry entry = entries.get(i + Math.max(0, -page * entries.size())); - entry.clearEntries(); + Slot slot = entry.slot; + slot.clearEntries(); if (stack instanceof EntryStack entryStack) { - entry.entry(entryStack); + slot.entry(entryStack); } else { - entry.entries((List>) stack); + slot.entries((List>) stack); } + entry.updateEntries(); + CollapsedStack collapsedStack = indexedCollapsedStack.get(i + skip); if (collapsedStack != null && collapsedStack.getIngredient().size() > 1) { entry.collapsed(collapsedStack); @@ -174,12 +183,22 @@ public void setStacks(List | List>*/ Object> stack @Override public Stream> getEntries() { - return entries.stream().map(EntryWidget::getCurrentEntry); + return entries.stream().map(entry -> entry.slot.getCurrentEntry()); } @Override - protected List getEntryWidgets() { - return entries; + protected List getSlots() { + return new AbstractList<>() { + @Override + public int size() { + return entries.size(); + } + + @Override + public Slot get(int index) { + return entries.get(index).slot; + } + }; } @Override @@ -250,16 +269,9 @@ public void init(ScreenOverlayImpl overlay) { helper.setBlitOffset(helper.getBlitOffset() - 1); })); this.additionalWidgets.add(Widgets.createClickableLabel(new Point(overlayBounds.x + ((overlayBounds.width - 18) / 2), overlayBounds.y + (ConfigObject.getInstance().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 10), NarratorChatListener.NO_TITLE, label -> { - if (!Screen.hasShiftDown()) { - setPage(0); - updateEntriesPosition(); - } else { - ScreenOverlayImpl.getInstance().choosePageWidget = new DefaultDisplayChoosePageWidget(page -> { - setPage(page); - updateEntriesPosition(); - }, getPage(), getTotalPages()); - } - }).tooltip(new TranslatableComponent("text.rei.go_back_first_page"), new TextComponent(" "), new TranslatableComponent("text.rei.shift_click_to", new TranslatableComponent("text.rei.choose_page")).withStyle(ChatFormatting.GRAY)).focusable(false).onRender((matrices, label) -> { + setPage(0); + updateEntriesPosition(); + }).tooltip(new TranslatableComponent("text.rei.go_back_first_page")).focusable(false).onRender((matrices, label) -> { label.setClickable(getTotalPages() > 1); label.setMessage(new TextComponent(String.format("%s/%s", getPage() + 1, Math.max(getTotalPages(), 1)))); }).rainbow(new Random().nextFloat() < 1.0E-4D || ClientHelperImpl.getInstance().isAprilFools.get())); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java index e706da671..5fd238d70 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java @@ -33,12 +33,13 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.gui.widgets.BatchedSlots; +import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import net.minecraft.client.gui.screens.Screen; import net.minecraft.util.Mth; +import java.util.AbstractList; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -73,7 +74,8 @@ protected void renderEntries(boolean fastEntryRendering, PoseStack matrices, int int i = nextIndex; for (int cont = nextIndex; cont < entries.size(); cont++) { EntryListStackEntry entry = entries.get(cont); - Rectangle entryBounds = entry.getBounds(); + Slot slot = entry.slot; + Rectangle entryBounds = slot.getBounds(); entryBounds.y = entry.backupY - scrolling.scrollAmountInt(); if (entryBounds.y > this.bounds.getMaxY()) break; @@ -81,27 +83,31 @@ protected void renderEntries(boolean fastEntryRendering, PoseStack matrices, int if (notSteppingOnExclusionZones(entryBounds.x, entryBounds.y, entryBounds.width, entryBounds.height)) { /*EntryStack | List>*/ Object stack = stacks.get(i++); - entry.clearEntries(); + slot.clearEntries(); if (stack instanceof EntryStack entryStack) { if (!entryStack.isEmpty()) { - entry.entry(entryStack); - slots.add(entry); + slot.entry(entryStack); + slots.add(slot); } } else { List> ingredient = (List>) stack; if (!ingredient.isEmpty()) { - entry.entries(ingredient); - slots.addUnbatched(entry); + slot.entries(ingredient); + slots.addUnbatched(slot); } } + entry.updateEntries(); + CollapsedStack collapsedStack = indexedCollapsedStack.get(i - 1); if (collapsedStack != null && collapsedStack.getIngredient().size() > 1) { entry.collapsed(collapsedStack); } else { entry.collapsed(null); } + + entry.extra.render(matrices, mouseX, mouseY, delta); } else { blockedCount++; } @@ -128,7 +134,7 @@ protected void updateEntries(int entrySize, boolean zoomed) { for (int i = 0; i < slotsToPrepare; i++) { int xPos = currentX * entrySize + innerBounds.x; int yPos = currentY * entrySize + innerBounds.y; - entries.add((EntryListStackEntry) new EntryListStackEntry(this, xPos, yPos, entrySize, zoomed).disableBackground()); + entries.add(EntryListStackEntry.createSlot(this, xPos, yPos, entrySize, zoomed)); currentX++; if (currentX >= width) { currentX = 0; @@ -179,13 +185,23 @@ public Stream> getEntries() { int nextIndex = skip * innerBounds.width / entrySize(); return (Stream>) (Stream>) entries.stream() .skip(nextIndex) - .filter(entry -> entry.getBounds().y <= this.bounds.getMaxY()) - .map(EntryWidget::getCurrentEntry) + .filter(entry -> entry.slot.getBounds().y <= this.bounds.getMaxY()) + .map(entry -> entry.slot.getCurrentEntry()) .filter(Predicates.not(EntryStack::isEmpty)); } @Override - protected List getEntryWidgets() { - return entries; + protected List getSlots() { + return new AbstractList<>() { + @Override + public int size() { + return entries.size(); + } + + @Override + public Slot get(int index) { + return entries.get(index).slot; + } + }; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java index ec4fd710f..14aaa3381 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java @@ -37,7 +37,8 @@ import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.impl.client.ClientHelperImpl; -import me.shedaniel.rei.impl.client.gui.widget.AutoCraftingEvaluator; +import me.shedaniel.rei.impl.client.ClientInternals; +import me.shedaniel.rei.impl.client.provider.AutoCraftingEvaluator; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.TextComponent; @@ -48,6 +49,7 @@ import java.util.Map; import java.util.UUID; +@SuppressWarnings("UnstableApiUsage") public class DisplayEntry extends WidgetWithBounds { private final LazyResettable> widgets = new LazyResettable<>(this::setupWidgets); private final DisplayHistoryWidget parent; @@ -171,22 +173,25 @@ public void render(PoseStack poses, int mouseX, int mouseY, float delta) { Vector4f mouse = new Vector4f((float) mouseX, (float) mouseY, 0, 1); mouse.transform(poses.last().pose()); - AutoCraftingEvaluator.AutoCraftingResult result = AutoCraftingEvaluator.evaluateAutoCrafting(false, false, display, display::provideInternalDisplayIds); + AutoCraftingEvaluator.Result result = ClientInternals.getAutoCraftingEvaluator(display) + .buildRenderer() + .buildTooltipRenderer() + .get(); - plusButton.setEnabled(result.successful); - plusButton.setTint(result.tint); + plusButton.setEnabled(result.isSuccessful()); + plusButton.setTint(result.getTint()); plusButton.getBounds().setBounds(new Rectangle(bounds.getMaxX() - 14, bounds.getMaxY() - 14, 10, 10)); - if (result.hasApplicable) { + if (result.isApplicable()) { plusButton.setText(new TextComponent("+")); plusButton.render(poses, Math.round(mouse.x()), Math.round(mouse.y()), delta); poses.popPose(); - if (plusButton.containsMouse(Math.round(mouse.x()), Math.round(mouse.y()))) { - result.tooltipRenderer.accept(new Point(mouseX, mouseY), Tooltip::queue); + if (plusButton.containsMouse(Math.round(mouse.x()), Math.round(mouse.y())) && result.getTooltipRenderer() != null) { + result.getTooltipRenderer().accept(new Point(mouseX, mouseY), Tooltip::queue); } - if (result.renderer != null) { + if (result.getRenderer() != null) { poses.pushPose(); if (!stable || !target.equals(bounds)) { poses.translate(0, 0, 600); @@ -194,7 +199,7 @@ public void render(PoseStack poses, int mouseX, int mouseY, float delta) { poses.translate(xOffset(), yOffset(), 0); poses.scale(xScale(), yScale(), 1.0F); - result.renderer.render(poses, mouseX, mouseY, delta, widgets.get(), getBounds(), display); + result.getRenderer().render(poses, mouseX, mouseY, delta, widgets.get(), getBounds(), display); poses.popPose(); } } else { @@ -226,7 +231,10 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { } if (button == 0 && plusButton.containsMouse(mouseX + xOffset, mouseY)) { - AutoCraftingEvaluator.evaluateAutoCrafting(true, Screen.hasShiftDown(), display, display::provideInternalDisplayIds); + ClientInternals.getAutoCraftingEvaluator(display) + .actuallyCraft() + .stacked(Screen.hasShiftDown()) + .get(); Widgets.produceClickSound(); return true; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java index e52f6dbb5..55013445a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java @@ -29,11 +29,12 @@ import me.shedaniel.math.FloatingPoint; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.drag.DraggableStack; +import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; @@ -47,6 +48,7 @@ import net.minecraft.util.Mth; import org.jetbrains.annotations.Nullable; +import java.util.AbstractList; import java.util.List; import java.util.function.Predicate; @@ -65,7 +67,7 @@ public FavoritesPanelEntriesRow(FavoritesPanel panel, List entrie this.panel = panel; this.entries = entries; int entrySize = entrySize(); - this.widgets = CollectionUtils.map(this.entries, entry -> new SectionFavoriteWidget(new Point(0, 0), entrySize, entry)); + this.widgets = CollectionUtils.map(this.entries, entry -> new SectionFavoriteWidget(Widgets.createSlot(new Point(0, 0)), entrySize, entry)); for (SectionFavoriteWidget widget : this.widgets) { widget.size.setTo(entrySize * 100, 300); @@ -89,18 +91,29 @@ public void render(PoseStack matrices, Rectangle innerBounds, int x, int y, int updateEntriesPosition(entry -> true); for (SectionFavoriteWidget widget : widgets) { widget.update(delta); + Slot slot = widget.slot; - if (widget.getBounds().getMaxY() > lastY && widget.getBounds().getY() <= lastY + rowHeight) { - if (widget.getCurrentEntry().isEmpty()) + if (slot.getBounds().getMaxY() > lastY && slot.getBounds().getY() <= lastY + rowHeight) { + if (slot.getCurrentEntry().isEmpty()) continue; - widget.render(matrices, mouseX, mouseY, delta); + slot.render(matrices, mouseX, mouseY, delta); } } } @Override public List children() { - return widgets; + return new AbstractList() { + @Override + public GuiEventListener get(int index) { + return widgets.get(index).slot; + } + + @Override + public int size() { + return widgets.size(); + } + }; } @Override @@ -121,10 +134,10 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { @Nullable public DraggableStack getHoveredStack(double mouseX, double mouseY) { for (SectionFavoriteWidget widget : widgets) { - if (widget.containsMouse(mouseX, mouseY + panel.getScrolledAmount())) { + if (widget.slot.containsMouse(mouseX, mouseY + panel.getScrolledAmount())) { RealRegionEntry entry = new RealRegionEntry<>(panel.getParent().getRegion(), widget.entry.copy(), entrySize()); entry.size.setAs(entrySize() * 100); - return new RegionDraggableStack<>(entry, widget); + return new RegionDraggableStack<>(entry, widget.slot); } } @@ -134,7 +147,7 @@ public DraggableStack getHoveredStack(double mouseX, double mouseY) { @Nullable public EntryStack getFocusedStack(Point mouse) { for (SectionFavoriteWidget widget : widgets) { - if (widget.containsMouse(mouse)) { + if (widget.slot.containsMouse(mouse)) { return ClientEntryStacks.of(widget.entry.getRenderer(false)).copy(); } } @@ -143,15 +156,17 @@ public EntryStack getFocusedStack(Point mouse) { } private class SectionFavoriteWidget extends DisplayedEntryWidget { - private ValueAnimator pos = ValueAnimator.ofFloatingPoint(); - private NumberAnimator size = ValueAnimator.ofDouble(); - private FavoriteEntry entry; + private final ValueAnimator pos = ValueAnimator.ofFloatingPoint(); + private final NumberAnimator size = ValueAnimator.ofDouble(); + private final FavoriteEntry entry; - protected SectionFavoriteWidget(Point point, int entrySize, FavoriteEntry entry) { - super(point, entrySize); + protected SectionFavoriteWidget(Slot slot, int entrySize, FavoriteEntry entry) { + super(slot); this.entry = entry; - entry(ClientEntryStacks.of(entry.getRenderer(true))); - disableBackground(); + slot.size(entrySize); + slot.entry(ClientEntryStacks.of(entry.getRenderer(true))); + slot.appendContainsPointFunction((s, point) -> panel.getInnerBounds().contains(point)); + slot.noBackground(); } public void moveTo(boolean animated, int xPos, int yPos) { @@ -161,22 +176,17 @@ public void moveTo(boolean animated, int xPos, int yPos) { public void update(float delta) { this.pos.update(delta); this.size.update(delta); - this.getBounds().width = this.getBounds().height = (int) Math.round(this.size.doubleValue() / 100); + slot.getBounds().width = slot.getBounds().height = (int) Math.round(this.size.doubleValue() / 100); double offsetSize = (entrySize() - this.size.doubleValue() / 100) / 2; - this.getBounds().x = (int) Math.round(pos.value().x + offsetSize); - this.getBounds().y = (int) Math.round(pos.value().y + offsetSize) + lastY; + slot.getBounds().x = (int) Math.round(pos.value().x + offsetSize); + slot.getBounds().y = (int) Math.round(pos.value().y + offsetSize) + lastY; } @Override - @Nullable - public Tooltip getCurrentTooltip(Point point) { - point = PointHelper.ofMouse(); - if (!panel.getInnerBounds().contains(point)) return null; - Tooltip tooltip = super.getCurrentTooltip(point); - if (tooltip != null) { - tooltip.add(ImmutableTextComponent.EMPTY); - tooltip.add(new TranslatableComponent("tooltip.rei.drag_to_add_favorites")); - } + public Tooltip apply(Tooltip tooltip) { + tooltip = super.apply(tooltip); + tooltip.add(ImmutableTextComponent.EMPTY); + tooltip.add(new TranslatableComponent("tooltip.rei.drag_to_add_favorites")); return tooltip; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java index fd9a5940a..8d4fdd4f1 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java @@ -38,14 +38,10 @@ import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.entry.region.RegionEntry; import me.shedaniel.rei.api.client.gui.drag.*; -import me.shedaniel.rei.api.client.gui.widgets.BatchedSlots; -import me.shedaniel.rei.api.client.gui.widgets.Widget; -import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; -import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.common.entry.EntrySerializer; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; import net.minecraft.client.gui.screens.Screen; import net.minecraft.util.Mth; import net.minecraft.util.Tuple; @@ -124,11 +120,15 @@ public void render(PoseStack poses, int mouseX, int mouseY, float delta) { ScissorsHandler.INSTANCE.scissor(bounds); - Stream> entryStream = this.entriesList.stream() - .filter(entry -> entry.getBounds().getMaxY() >= this.bounds.getY() && entry.getBounds().y <= this.bounds.getMaxY()); + Iterable> entryIterable = Iterables.filter(entriesList, + entry -> entry.slot.getBounds().getMaxY() >= this.bounds.getY() && entry.slot.getBounds().y <= this.bounds.getMaxY()); BatchedSlots slots = Widgets.createBatchedSlots(); - entryStream.collect(Collectors.toCollection(() -> slots)); + for (RegionEntryWidget entry : entryIterable) { + entry.renderExtra(poses, mouseX, mouseY, delta); + slots.add(entry.slot); + } + slots.render(poses, mouseX, mouseY, delta); updatePosition(delta); @@ -183,7 +183,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { public DraggableStack getHoveredStack(DraggingContext context, double mouseX, double mouseY) { if (innerBounds.contains(mouseX, mouseY)) { for (RealRegionEntry entry : entries.values()) { - if (entry.getWidget().containsMouse(mouseX, mouseY) && listener.canBeDragged(entry)) { + if (entry.getSlot().containsMouse(mouseX, mouseY) && listener.canBeDragged(entry)) { return new RegionDraggableStack<>(entry, null); } } @@ -195,8 +195,8 @@ public EntryStack getFocusedStack() { Point mouse = mouse(); if (innerBounds.contains(mouse)) { for (RealRegionEntry entry : entries.values()) { - if (entry.getWidget().containsMouse(mouse)) { - return entry.getWidget().getCurrentEntry().copy(); + if (entry.getSlot().containsMouse(mouse)) { + return entry.getSlot().getCurrentEntry().copy(); } } } @@ -205,8 +205,9 @@ public EntryStack getFocusedStack() { public Stream> getEntries() { return (Stream>) (Stream>) entriesList.stream() + .map(entry -> entry.slot) .filter(entry -> entry.getBounds().getMaxY() >= this.bounds.getY() && entry.getBounds().y <= this.bounds.getMaxY()) - .map(EntryWidget::getCurrentEntry) + .map(Slot::getCurrentEntry) .filter(entry -> !entry.isEmpty()); } @@ -307,8 +308,8 @@ public boolean isEmpty() { public void applyNewEntriesList() { this.entriesList = Stream.concat(entries.values().stream().map(RealRegionEntry::getWidget), removedEntries.values().stream().map(RealRegionEntry::getWidget)).collect(Collectors.toList()); this.children = Stream.>of( - entries.values().stream().map(RealRegionEntry::getWidget), - removedEntries.values().stream().map(RealRegionEntry::getWidget) + entries.values().stream().map(RealRegionEntry::getSlot), + removedEntries.values().stream().map(RealRegionEntry::getSlot) ).flatMap(Function.identity()).collect(Collectors.toList()); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java index ac69d5558..c5f7bf9cc 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java @@ -28,6 +28,7 @@ import me.shedaniel.math.FloatingPoint; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.entry.region.RegionEntry; +import me.shedaniel.rei.api.client.gui.widgets.Slot; import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; @@ -42,7 +43,7 @@ public class RealRegionEntry> { public RealRegionEntry(EntryStacksRegionWidget region, T entry, int entrySize) { this.region = region; this.entry = entry; - this.widget = (RegionEntryWidget) new RegionEntryWidget<>(this, 0, 0, entrySize).disableBackground(); + this.widget = RegionEntryWidget.createSlot(this, 0, 0, entrySize); } public void remove() { @@ -56,16 +57,20 @@ public void remove() { public void update(double delta) { this.pos.update(delta); this.size.update(delta); - this.getWidget().getBounds().width = this.getWidget().getBounds().height = (int) Math.round(this.size.doubleValue() / 100); + this.getSlot().getBounds().width = this.getSlot().getBounds().height = (int) Math.round(this.size.doubleValue() / 100); double offsetSize = (entrySize() - this.size.doubleValue() / 100) / 2; - this.getWidget().getBounds().x = (int) Math.round(pos.value().x + offsetSize); - this.getWidget().getBounds().y = (int) Math.round(pos.value().y + offsetSize) - (int) region.getScrollAmount(); + this.getSlot().getBounds().x = (int) Math.round(pos.value().x + offsetSize); + this.getSlot().getBounds().y = (int) Math.round(pos.value().y + offsetSize) - (int) region.getScrollAmount(); } public RegionEntryWidget getWidget() { return widget; } + public Slot getSlot() { + return widget.slot; + } + public boolean isHidden() { return hidden; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java index 62193be4c..468feb536 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java @@ -31,6 +31,8 @@ import me.shedaniel.rei.api.client.entry.region.RegionEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; +import me.shedaniel.rei.api.client.gui.widgets.Slot; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; @@ -45,29 +47,25 @@ public class RegionEntryWidget> extends DisplayedEntryWidget { private final RealRegionEntry entry; - RegionEntryWidget(RealRegionEntry entry, int x, int y, int entrySize) { - super(new Point(x, y), entrySize); + RegionEntryWidget(RealRegionEntry entry, Slot slot, int entrySize) { + super(slot); this.entry = entry; - this.clearEntries().entry(entry.getEntry().toStack()); + slot.size(entrySize); + slot.entry(entry.getEntry().toStack()); + slot.setFavoriteEntryFunction(stack -> asFavoriteEntry()); + slot.setNoticeMark(Slot.FAVORITE); + slot.noBackground(); } - @Override - protected FavoriteEntry asFavoriteEntry() { - return entry.region.listener.asFavorite(entry); - } - - @Override - public boolean containsMouse(double mouseX, double mouseY) { - return super.containsMouse(mouseX, mouseY) && entry.region.containsMouse(mouseX, mouseY); + public static > RegionEntryWidget createSlot(RealRegionEntry entry, int x, int y, int entrySize) { + return new RegionEntryWidget<>(entry, Widgets.createSlot(new Point(x, y)), entrySize); } - @Override - protected boolean reverseFavoritesAction() { - return true; + protected FavoriteEntry asFavoriteEntry() { + return entry.region.listener.asFavorite(entry); } - @Override - public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { + public void renderExtra(PoseStack matrices, int mouseX, int mouseY, float delta) { Optional overlayOptional = REIRuntime.getInstance().getOverlay(); Optional>> menuEntries = entry.getEntry().getMenuEntries(); FloatingPoint value = entry.pos.value(); @@ -77,12 +75,9 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { MenuAccess access = overlay.menuAccess(); UUID uuid = entry.getEntry().getUuid(); - access.openOrClose(uuid, getBounds(), () -> + access.openOrClose(uuid, slot.getBounds(), () -> CollectionUtils.map(menuEntries.get().get(), entry -> convertMenu(overlay, entry))); } - Vector4f vector4f = new Vector4f(mouseX, mouseY, 0, 1.0F); - vector4f.transform(matrices.last().pose()); - super.render(matrices, (int) vector4f.x(), (int) vector4f.y(), delta); } private MenuEntry convertMenu(ScreenOverlayImpl overlay, FavoriteMenuEntry entry) { @@ -126,8 +121,8 @@ public void setZ(int z) { } @Override - protected boolean doAction(double mouseX, double mouseY, int button) { - return entry.getEntry().doAction(button) || super.doAction(mouseX, mouseY, button); + public boolean doMouse(Slot slot, double mouseX, double mouseY, int button) { + return entry.getEntry().doAction(button) || super.doMouse(slot, mouseX, mouseY, button); } public RealRegionEntry getEntry() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java index d8b77d6f6..f0eefef0d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java @@ -59,11 +59,21 @@ default void setFormatter(TextFormatter formatter) { delegateTextField().setFormatter(formatter); } + @Override + default TextFormatter getFormatter() { + return delegateTextField().getFormatter(); + } + @Override default void setSuggestionRenderer(SuggestionRenderer renderer) { delegateTextField().setSuggestionRenderer(renderer); } + @Override + default SuggestionRenderer getSuggestionRenderer() { + return delegateTextField().getSuggestionRenderer(); + } + @Override default void setTextTransformer(Function textTransformer) { delegateTextField().setTextTransformer(textTransformer); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java index 919108b6f..76c502d7b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java @@ -43,7 +43,6 @@ import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; -import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListEntries; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.HighlightInfo; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.PartHighlightInfo; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.QuoteHighlightInfo; @@ -114,7 +113,7 @@ public FormattedCharSequence format(String text, int index) { return TextTransformations.forwardWithTransformation(text, (s, charIndex, c) -> { HighlightInfo arg = highlighter.highlighted[charIndex + index]; Style style = Style.EMPTY; - if (isMain && EntryListEntries.INSTANCE.isEmpty() && !textField.getText().isEmpty()) { + if (isMain && ScreenOverlayImpl.getEntryListWidget().getEntries().findAny().isEmpty() && !textField.getText().isEmpty()) { style = ERROR_STYLE; } if (arg instanceof PartHighlightInfo part) { @@ -154,15 +153,6 @@ public void addToHistory(String text) { } } - public void laterRender(PoseStack matrices, int mouseX, int mouseY, float delta) { - progress.update(delta); - RenderSystem.disableDepthTest(); - if (isMain) drawHint(matrices, mouseX, mouseY); - textField.setSuggestion(!textField.isFocused() && textField.getText().isEmpty() ? I18n.get("text.rei.search.field.suggestion") : null); - super.render(matrices, mouseX, mouseY, delta); - RenderSystem.enableDepthTest(); - } - private void drawHint(PoseStack poses, int mouseX, int mouseY) { boolean mouseDown = GLFW.glfwGetMouseButton(Minecraft.getInstance().getWindow().getWindow(), GLFW.GLFW_MOUSE_BUTTON_LEFT) != 0; boolean clicking = false; @@ -280,7 +270,7 @@ public int getBorderColor(TextField textField) { isHighlighting = isHighlighting && ConfigObject.getInstance().isInventoryHighlightingAllowed(); if (isMain && isHighlighting) { return 0xfff2ff0c; - } else if (isMain && EntryListEntries.INSTANCE.isEmpty() && !textField.getText().isEmpty()) { + } else if (isMain && ScreenOverlayImpl.getEntryListWidget().getEntries().findAny().isEmpty() && !textField.getText().isEmpty()) { return 0xffff5555; } else { return TextField.BorderColorProvider.DEFAULT.getBorderColor(textField); @@ -369,9 +359,12 @@ public boolean containsMouse(double mouseX, double mouseY) { @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - if (!isMain) { - laterRender(matrices, mouseX, mouseY, delta); - } + progress.update(delta); + RenderSystem.disableDepthTest(); + if (isMain) drawHint(matrices, mouseX, mouseY); + textField.setSuggestion(!textField.isFocused() && textField.getText().isEmpty() ? I18n.get("text.rei.search.field.suggestion") : null); + super.render(matrices, mouseX, mouseY, delta); + RenderSystem.enableDepthTest(); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java index ab16bef86..36fef8034 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java @@ -86,7 +86,7 @@ public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, @Override @Nullable public Tooltip getTooltip(TooltipContext context) { - return Tooltip.create(context.getPoint(), new TextComponent("Kirby"), ClientHelper.getInstance().getFormattedModFromModId("Dream Land")); + return Tooltip.create(context, new TextComponent("Kirby"), ClientHelper.getInstance().getFormattedModFromModId("Dream Land")); } })); } diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalCursorState.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalCursorState.java new file mode 100644 index 000000000..5319924f7 --- /dev/null +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalCursorState.java @@ -0,0 +1,32 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui; + +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public class InternalCursorState { + public static boolean isLeftMousePressed; + public static boolean isRightMousePressed; +} From 066205c5922646285c59f318d581632382248cad Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 26 Aug 2022 22:04:05 +0900 Subject: [PATCH 09/20] Make it run --- .../client/entry/type/EntryRegistryImpl.java | 3 ++ .../entry/type/EntryRegistryListener.java | 3 ++ ...nt.registry.entry.CollapsibleEntryRegistry | 1 + ...ei.api.common.entry.type.EntryTypeRegistry | 1 + ...lient.entry.renderer.EntryRendererRegistry | 1 + ....provider.DelegatingFavoriteEntryProvider} | 0 ...ent.provider.FavoritesEntriesListProvider} | 0 .../entry/type/PreFilteredEntryListImpl.java | 7 +++- .../impl/common/init/CoreInitialization.java | 2 +- .../common/logging/LoggerInitializer.java | 2 +- .../plugins/PluginManagerConstructorImpl.java | 38 +++++++++++++++++++ .../common/plugins/PluginManagerImpl.java | 2 +- ...l.common.provider.PluginManagerConstructor | 1 + ...i.client.search.method.InputMethodRegistry | 1 + .../client/view/ViewSearchBuilderImpl.java | 2 - ...niel.rei.api.client.view.ViewSearchBuilder | 1 + .../me.shedaniel.rei.api.client.view.Views | 1 + ... => MissingStacksTooltipProviderImpl.java} | 12 +++++- .../BatchedEntryRendererManager.java | 2 +- ...Provider.java => WidgetsProviderImpl.java} | 3 +- ...ient.provider.MissingStacksTooltipProvider | 1 + ...l.rei.impl.client.provider.WidgetsProvider | 1 + .../rei/impl/client/REIRuntimeImpl.java | 11 ++---- .../gui/overlay/AbstractScreenOverlay.java | 6 +++ .../screen/CompositeDisplayViewingScreen.java | 3 -- .../screen/DefaultDisplayViewingScreen.java | 3 -- .../init/RoughlyEnoughItemsInitializer.java | 1 - .../me.shedaniel.rei.api.client.ClientHelper | 1 + .../me.shedaniel.rei.api.client.REIRuntime | 1 + .../rei/impl/client/gui/InternalTextures.java | 2 + 30 files changed, 90 insertions(+), 23 deletions(-) create mode 100644 runtime-engine/entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry create mode 100644 runtime-engine/entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry create mode 100644 runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.entry.renderer.EntryRendererRegistry rename runtime-engine/favorites/src/main/resources/META-INF/services/{me.shedaniel.rei.impl.ClientInternals$DelegatingFavoriteEntryProvider => me.shedaniel.rei.impl.client.provider.DelegatingFavoriteEntryProvider} (100%) rename runtime-engine/favorites/src/main/resources/META-INF/services/{me.shedaniel.rei.impl.ClientInternals$FavoritesEntriesListProvider => me.shedaniel.rei.impl.client.provider.FavoritesEntriesListProvider} (100%) create mode 100644 runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerConstructorImpl.java create mode 100644 runtime-engine/plugins/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.PluginManagerConstructor create mode 100644 runtime-engine/search/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.search.method.InputMethodRegistry create mode 100644 runtime-engine/views/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.view.ViewSearchBuilder create mode 100644 runtime-engine/views/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.view.Views rename runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/{MissingStacksTooltipProvider.java => MissingStacksTooltipProviderImpl.java} (74%) rename runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/{WidgetsProvider.java => WidgetsProviderImpl.java} (98%) create mode 100644 runtime-frontend/widgets/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.MissingStacksTooltipProvider create mode 100644 runtime-frontend/widgets/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.WidgetsProvider create mode 100644 runtime/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.ClientHelper create mode 100644 runtime/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.REIRuntime diff --git a/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryImpl.java b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryImpl.java index 29c3ae419..266dfd47d 100644 --- a/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryImpl.java +++ b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryImpl.java @@ -67,6 +67,9 @@ public EntryRegistryImpl() { registryList = new NormalEntryRegistryList(); entriesHash = new LongOpenHashSet(); listeners.addAll(Internals.resolveServices(EntryRegistryListener.class)); + for (EntryRegistryListener listener : listeners) { + listener.attachRegistry(this); + } } @Override diff --git a/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryListener.java b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryListener.java index b1c59e0e7..2e93ed8c2 100644 --- a/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryListener.java +++ b/runtime-engine/entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/EntryRegistryListener.java @@ -24,6 +24,7 @@ package me.shedaniel.rei.impl.client.entry.type; import it.unimi.dsi.fastutil.longs.LongList; +import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -33,6 +34,8 @@ @ApiStatus.Internal public interface EntryRegistryListener { + default void attachRegistry(EntryRegistry registry) {} + default void addEntryAfter(@Nullable EntryStack afterEntry, EntryStack stack, long stackHashExact) {} default void addEntriesAfter(@Nullable EntryStack afterEntry, List> stacks, @Nullable LongList hashes) {} diff --git a/runtime-engine/entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry b/runtime-engine/entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry new file mode 100644 index 000000000..3210bfe57 --- /dev/null +++ b/runtime-engine/entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.entry.type.collapsed.CollapsibleEntryRegistryImpl \ No newline at end of file diff --git a/runtime-engine/entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry b/runtime-engine/entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry new file mode 100644 index 000000000..22783a762 --- /dev/null +++ b/runtime-engine/entries/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.entry.type.EntryTypeRegistryImpl \ No newline at end of file diff --git a/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.entry.renderer.EntryRendererRegistry b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.entry.renderer.EntryRendererRegistry new file mode 100644 index 000000000..b28d3384d --- /dev/null +++ b/runtime-engine/entry-types/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.entry.renderer.EntryRendererRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.entry.renderer.EntryRendererRegistryImpl \ No newline at end of file diff --git a/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$DelegatingFavoriteEntryProvider b/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.DelegatingFavoriteEntryProvider similarity index 100% rename from runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$DelegatingFavoriteEntryProvider rename to runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.DelegatingFavoriteEntryProvider diff --git a/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$FavoritesEntriesListProvider b/runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.FavoritesEntriesListProvider similarity index 100% rename from runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$FavoritesEntriesListProvider rename to runtime-engine/favorites/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.FavoritesEntriesListProvider diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java index f7bcc5ac3..2eb8f6d76 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/entry/type/PreFilteredEntryListImpl.java @@ -51,14 +51,19 @@ @ApiStatus.Internal public class PreFilteredEntryListImpl implements EntryRegistryListener, PreFilteredEntryList { - private final EntryRegistry registry = EntryRegistry.getInstance(); private final MutableLong lastRefilterWarning = new MutableLong(-1); + private EntryRegistry registry; private List> preFilteredList = Lists.newCopyOnWriteArrayList(); public PreFilteredEntryListImpl() { ClientInternals.attachInstanceSupplier(this, "preFilteredEntryList"); } + @Override + public void attachRegistry(EntryRegistry registry) { + this.registry = registry; + } + private static Predicate not(Predicate target) { Objects.requireNonNull(target); return (Predicate) target.negate(); diff --git a/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java index ff034ccf2..13a392e59 100644 --- a/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java +++ b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java @@ -71,7 +71,7 @@ public static void attachCommonInternals() { manager.registerReloadable(FluidSupportProvider.class); PluginManager serverManager = PluginManager.getServerInstance(); serverManager.registerReloadable(MenuInfoRegistry.class); - Internals.attachInstanceSupplier((Runnable) () -> reloadPlugins(null, null), "reloadREI"); + Internals.attachInstance((Runnable) () -> reloadPlugins(null, null), "reloadREI"); } public static void _reloadPlugins(@Nullable ReloadStage stage) { diff --git a/runtime-engine/logging/src/main/java/me/shedaniel/rei/impl/common/logging/LoggerInitializer.java b/runtime-engine/logging/src/main/java/me/shedaniel/rei/impl/common/logging/LoggerInitializer.java index 78b3f447a..fa482e83f 100644 --- a/runtime-engine/logging/src/main/java/me/shedaniel/rei/impl/common/logging/LoggerInitializer.java +++ b/runtime-engine/logging/src/main/java/me/shedaniel/rei/impl/common/logging/LoggerInitializer.java @@ -37,7 +37,7 @@ public class LoggerInitializer { new Log4JLogger(LogManager.getFormatterLogger("REI")) )), message -> "[REI] " + message); - public static void onInitialize() { + public void onInitialize() { Internals.attachInstanceSupplier(LOGGER, "logger"); } } diff --git a/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerConstructorImpl.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerConstructorImpl.java new file mode 100644 index 000000000..18da7ee23 --- /dev/null +++ b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerConstructorImpl.java @@ -0,0 +1,38 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.plugins; + +import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.api.common.plugins.PluginView; +import me.shedaniel.rei.api.common.plugins.REIPlugin; +import me.shedaniel.rei.impl.common.provider.PluginManagerConstructor; + +import java.util.function.UnaryOperator; + +public class PluginManagerConstructorImpl implements PluginManagerConstructor { + @Override + public

> PluginManager

create(Class

clazz, UnaryOperator> constructor) { + return new PluginManagerImpl<>(clazz, constructor); + } +} diff --git a/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java index a4af54642..7544bdffd 100644 --- a/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java +++ b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java @@ -62,7 +62,7 @@ public PluginManagerImpl(Class

pluginClass, UnaryOperator> view @Override public void registerReloadable(Reloadable reloadable) { this.reloadables.add((Reloadable

) reloadable); - InternalLogger.getInstance().info("Registered reloadable into plugin manager []: " + reloadable.getClass().getName(), pluginClass.getSimpleName()); + InternalLogger.getInstance().info("Registered reloadable into plugin manager [%s]: " + reloadable.getClass().getName(), pluginClass.getSimpleName()); } @Override diff --git a/runtime-engine/plugins/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.PluginManagerConstructor b/runtime-engine/plugins/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.PluginManagerConstructor new file mode 100644 index 000000000..816ec424b --- /dev/null +++ b/runtime-engine/plugins/src/main/resources/META-INF/services/me.shedaniel.rei.impl.common.provider.PluginManagerConstructor @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.plugins.PluginManagerConstructorImpl \ No newline at end of file diff --git a/runtime-engine/search/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.search.method.InputMethodRegistry b/runtime-engine/search/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.search.method.InputMethodRegistry new file mode 100644 index 000000000..34296fd12 --- /dev/null +++ b/runtime-engine/search/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.search.method.InputMethodRegistry @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.search.method.InputMethodRegistryImpl \ No newline at end of file diff --git a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewSearchBuilderImpl.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewSearchBuilderImpl.java index 35ed31b39..354ac7e47 100644 --- a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewSearchBuilderImpl.java +++ b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewSearchBuilderImpl.java @@ -28,8 +28,6 @@ import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.client.view.AbstractViewSearchBuilder; -import me.shedaniel.rei.impl.client.view.ViewsImpl; import me.shedaniel.rei.impl.display.DisplaySpec; import org.jetbrains.annotations.Nullable; diff --git a/runtime-engine/views/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.view.ViewSearchBuilder b/runtime-engine/views/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.view.ViewSearchBuilder new file mode 100644 index 000000000..7e0e424e7 --- /dev/null +++ b/runtime-engine/views/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.view.ViewSearchBuilder @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.view.ViewSearchBuilderImpl \ No newline at end of file diff --git a/runtime-engine/views/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.view.Views b/runtime-engine/views/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.view.Views new file mode 100644 index 000000000..37c806a3c --- /dev/null +++ b/runtime-engine/views/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.view.Views @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.view.ViewsImpl \ No newline at end of file diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltipProvider.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltipProviderImpl.java similarity index 74% rename from runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltipProvider.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltipProviderImpl.java index 19ed4dfc1..66e027634 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltipProvider.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/tooltip/MissingStacksTooltipProviderImpl.java @@ -23,5 +23,15 @@ package me.shedaniel.rei.impl.client.gui.tooltip; -public class MissingStacksTooltipProvider { +import me.shedaniel.rei.api.common.entry.EntryIngredient; +import me.shedaniel.rei.impl.client.provider.MissingStacksTooltipProvider; +import net.minecraft.world.inventory.tooltip.TooltipComponent; + +import java.util.List; + +public class MissingStacksTooltipProviderImpl implements MissingStacksTooltipProvider { + @Override + public TooltipComponent provide(List stacks) { + return new MissingStacksTooltip(stacks); + } } diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java index c98e0ad5a..8626c30fc 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java @@ -115,7 +115,7 @@ public void render(boolean debugTime, MutableInt size, MutableLong time, PoseSta for (int i = 0; i < extraData.length; i++) { extraData[i] = entries.get(i * 2 + 1); } - renderBatched(debugTime, size, time, matrices, mouseX, mouseY, delta, groupingsAsList(), extraData); + renderBatched(debugTime, size, time, matrices, mouseX, mouseY, delta, groupingAsList(entries), extraData); } } if (!toRender.isEmpty()) { diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProvider.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProviderImpl.java similarity index 98% rename from runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProvider.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProviderImpl.java index 2466237c4..818a037dc 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProvider.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProviderImpl.java @@ -29,6 +29,7 @@ import me.shedaniel.rei.api.client.gui.DrawableConsumer; import me.shedaniel.rei.api.client.gui.Renderer; import me.shedaniel.rei.api.client.gui.widgets.*; +import me.shedaniel.rei.impl.client.provider.WidgetsProvider; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.network.chat.Component; @@ -39,7 +40,7 @@ import java.util.List; import java.util.function.Supplier; -public class WidgetsProvider implements me.shedaniel.rei.impl.client.provider.WidgetsProvider { +public class WidgetsProviderImpl implements WidgetsProvider { @Override public boolean isRenderingPanel(Panel panel) { return PanelWidget.isRendering(panel); diff --git a/runtime-frontend/widgets/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.MissingStacksTooltipProvider b/runtime-frontend/widgets/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.MissingStacksTooltipProvider new file mode 100644 index 000000000..414aa0b7f --- /dev/null +++ b/runtime-frontend/widgets/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.MissingStacksTooltipProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.gui.tooltip.MissingStacksTooltipProviderImpl \ No newline at end of file diff --git a/runtime-frontend/widgets/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.WidgetsProvider b/runtime-frontend/widgets/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.WidgetsProvider new file mode 100644 index 000000000..1b1510787 --- /dev/null +++ b/runtime-frontend/widgets/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.WidgetsProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.gui.widget.basewidgets.WidgetsProviderImpl \ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java index 88f2d8bdd..51132dc36 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java @@ -43,6 +43,7 @@ import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.registry.ReloadStage; +import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.TooltipQueue; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; @@ -70,15 +71,11 @@ @ApiStatus.Internal @Environment(EnvType.CLIENT) public class REIRuntimeImpl implements REIRuntime { - private static final ResourceLocation DISPLAY_TEXTURE = new ResourceLocation("roughlyenoughitems", "textures/gui/display.png"); - private static final ResourceLocation DISPLAY_TEXTURE_DARK = new ResourceLocation("roughlyenoughitems", "textures/gui/display_dark.png"); - @ApiStatus.Internal - public static boolean isWithinRecipeViewingScreen = false; + private final LinkedHashSet lastDisplayScreen = Sets.newLinkedHashSetWithExpectedSize(10); + private final List hintProviders = Internals.resolveServices(HintProvider.class); private ScreenOverlayImpl overlay; private AbstractContainerScreen previousContainerScreen = null; private Screen previousScreen = null; - private LinkedHashSet lastDisplayScreen = Sets.newLinkedHashSetWithExpectedSize(10); - private List hintProviders = Internals.resolveServices(HintProvider.class); /** * @return the instance of screen helper @@ -194,7 +191,7 @@ public ResourceLocation getDefaultDisplayTexture() { @Override public ResourceLocation getDefaultDisplayTexture(boolean darkTheme) { - return darkTheme ? DISPLAY_TEXTURE_DARK : DISPLAY_TEXTURE; + return darkTheme ? InternalTextures.DISPLAY_TEXTURE_DARK : InternalTextures.DISPLAY_TEXTURE; } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java index e78f36704..07fd76aef 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java @@ -43,6 +43,7 @@ import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.impl.client.gui.TooltipQueue; import me.shedaniel.rei.impl.client.gui.dragging.CurrentDraggingStack; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.client.gui.menu.MenuAccessImpl; @@ -161,6 +162,11 @@ public void lateRender(PoseStack matrices, int mouseX, int mouseY, float delta) matrices.popPose(); } + Tooltip tooltip = TooltipQueue.get(); + if (tooltip != null) { + renderTooltip(matrices, tooltip); + } + REIRuntime.getInstance().clearTooltips(); if (REIRuntime.getInstance().isOverlayVisible()) { menuAccess.afterRender(); 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 72d632e36..949e69dc5 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 @@ -309,14 +309,11 @@ public boolean mouseScrolled(double mouseX, double mouseY, double amount) { scrollBarAlphaFutureTime = System.currentTimeMillis(); return true; } - REIRuntimeImpl.isWithinRecipeViewingScreen = true; for (GuiEventListener listener : children()) { if (listener.mouseScrolled(mouseX, mouseY, amount)) { - REIRuntimeImpl.isWithinRecipeViewingScreen = false; return true; } } - REIRuntimeImpl.isWithinRecipeViewingScreen = false; int tabSize = ConfigObject.getInstance().isUsingCompactTabs() ? 24 : 28; if (mouseX >= bounds.x && mouseX <= bounds.getMaxX() && mouseY >= bounds.y - tabSize && mouseY < bounds.y) { if (amount < 0) selectedCategoryIndex++; 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 a29319dac..f6c590eeb 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 @@ -500,14 +500,11 @@ private boolean checkExportDisplays() { @Override public boolean mouseScrolled(double mouseX, double mouseY, double amount) { - REIRuntimeImpl.isWithinRecipeViewingScreen = true; for (GuiEventListener listener : children()) { if (listener.mouseScrolled(mouseX, mouseY, amount)) { - REIRuntimeImpl.isWithinRecipeViewingScreen = false; return true; } } - REIRuntimeImpl.isWithinRecipeViewingScreen = false; if (getBounds().contains(PointHelper.ofMouse())) { if (amount > 0 && recipeBack.isEnabled()) recipeBack.onClick(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java b/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java index c88e96e71..74872de4d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/init/RoughlyEnoughItemsInitializer.java @@ -55,7 +55,6 @@ public static void onInitializeClient() { if (RoughlyEnoughItemsState.getErrors().isEmpty()) { initializeEntryPoint(true, "me.shedaniel.rei.impl.client.init.CoreClientInitialization"); initializeEntryPoint(true, "me.shedaniel.rei.RoughlyEnoughItemsCoreClient"); - initializeEntryPoint(true, "me.shedaniel.rei.REIModMenuEntryPoint"); initializeEntryPoint(true, "me.shedaniel.rei.impl.client.REIRuntimeImpl"); } diff --git a/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.ClientHelper b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.ClientHelper new file mode 100644 index 000000000..f140cca3c --- /dev/null +++ b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.ClientHelper @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.ClientHelperImpl \ No newline at end of file diff --git a/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.REIRuntime b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.REIRuntime new file mode 100644 index 000000000..89e5aaac2 --- /dev/null +++ b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.REIRuntime @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.REIRuntimeImpl \ No newline at end of file diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java index 4823008b6..24740427d 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java @@ -32,4 +32,6 @@ public class InternalTextures { public static final ResourceLocation ARROW_RIGHT_SMALL_TEXTURE = new ResourceLocation("roughlyenoughitems", "textures/gui/arrow_right_small.png"); public static final ResourceLocation CHEST_GUI_TEXTURE = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer.png"); public static final ResourceLocation CHEST_GUI_TEXTURE_DARK = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer_dark.png"); + public static final ResourceLocation DISPLAY_TEXTURE = new ResourceLocation("roughlyenoughitems", "textures/gui/display.png"); + public static final ResourceLocation DISPLAY_TEXTURE_DARK = new ResourceLocation("roughlyenoughitems", "textures/gui/display_dark.png"); } From 59c644cbd1924607ebd756988c6b3f86fa3a5a8e Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 26 Aug 2022 22:04:13 +0900 Subject: [PATCH 10/20] Bump to REI 8.4 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 4b70945bf..65d7015ac 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ org.gradle.jvmargs=-Xmx6G -base_version=8.3 +base_version=8.4 unstable=false supported_version=1.18.2 minecraft_version=1.18.2 From 1ba613d9c97e722e76f459162de2e1a1c9e875bb Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 26 Aug 2022 22:07:15 +0900 Subject: [PATCH 11/20] Fix double entry --- .../rei/impl/client/gui/overlay/AbstractScreenOverlay.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java index 07fd76aef..392b4cfee 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java @@ -318,7 +318,7 @@ public boolean keyReleased(int keyCode, int scanCode, int modifiers) { if (!hasSpace()) return false; if (REIRuntime.getInstance().isOverlayVisible()) { for (GuiEventListener listener : widgets) - if (listener == getFocused() && listener.keyPressed(keyCode, scanCode, modifiers)) + if (listener == getFocused() && listener.keyReleased(keyCode, scanCode, modifiers)) return true; } return false; From 03b0adcf960c5e462fddc8e045b146a8c727670c Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 27 Aug 2022 13:23:37 +0900 Subject: [PATCH 12/20] Refactors to overlays and reiruntime --- .../shedaniel/rei/api/client/REIRuntime.java | 31 +++++-- .../rei/api/client/gui/widgets/Label.java | 5 +- .../rei/api/client/gui/widgets/Panel.java | 3 +- .../rei/api/client/gui/widgets/Tooltip.java | 3 + .../api/client/gui/widgets/TooltipQueue.java | 19 ++++ .../rei/impl/client/ClientInternals.java | 6 ++ build.gradle | 3 + .../DefaultInformationCategory.java | 3 +- .../beacon/DefaultBeaconBaseCategory.java | 3 +- .../beacon/DefaultBeaconPaymentCategory.java | 3 +- .../categories/tag/DefaultTagCategory.java | 3 +- gradle.properties | 2 +- .../config/entries/FilteringScreen.java | 3 +- .../client/gui/overlay/EntryListProvider.java | 9 ++ .../gui/overlay/FavoritesListProvider.java | 11 +++ .../client/gui/overlay/TooltipQueueImpl.java | 24 +++-- ...el.rei.api.client.gui.widgets.TooltipQueue | 1 + .../gui/widget/basewidgets/ArrowWidget.java | 3 +- ...ererManager.java => BatchedSlotsImpl.java} | 17 +--- .../widget/basewidgets/BurningFireWidget.java | 3 +- .../gui/widget/basewidgets/ButtonWidget.java | 5 +- .../gui/widget/basewidgets/EntryWidget.java | 4 +- .../gui/widget/basewidgets/LabelWidget.java | 7 +- .../gui/widget/basewidgets/PanelWidget.java | 2 +- .../basewidgets/WidgetsProviderImpl.java | 2 +- .../rei/impl/client/ClientHelperImpl.java | 3 +- .../rei/impl/client/REIRuntimeImpl.java | 88 ++----------------- .../impl/client/gui/DisplayScreenStack.java | 33 +++++++ .../rei/impl/client/gui/menu/Menu.java | 6 +- .../gui/overlay/AbstractScreenOverlay.java | 6 +- .../screen/CompositeDisplayViewingScreen.java | 12 +-- .../screen/DefaultDisplayViewingScreen.java | 12 +-- .../client/gui/widget/ConfigButtonWidget.java | 3 +- .../widget/CraftableFilterButtonWidget.java | 3 +- .../rei/impl/client/gui/widget/TabWidget.java | 3 +- .../entrylist/EntryListSearchManager.java | 2 +- .../gui/widget/entrylist/EntryListWidget.java | 3 +- .../entrylist/ScrolledEntryListWidget.java | 3 +- .../region/EntryStacksRegionWidget.java | 2 +- .../gui/widget/search/OverlaySearchField.java | 2 +- settings.gradle | 3 + .../impl/client/gui/hints/HintProvider.java | 3 + .../gui/screen/ConfigReloadingScreen.java | 4 +- .../client/search/AsyncSearchManager.java | 7 ++ .../rei/impl/client/search/SearchManager.java | 1 - 45 files changed, 211 insertions(+), 163 deletions(-) create mode 100644 api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipQueue.java create mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/EntryListProvider.java create mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/FavoritesListProvider.java rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/TooltipQueue.java => runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/TooltipQueueImpl.java (73%) create mode 100644 runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.gui.widgets.TooltipQueue rename runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/{BatchedEntryRendererManager.java => BatchedSlotsImpl.java} (97%) create mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/DisplayScreenStack.java diff --git a/api/src/main/java/me/shedaniel/rei/api/client/REIRuntime.java b/api/src/main/java/me/shedaniel/rei/api/client/REIRuntime.java index 540dcc2ab..41e0870d3 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/REIRuntime.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/REIRuntime.java @@ -24,10 +24,12 @@ package me.shedaniel.rei.api.client; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.TooltipQueue; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.common.plugins.PluginManager; @@ -60,12 +62,17 @@ static REIRuntime getInstance() { * * @return whether the overlay is visible */ - boolean isOverlayVisible(); + default boolean isOverlayVisible() { + return ConfigObject.getInstance().isOverlayVisible(); + } /** * Toggles the visibility of the overlay. */ - void toggleOverlayVisible(); + default void toggleOverlayVisible() { + ConfigObject.getInstance().setOverlayVisible(!ConfigObject.getInstance().isOverlayVisible()); + ConfigManager.getInstance().saveConfig(); + } /** * Returns the screen overlay of REI, if available and constructed. @@ -126,7 +133,9 @@ default Optional getOverlay(boolean reset) { * @return whether dark mode is enabled * @see ConfigObject#isUsingDarkTheme() */ - boolean isDarkThemeEnabled(); + default boolean isDarkThemeEnabled() { + return ConfigObject.getInstance().isUsingDarkTheme(); + } /** * Returns the text field used for searching, if constructed. @@ -144,7 +153,11 @@ default TextField getSearchTextField() { * @param tooltip the tooltip to display, or {@code null} * @see Tooltip#queue() */ - void queueTooltip(@Nullable Tooltip tooltip); + default void queueTooltip(@Nullable Tooltip tooltip) { + if (getOverlay(false, false).isEmpty()) { + TooltipQueue.getInstance().queue(tooltip); + } + } /** * Clear all queued tooltips. @@ -153,7 +166,11 @@ default TextField getSearchTextField() { * @since 8.3 */ @ApiStatus.Experimental - void clearTooltips(); + default void clearTooltips() { + if (getOverlay(false, false).isEmpty()) { + TooltipQueue.getInstance().clear(); + } + } /** * Returns the texture location of the default display background. @@ -162,7 +179,9 @@ default TextField getSearchTextField() { * * @return the texture location of the default display background */ - ResourceLocation getDefaultDisplayTexture(); + default ResourceLocation getDefaultDisplayTexture() { + return getDefaultDisplayTexture(isDarkThemeEnabled()); + } /** * Returns the texture location of the default display background. diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Label.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Label.java index 856e696de..b423dd5ae 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Label.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Label.java @@ -26,6 +26,7 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.FormattedText; import net.minecraft.network.chat.TextComponent; @@ -331,7 +332,7 @@ public final Label shadow(boolean hasShadow) { public abstract void setColor(int color); public Label color(int lightModeColor, int darkModeColor) { - return color(REIRuntime.getInstance().isDarkThemeEnabled() ? darkModeColor : lightModeColor); + return color(ConfigObject.getInstance().isUsingDarkTheme() ? darkModeColor : lightModeColor); } public final Label color(int color) { @@ -344,7 +345,7 @@ public final Label color(int color) { public abstract void setHoveredColor(int hoveredColor); public final Label hoveredColor(int lightModeColor, int darkModeColor) { - return hoveredColor(REIRuntime.getInstance().isDarkThemeEnabled() ? darkModeColor : lightModeColor); + return hoveredColor(ConfigObject.getInstance().isUsingDarkTheme() ? darkModeColor : lightModeColor); } public final Label hoveredColor(int color) { diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Panel.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Panel.java index f1adf8b06..875931202 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Panel.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Panel.java @@ -24,6 +24,7 @@ package me.shedaniel.rei.api.client.gui.widgets; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import java.util.function.Predicate; @@ -56,7 +57,7 @@ public final Panel color(int color) { } public final Panel color(int lightColor, int darkColor) { - return color(REIRuntime.getInstance().isDarkThemeEnabled() ? darkColor : lightColor); + return color(ConfigObject.getInstance().isUsingDarkTheme() ? darkColor : lightColor); } public abstract Predicate getRendering(); diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java index 848e853de..e2d3511f1 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Tooltip.java @@ -174,6 +174,9 @@ default Tooltip addAllTexts(Iterable text) { Tooltip withContextStack(EntryStack stack); + /** + * Queues this tooltip to be displayed. + */ default void queue() { EnvExecutor.runInEnv(Env.CLIENT, () -> () -> REIRuntime.getInstance().queueTooltip(this)); } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipQueue.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipQueue.java new file mode 100644 index 000000000..c938cd8d6 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipQueue.java @@ -0,0 +1,19 @@ +package me.shedaniel.rei.api.client.gui.widgets; + +import me.shedaniel.rei.impl.client.ClientInternals; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +@ApiStatus.Experimental +public interface TooltipQueue { + static TooltipQueue getInstance() { + return ClientInternals.getTooltipQueue(); + } + + void queue(@Nullable Tooltip tooltip); + + void clear(); + + @Nullable + Tooltip get(); +} diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java b/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java index 706ea27ad..0791ec310 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java @@ -29,6 +29,7 @@ import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; +import me.shedaniel.rei.api.client.gui.widgets.TooltipQueue; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.entry.PreFilteredEntryList; import me.shedaniel.rei.api.client.registry.screen.ClickArea; @@ -64,6 +65,7 @@ public final class ClientInternals { private static final FavoritesEntriesListProvider FAVORITES_ENTRIES_LIST = resolveService(FavoritesEntriesListProvider.class); private static final List OVERLAY_TICKERS = resolveServices(OverlayTicker.class); private static final AutoCraftingEvaluator AUTO_CRAFTING_EVALUATOR = resolveService(AutoCraftingEvaluator.class); + private static final TooltipQueue TOOLTIP_QUEUE = resolveService(TooltipQueue.class); private static Function> favoriteEntryFromJson = (object) -> throwNotSetup(); private static Function clickAreaHandlerResult = (result) -> throwNotSetup(); private static BiConsumer, TooltipComponent> clientTooltipComponentProvider = (tooltip, result) -> throwNotSetup(); @@ -165,6 +167,10 @@ public static AutoCraftingEvaluator.Builder getAutoCraftingEvaluator(Display dis return AUTO_CRAFTING_EVALUATOR.builder(display); } + public static TooltipQueue getTooltipQueue() { + return TOOLTIP_QUEUE; + } + public static DataResult favoriteEntryFromJson(CompoundTag tag) { return favoriteEntryFromJson.apply(tag); } diff --git a/build.gradle b/build.gradle index 51f426fba..2acfe1558 100755 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,9 @@ allprojects { ":runtime-frontend:filtering", ":runtime-frontend:display", ":runtime-frontend:overlay", + ":runtime-frontend:paginated-entries", + ":runtime-frontend:scrolled-entries", + ":runtime-frontend:favorites-entries", ] depProjects = [ ":api", diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultInformationCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultInformationCategory.java index d7b6332d8..d104410c1 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultInformationCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/DefaultInformationCategory.java @@ -32,6 +32,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.AbstractRenderer; import me.shedaniel.rei.api.client.gui.DisplayRenderer; import me.shedaniel.rei.api.client.gui.Renderer; @@ -198,7 +199,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { int currentY = -scrolling.scrollAmountInt() + innerBounds.y; for (FormattedCharSequence text : texts) { if (text != null && currentY + font.lineHeight >= innerBounds.y && currentY <= innerBounds.getMaxY()) { - font.draw(matrices, text, innerBounds.x + 2, currentY + 2, REIRuntime.getInstance().isDarkThemeEnabled() ? 0xFFBBBBBB : 0xFF090909); + font.draw(matrices, text, innerBounds.x + 2, currentY + 2, ConfigObject.getInstance().isUsingDarkTheme() ? 0xFFBBBBBB : 0xFF090909); } currentY += text == null ? 4 : font.lineHeight; } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconBaseCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconBaseCategory.java index 93502cfa0..d8d9af666 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconBaseCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconBaseCategory.java @@ -30,6 +30,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.DisplayRenderer; import me.shedaniel.rei.api.client.gui.Renderer; import me.shedaniel.rei.api.client.gui.widgets.*; @@ -167,7 +168,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { } } try (CloseableScissors scissors = scissor(matrices, scrolling.getBounds())) { - scrolling.renderScrollBar(0xff000000, 1, REIRuntime.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); + scrolling.renderScrollBar(0xff000000, 1, ConfigObject.getInstance().isUsingDarkTheme() ? 0.8f : 1f); } } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconPaymentCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconPaymentCategory.java index c2ebdda40..b5a5b64e5 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconPaymentCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/beacon/DefaultBeaconPaymentCategory.java @@ -30,6 +30,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.DisplayRenderer; import me.shedaniel.rei.api.client.gui.Renderer; import me.shedaniel.rei.api.client.gui.widgets.*; @@ -167,7 +168,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { } } try (CloseableScissors scissors = scissor(matrices, scrolling.getBounds())) { - scrolling.renderScrollBar(0xff000000, 1, REIRuntime.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); + scrolling.renderScrollBar(0xff000000, 1, ConfigObject.getInstance().isUsingDarkTheme() ? 0.8f : 1f); } } diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/DefaultTagCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/DefaultTagCategory.java index 9f7b4d867..95a25eace 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/DefaultTagCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/DefaultTagCategory.java @@ -31,6 +31,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.AbstractRenderer; import me.shedaniel.rei.api.client.gui.Renderer; import me.shedaniel.rei.api.client.gui.widgets.*; @@ -143,7 +144,7 @@ public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, Font font = instance.font; String text = "?"; int width = font.width(text); - font.draw(matrices, text, bounds.getCenterX() - width / 2f + 0.2f, bounds.getCenterY() - font.lineHeight / 2f + 1f, REIRuntime.getInstance().isDarkThemeEnabled() ? -4473925 : -12566464); + font.draw(matrices, text, bounds.getCenterX() - width / 2f + 0.2f, bounds.getCenterY() - font.lineHeight / 2f + 1f, ConfigObject.getInstance().isUsingDarkTheme() ? -4473925 : -12566464); } @Override diff --git a/gradle.properties b/gradle.properties index 65d7015ac..d287dec04 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -org.gradle.jvmargs=-Xmx6G +org.gradle.jvmargs=-Xmx10G base_version=8.4 unstable=false supported_version=1.18.2 diff --git a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java index fafd59de8..f5d790219 100644 --- a/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java +++ b/runtime-engine/filtering-entries/src/main/java/me/shedaniel/rei/impl/client/config/entries/FilteringScreen.java @@ -35,6 +35,7 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.search.SearchFilter; @@ -229,7 +230,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { } slots.render(matrices, mouseX, mouseY, delta); updatePosition(delta); - scrolling.renderScrollBar(0, 1.0F, REIRuntime.getInstance().isDarkThemeEnabled() ? 0.8F : 1F); + scrolling.renderScrollBar(0, 1.0F, ConfigObject.getInstance().isUsingDarkTheme() ? 0.8F : 1F); matrices.pushPose(); matrices.translate(0, 0, 300); this.searchField.asWidget().render(matrices, mouseX, mouseY, delta); diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/EntryListProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/EntryListProvider.java new file mode 100644 index 000000000..8ad40444b --- /dev/null +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/EntryListProvider.java @@ -0,0 +1,9 @@ +package me.shedaniel.rei.impl.client.gui.overlay; + +import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public interface EntryListProvider { + OverlayListWidget getEntryList(); +} diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/FavoritesListProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/FavoritesListProvider.java new file mode 100644 index 000000000..07e329074 --- /dev/null +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/FavoritesListProvider.java @@ -0,0 +1,11 @@ +package me.shedaniel.rei.impl.client.gui.overlay; + +import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import org.jetbrains.annotations.ApiStatus; + +import java.util.Optional; + +@ApiStatus.Internal +public interface FavoritesListProvider { + Optional getFavoritesList(); +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/TooltipQueue.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/TooltipQueueImpl.java similarity index 73% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/TooltipQueue.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/TooltipQueueImpl.java index 204798203..de285ef68 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/TooltipQueue.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/TooltipQueueImpl.java @@ -21,30 +21,36 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui; +package me.shedaniel.rei.impl.client.gui.overlay; import com.google.common.collect.Lists; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.TooltipQueue; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Objects; -public class TooltipQueue { - private static final List TOOLTIPS = Lists.newArrayList(); +@ApiStatus.Internal +public final class TooltipQueueImpl implements TooltipQueue { + private final List tooltips = Lists.newArrayList(); - public static void addTooltip(@Nullable Tooltip tooltip) { + @Override + public void queue(@Nullable Tooltip tooltip) { if (tooltip != null) - TOOLTIPS.add(tooltip); + tooltips.add(tooltip); } - public static void clearTooltips() { - TOOLTIPS.clear(); + @Override + public void clear() { + tooltips.clear(); } + @Override @Nullable - public static Tooltip get() { - return TOOLTIPS.stream().filter(Objects::nonNull) + public Tooltip get() { + return tooltips.stream().filter(Objects::nonNull) .reduce((tooltip, tooltip2) -> tooltip2) .orElse(null); } diff --git a/runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.gui.widgets.TooltipQueue b/runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.gui.widgets.TooltipQueue new file mode 100644 index 000000000..3c1bf18e1 --- /dev/null +++ b/runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.api.client.gui.widgets.TooltipQueue @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.gui.overlay.TooltipQueueImpl \ No newline at end of file diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java index aba9ae7b8..8afb30220 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ArrowWidget.java @@ -29,6 +29,7 @@ import me.shedaniel.clothconfig2.api.animator.ValueAnimator; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.Arrow; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.util.Mth; @@ -41,7 +42,7 @@ final class ArrowWidget extends Arrow { private Rectangle bounds; private double animationDuration = -1; private final NumberAnimator darkBackgroundAlpha = ValueAnimator.ofFloat() - .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) + .withConvention(() -> ConfigObject.getInstance().isUsingDarkTheme() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) .asFloat(); public ArrowWidget(Rectangle bounds) { diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedSlotsImpl.java similarity index 97% rename from runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java rename to runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedSlotsImpl.java index 8626c30fc..dc1b2e4dc 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedEntryRendererManager.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BatchedSlotsImpl.java @@ -49,7 +49,7 @@ import java.util.*; -final class BatchedEntryRendererManager extends BatchedSlots implements ForwardingList { +final class BatchedSlotsImpl extends BatchedSlots implements ForwardingList { private final boolean fastEntryRendering = ConfigObject.getInstance().doesFastEntryRendering(); private final Int2ObjectMap> grouping = new Int2ObjectOpenHashMap<>(); private final List toRender = new ArrayList<>(); @@ -59,14 +59,8 @@ final class BatchedEntryRendererManager extends BatchedSlots implements Forwardi public MutableInt debugSize = new MutableInt(); public MutableLong debugTime = new MutableLong(); - public BatchedEntryRendererManager() { - } - - public BatchedEntryRendererManager(Collection widgets) { - addAll(widgets); - } - - public boolean isFastEntryRendering() { + @Override + public boolean isBatched() { return fastEntryRendering; } @@ -81,11 +75,6 @@ public void addAllUnbatched(Collection slots) { this.size += slots.size(); } - @Override - public boolean isBatched() { - return isFastEntryRendering(); - } - @Override public void addDebugger(MutableInt size, MutableLong time) { this.debug = true; diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java index 550f98626..4140de261 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/BurningFireWidget.java @@ -29,6 +29,7 @@ import me.shedaniel.clothconfig2.api.animator.ValueAnimator; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.BurningFire; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.util.Mth; @@ -41,7 +42,7 @@ final class BurningFireWidget extends BurningFire { private Rectangle bounds; private double animationDuration = -1; private final NumberAnimator darkBackgroundAlpha = ValueAnimator.ofFloat() - .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) + .withConvention(() -> ConfigObject.getInstance().isUsingDarkTheme() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) .asFloat(); public BurningFireWidget(Rectangle bounds) { diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java index f7efdc712..ae46a15d4 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/ButtonWidget.java @@ -32,6 +32,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.Button; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import net.minecraft.client.gui.GuiComponent; @@ -78,7 +79,7 @@ public ButtonWidget(Rectangle rectangle, Component text) { this.bounds = Objects.requireNonNull(rectangle); this.text = Objects.requireNonNull(text); this.darkBackground = ValueAnimator.ofColor() - .withConvention(() -> Color.ofTransparent(REIRuntime.getInstance().isDarkThemeEnabled() ? 0xFFFFFFFF : 0x00FFFFFF), ValueAnimator.typicalTransitionTime()); + .withConvention(() -> Color.ofTransparent(ConfigObject.getInstance().isUsingDarkTheme() ? 0xFFFFFFFF : 0x00FFFFFF), ValueAnimator.typicalTransitionTime()); this.alpha = ValueProvider.constant(1.0); } @@ -303,7 +304,7 @@ public final int getTextureId(Point mouse) { } protected void renderBackground(PoseStack matrices, int x, int y, int width, int height, int textureOffset) { - renderBackground(matrices, x, y, width, height, textureOffset, REIRuntime.getInstance().isDarkThemeEnabled(), Color.ofTransparent(0xFFFFFFFF)); + renderBackground(matrices, x, y, width, height, textureOffset, ConfigObject.getInstance().isUsingDarkTheme(), Color.ofTransparent(0xFFFFFFFF)); } protected void renderBackground(PoseStack matrices, int x, int y, int width, int height, int textureOffset, boolean dark, Color color) { diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/EntryWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/EntryWidget.java index b830b7d59..e3e6052b1 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/EntryWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/EntryWidget.java @@ -72,7 +72,7 @@ final class EntryWidget extends Slot implements DraggableStackProviderWidget { private static long stackDisplayOffset = 0; private final NumberAnimator darkHighlightedAlpha = ValueAnimator.ofFloat() - .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()); + .withConvention(() -> ConfigObject.getInstance().isUsingDarkTheme() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()); private final Rectangle bounds; @ApiStatus.Internal private byte noticeMark = Slot.UN_MARKED; @@ -267,7 +267,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { } private final NumberAnimator darkBackgroundAlpha = ValueAnimator.ofFloat() - .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) + .withConvention(() -> ConfigObject.getInstance().isUsingDarkTheme() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) .asFloat(); @Override diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java index b38e3b7fa..dd2da618b 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/LabelWidget.java @@ -31,6 +31,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.Label; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.Widgets; @@ -57,9 +58,9 @@ final class LabelWidget extends Label { private boolean hasShadow = true; private boolean focusable = true; private ValueProvider color = ValueAnimator.ofColor() - .withConvention(() -> Color.ofTransparent(REIRuntime.getInstance().isDarkThemeEnabled() ? 0xFFBBBBBB : -1), 50); + .withConvention(() -> Color.ofTransparent(ConfigObject.getInstance().isUsingDarkTheme() ? 0xFFBBBBBB : -1), 50); private ValueProvider hoveredColor = ValueAnimator.ofColor() - .withConvention(() -> Color.ofTransparent(REIRuntime.getInstance().isDarkThemeEnabled() ? -1 : 0xFF66FFCC), 50); + .withConvention(() -> Color.ofTransparent(ConfigObject.getInstance().isUsingDarkTheme() ? -1 : 0xFF66FFCC), 50); private final ValueProvider finalColor = ValueAnimator.ofColor() .withConvention(() -> { if (!hovered) { @@ -169,7 +170,7 @@ public final void setColor(int color) { @Override public Label color(int lightModeColor, int darkModeColor) { this.color = ValueAnimator.ofColor() - .withConvention(() -> Color.ofTransparent(REIRuntime.getInstance().isDarkThemeEnabled() ? darkModeColor : lightModeColor), ValueAnimator.typicalTransitionTime()); + .withConvention(() -> Color.ofTransparent(ConfigObject.getInstance().isUsingDarkTheme() ? darkModeColor : lightModeColor), ValueAnimator.typicalTransitionTime()); this.color.completeImmediately(); this.finalColor.completeImmediately(); return this; diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java index 98f90d6bf..cce955efd 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/PanelWidget.java @@ -52,7 +52,7 @@ final class PanelWidget extends Panel { private int yTextureOffset = RecipeBorderType.DEFAULT.getYOffset(); private Predicate rendering = Predicates.alwaysTrue(); private final NumberAnimator darkBackgroundAlpha = ValueAnimator.ofFloat() - .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) + .withConvention(() -> ConfigObject.getInstance().isUsingDarkTheme() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) .asFloat(); public static boolean isRendering(Panel panel) { diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProviderImpl.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProviderImpl.java index 818a037dc..cae2c165c 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProviderImpl.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/WidgetsProviderImpl.java @@ -162,6 +162,6 @@ public TextField createTextField(Rectangle bounds) { @Override public BatchedSlots createBatchedSlots() { - return new BatchedEntryRendererManager(); + return new BatchedSlotsImpl(); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java index 7a537fcec..3c1cbcb01 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java @@ -33,6 +33,7 @@ import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.impl.client.gui.DisplayScreenStack; import me.shedaniel.rei.impl.client.gui.screen.CompositeDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; import me.shedaniel.rei.impl.display.DisplaySpec; @@ -96,7 +97,7 @@ public boolean openView(Map, List> map, @Nullabl } } if (Minecraft.getInstance().screen instanceof DisplayScreen displayScreen) { - REIRuntimeImpl.getInstance().storeDisplayScreen(displayScreen); + DisplayScreenStack.storeDisplayScreen(displayScreen); } Minecraft.getInstance().setScreen(screen); return true; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java index 51132dc36..0c4007509 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java @@ -23,8 +23,6 @@ package me.shedaniel.rei.impl.client; -import com.google.common.collect.Iterables; -import com.google.common.collect.Sets; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; import dev.architectury.event.EventResult; @@ -33,24 +31,18 @@ import dev.architectury.platform.Platform; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; -import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.DisplayPanelLocation; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; -import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; -import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.registry.ReloadStage; +import me.shedaniel.rei.impl.client.gui.DisplayScreenStack; import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.TooltipQueue; -import me.shedaniel.rei.impl.client.gui.hints.HintProvider; import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import me.shedaniel.rei.impl.client.provider.OverlayTicker; -import me.shedaniel.rei.impl.common.Internals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; @@ -61,9 +53,6 @@ import org.jetbrains.annotations.Nullable; import java.lang.reflect.InvocationTargetException; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.List; import java.util.Optional; import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; @@ -71,8 +60,6 @@ @ApiStatus.Internal @Environment(EnvType.CLIENT) public class REIRuntimeImpl implements REIRuntime { - private final LinkedHashSet lastDisplayScreen = Sets.newLinkedHashSetWithExpectedSize(10); - private final List hintProviders = Internals.resolveServices(HintProvider.class); private ScreenOverlayImpl overlay; private AbstractContainerScreen previousContainerScreen = null; private Screen previousScreen = null; @@ -86,57 +73,6 @@ public static REIRuntimeImpl getInstance() { return (REIRuntimeImpl) REIRuntime.getInstance(); } - public List getHintProviders() { - return Collections.unmodifiableList(hintProviders); - } - - @Override - public void queueTooltip(@Nullable Tooltip tooltip) { - if (overlay != null && tooltip != null) { - TooltipQueue.addTooltip(tooltip); - } - } - - @Override - public void clearTooltips() { - if (overlay != null) { - TooltipQueue.clearTooltips(); - } - } - - @Nullable - public static OverlaySearchField getSearchField() { - return (OverlaySearchField) getInstance().getSearchTextField(); - } - - public void storeDisplayScreen(DisplayScreen screen) { - while (lastDisplayScreen.size() >= 10) - lastDisplayScreen.remove(Iterables.get(lastDisplayScreen, 0)); - lastDisplayScreen.add(screen); - } - - public boolean hasLastDisplayScreen() { - return !lastDisplayScreen.isEmpty(); - } - - public Screen getLastDisplayScreen() { - DisplayScreen screen = Iterables.getLast(lastDisplayScreen); - lastDisplayScreen.remove(screen); - screen.recalculateCategoryPage(); - return (Screen) screen; - } - - @Override - public boolean isOverlayVisible() { - return ConfigObject.getInstance().isOverlayVisible(); - } - - @Override - public void toggleOverlayVisible() { - ConfigObject.getInstance().setOverlayVisible(!ConfigObject.getInstance().isOverlayVisible()); - ConfigManager.getInstance().saveConfig(); - } - @Override public Optional getOverlay(boolean reset, boolean init) { if ((overlay == null && init) || reset) { @@ -179,16 +115,6 @@ public void setPreviousScreen(Screen previousScreen) { } } - @Override - public boolean isDarkThemeEnabled() { - return ConfigObject.getInstance().isUsingDarkTheme(); - } - - @Override - public ResourceLocation getDefaultDisplayTexture() { - return getDefaultDisplayTexture(isDarkThemeEnabled()); - } - @Override public ResourceLocation getDefaultDisplayTexture(boolean darkTheme) { return darkTheme ? InternalTextures.DISPLAY_TEXTURE_DARK : InternalTextures.DISPLAY_TEXTURE; @@ -242,9 +168,14 @@ public Rectangle calculateFavoritesListArea() { @Override public void startReload() { + startReload(null); + } + + @Override + public void startReload(ReloadStage stage) { SearchProvider.getInstance().clearCache(); getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); - lastDisplayScreen.clear(); + DisplayScreenStack.clear(); if (!RenderSystem.isOnRenderThread()) { RenderSystem.recordRenderCall(CachedEntryListRender::refresh); } else { @@ -252,11 +183,6 @@ public void startReload() { } } - @Override - public void startReload(ReloadStage stage) { - startReload(); - } - @Override public void endReload(ReloadStage stage) { SearchProvider.getInstance().clearCache(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/DisplayScreenStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/DisplayScreenStack.java new file mode 100644 index 000000000..4b12aa5d6 --- /dev/null +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/DisplayScreenStack.java @@ -0,0 +1,33 @@ +package me.shedaniel.rei.impl.client.gui; + +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; +import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; +import net.minecraft.client.gui.screens.Screen; + +import java.util.LinkedHashSet; + +public class DisplayScreenStack { + private static final LinkedHashSet LAST_DISPLAY_SCREENS = Sets.newLinkedHashSetWithExpectedSize(10); + + public static void storeDisplayScreen(DisplayScreen screen) { + while (LAST_DISPLAY_SCREENS.size() >= 10) + LAST_DISPLAY_SCREENS.remove(Iterables.get(LAST_DISPLAY_SCREENS, 0)); + LAST_DISPLAY_SCREENS.add(screen); + } + + public static boolean hasLastDisplayScreen() { + return !LAST_DISPLAY_SCREENS.isEmpty(); + } + + public static Screen getLastDisplayScreen() { + DisplayScreen screen = Iterables.getLast(LAST_DISPLAY_SCREENS); + LAST_DISPLAY_SCREENS.remove(screen); + screen.recalculateCategoryPage(); + return (Screen) screen; + } + + public static void clear() { + LAST_DISPLAY_SCREENS.clear(); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java index aa66c25ad..010294296 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java @@ -30,7 +30,7 @@ import me.shedaniel.clothconfig2.api.scroll.ScrollingContainer; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.impl.client.gui.menu.entries.SubMenuEntry; import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; @@ -134,7 +134,7 @@ public int getMaxEntryWidth() { public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { Rectangle bounds = getBounds(); Rectangle innerBounds = getInnerBounds(); - fill(matrices, bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), containsMouse(mouseX, mouseY) ? (REIRuntime.getInstance().isDarkThemeEnabled() ? -17587 : -1) : -6250336); + fill(matrices, bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), containsMouse(mouseX, mouseY) ? (ConfigObject.getInstance().isUsingDarkTheme() ? -17587 : -1) : -6250336); fill(matrices, innerBounds.x, innerBounds.y, innerBounds.getMaxX(), innerBounds.getMaxY(), -16777216); boolean contains = innerBounds.contains(mouseX, mouseY); MenuEntry focused = getFocused() instanceof MenuEntry menuEntry ? menuEntry : null; @@ -159,7 +159,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { } ScissorsHandler.INSTANCE.removeLastScissor(); setFocused(focused); - scrolling.renderScrollBar(0, 1, REIRuntime.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); + scrolling.renderScrollBar(0, 1, ConfigObject.getInstance().isUsingDarkTheme() ? 0.8f : 1f); scrolling.updatePosition(delta); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java index 392b4cfee..aebecbc4f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java @@ -36,6 +36,7 @@ import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentProvider; import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentVisitor; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.TooltipQueue; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.screen.ClickArea; @@ -43,7 +44,6 @@ import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.client.gui.TooltipQueue; import me.shedaniel.rei.impl.client.gui.dragging.CurrentDraggingStack; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.client.gui.menu.MenuAccessImpl; @@ -162,12 +162,12 @@ public void lateRender(PoseStack matrices, int mouseX, int mouseY, float delta) matrices.popPose(); } - Tooltip tooltip = TooltipQueue.get(); + Tooltip tooltip = TooltipQueue.getInstance().get(); if (tooltip != null) { renderTooltip(matrices, tooltip); } - REIRuntime.getInstance().clearTooltips(); + TooltipQueue.getInstance().clear(); if (REIRuntime.getInstance().isOverlayVisible()) { menuAccess.afterRender(); } 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 949e69dc5..4f77e677a 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 @@ -45,7 +45,7 @@ import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; import me.shedaniel.rei.impl.client.ClientHelperImpl; -import me.shedaniel.rei.impl.client.REIRuntimeImpl; +import me.shedaniel.rei.impl.client.gui.DisplayScreenStack; import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.widget.AutoCraftingButtonWidget; import me.shedaniel.rei.impl.client.gui.widget.TabWidget; @@ -273,8 +273,8 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { init(); return true; } else if (ConfigObject.getInstance().getPreviousScreenKeybind().matchesMouse(button)) { - if (REIRuntimeImpl.getInstance().hasLastDisplayScreen()) { - minecraft.setScreen(REIRuntimeImpl.getInstance().getLastDisplayScreen()); + if (DisplayScreenStack.hasLastDisplayScreen()) { + minecraft.setScreen(DisplayScreenStack.getLastDisplayScreen()); } else { minecraft.setScreen(REIRuntime.getInstance().getPreviousScreen()); } @@ -390,7 +390,7 @@ else if (scrollBarAlphaFuture == 1) Optional.ofNullable(displayRenderers.get(i).getTooltip(TooltipContext.of(new Point(mouseX, mouseY)))).ifPresent(Tooltip::queue); } } - scrolling.renderScrollBar(0, scrollBarAlpha, REIRuntime.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); + scrolling.renderScrollBar(0, scrollBarAlpha, ConfigObject.getInstance().isUsingDarkTheme() ? 0.8f : 1f); ScissorsHandler.INSTANCE.removeLastScissor(); matrices.popPose(); } @@ -451,8 +451,8 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { return true; } if (ConfigObject.getInstance().getPreviousScreenKeybind().matchesKey(keyCode, scanCode)) { - if (REIRuntimeImpl.getInstance().hasLastDisplayScreen()) { - minecraft.setScreen(REIRuntimeImpl.getInstance().getLastDisplayScreen()); + if (DisplayScreenStack.hasLastDisplayScreen()) { + minecraft.setScreen(DisplayScreenStack.getLastDisplayScreen()); } else { minecraft.setScreen(REIRuntime.getInstance().getPreviousScreen()); } 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 f6c590eeb..f11a66827 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 @@ -53,7 +53,7 @@ import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; import me.shedaniel.rei.impl.client.ClientHelperImpl; -import me.shedaniel.rei.impl.client.REIRuntimeImpl; +import me.shedaniel.rei.impl.client.gui.DisplayScreenStack; import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.RecipeDisplayExporter; import me.shedaniel.rei.impl.client.gui.toast.ExportRecipeIdentifierToast; @@ -128,8 +128,8 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { return true; } if (ConfigObject.getInstance().getPreviousScreenKeybind().matchesKey(keyCode, scanCode)) { - if (REIRuntimeImpl.getInstance().hasLastDisplayScreen()) { - minecraft.setScreen(REIRuntimeImpl.getInstance().getLastDisplayScreen()); + if (DisplayScreenStack.hasLastDisplayScreen()) { + minecraft.setScreen(DisplayScreenStack.getLastDisplayScreen()); } else { minecraft.setScreen(REIRuntime.getInstance().getPreviousScreen()); } @@ -368,7 +368,7 @@ private static int getRecipesPerPage(int totalHeight, DisplayCategory categor } private final ValueAnimator darkStripesColor = ValueAnimator.ofColor() - .withConvention(() -> Color.ofTransparent(REIRuntime.getInstance().isDarkThemeEnabled() ? 0xFF404040 : 0xFF9E9E9E), ValueAnimator.typicalTransitionTime()); + .withConvention(() -> Color.ofTransparent(ConfigObject.getInstance().isUsingDarkTheme() ? 0xFF404040 : 0xFF9E9E9E), ValueAnimator.typicalTransitionTime()); @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { @@ -531,8 +531,8 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { recipeBack.onClick(); return recipeBack.isEnabled(); } else if (ConfigObject.getInstance().getPreviousScreenKeybind().matchesMouse(button)) { - if (REIRuntimeImpl.getInstance().hasLastDisplayScreen()) { - minecraft.setScreen(REIRuntimeImpl.getInstance().getLastDisplayScreen()); + if (DisplayScreenStack.hasLastDisplayScreen()) { + minecraft.setScreen(DisplayScreenStack.getLastDisplayScreen()); } else { minecraft.setScreen(REIRuntime.getInstance().getPreviousScreen()); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java index 354090d01..d468a6128 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java @@ -38,7 +38,6 @@ import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.impl.client.ClientHelperImpl; -import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; @@ -175,7 +174,7 @@ else if (!ClientHelperImpl.getInstance().hasOperatorPermission()) { private static Rectangle getConfigButtonBounds() { if (ConfigObject.getInstance().isLowerConfigButton()) { - Rectangle area = REIRuntimeImpl.getSearchField().getBounds().clone(); + Rectangle area = REIRuntime.getInstance().getSearchTextField().asWidget().getBounds().clone(); area.setLocation(area.x + area.width + (ConfigObject.getInstance().isCraftableFilterEnabled() ? 26 : 4), area.y - 1); area.setSize(20, 20); return area; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java index 7d88521d4..7994ba44b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java @@ -35,7 +35,6 @@ import me.shedaniel.rei.api.client.search.method.InputMethod; import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; @@ -158,7 +157,7 @@ public static List createInputMethodEntries(List onClick; private final NumberAnimator darkBackgroundAlpha = ValueAnimator.ofFloat() - .withConvention(() -> REIRuntime.getInstance().isDarkThemeEnabled() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) + .withConvention(() -> ConfigObject.getInstance().isUsingDarkTheme() ? 1.0F : 0.0F, ValueAnimator.typicalTransitionTime()) .asFloat(); private TabWidget(int id, Rectangle bounds, int u, int v, @Nullable Predicate onClick) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java index 14a1f5d3b..a2187dd42 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java @@ -61,7 +61,7 @@ public class EntryListSearchManager { public static final EntryListSearchManager INSTANCE = new EntryListSearchManager(); - private SearchManager searchManager = new AsyncSearchManager(EntryRegistry.getInstance()::getPreFilteredList, () -> { + private final SearchManager searchManager = new AsyncSearchManager(EntryRegistry.getInstance()::getPreFilteredList, () -> { boolean checkCraftable = ConfigManager.getInstance().isCraftableOnlyEnabled(); LongSet workingItems = checkCraftable ? new LongOpenHashSet() : null; if (checkCraftable) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java index 2781431c1..e3009d27b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java @@ -47,7 +47,6 @@ import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.ClientHelperImpl; -import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; @@ -363,6 +362,6 @@ public void init(ScreenOverlayImpl overlay) { @Override public void queueReloadSearch() { - updateSearch(REIRuntimeImpl.getSearchField().getText(), true); + updateSearch(REIRuntime.getInstance().getSearchTextField().getText(), true); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java index 5fd238d70..7de0b2e9c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java @@ -32,6 +32,7 @@ import me.shedaniel.clothconfig2.api.scroll.ScrollingContainer; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.BatchedSlots; import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Widgets; @@ -119,7 +120,7 @@ protected void renderEntries(boolean fastEntryRendering, PoseStack matrices, int scrolling.updatePosition(delta); ScissorsHandler.INSTANCE.removeLastScissor(); if (scrolling.getMaxScroll() > 0) { - scrolling.renderScrollBar(0, 1, REIRuntime.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); + scrolling.renderScrollBar(0, 1, ConfigObject.getInstance().isUsingDarkTheme() ? 0.8f : 1f); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java index 8d4fdd4f1..18969948b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java @@ -132,7 +132,7 @@ public void render(PoseStack poses, int mouseX, int mouseY, float delta) { slots.render(poses, mouseX, mouseY, delta); updatePosition(delta); - scrolling.renderScrollBar(0, 1, REIRuntime.getInstance().isDarkThemeEnabled() ? 0.8f : 1f); + scrolling.renderScrollBar(0, 1, ConfigObject.getInstance().isUsingDarkTheme() ? 0.8f : 1f); ScissorsHandler.INSTANCE.removeLastScissor(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java index 76c502d7b..c3a5506e8 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java @@ -161,7 +161,7 @@ private void drawHint(PoseStack poses, int mouseX, int mouseY) { clicking = mouseDown; } - List hintProviders = REIRuntimeImpl.getInstance().getHintProviders(); + List hintProviders = HintProvider.PROVIDERS; List> hints = CollectionUtils.flatMap(hintProviders, provider -> CollectionUtils.map(provider.provide(), component -> new Pair<>(provider, component))); if (hints.isEmpty()) return; diff --git a/settings.gradle b/settings.gradle index f79d9de3b..3dc9f111a 100755 --- a/settings.gradle +++ b/settings.gradle @@ -36,6 +36,9 @@ include "runtime-frontend:widgets" include "runtime-frontend:filtering" include "runtime-frontend:display" include "runtime-frontend:overlay" +include "runtime-frontend:paginated-entries" +include "runtime-frontend:scrolled-entries" +include "runtime-frontend:favorites-entries" include "runtime" include "fabric" include "forge" diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java index c7697c533..66a9f6a20 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java @@ -27,6 +27,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.impl.common.Internals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.network.chat.Component; @@ -37,6 +38,8 @@ @Environment(EnvType.CLIENT) public interface HintProvider { + List PROVIDERS = Internals.resolveServices(HintProvider.class); + List provide(); @Nullable diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java index 3d3895880..7d64bc935 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java @@ -33,10 +33,10 @@ import java.util.function.BooleanSupplier; @ApiStatus.Internal -public class ConfigReloadingScreen extends Screen { +public final class ConfigReloadingScreen extends Screen { private final Component title; private final BooleanSupplier predicate; - private Runnable parent; + private final Runnable parent; public ConfigReloadingScreen(Component title, BooleanSupplier predicate, Runnable parent) { super(NarratorChatListener.NO_TITLE); diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java index 1d3bfdecb..eab390d90 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java @@ -55,14 +55,17 @@ public AsyncSearchManager(Supplier>> stacksProvider, Supplier this.transformer = transformer; } + @Override public void markDirty() { this.dirty = true; } + @Override public void markFilterDirty() { this.filterDirty = true; } + @Override public void updateFilter(String filter) { if (this.filter == null || !this.filter.getFilter().equals(filter)) { this.filter = SearchProvider.getInstance().createFilter(filter); @@ -71,14 +74,17 @@ public void updateFilter(String filter) { } } + @Override public boolean isDirty() { return last == null || dirty; } + @Override public boolean isFilterDirty() { return filterDirty; } + @Override public Future getAsync(Consumer>> consumer) { if (future == null || future.isCancelled() || future.isDone() || future.isCompletedExceptionally()) { if (future != null) future.cancel(true); @@ -142,6 +148,7 @@ public List> get() { return last; } + @Override public boolean matches(EntryStack stack) { return filter.test(stack); } diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/SearchManager.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/SearchManager.java index 92c44dc02..2b7ba8d0f 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/SearchManager.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/SearchManager.java @@ -23,7 +23,6 @@ package me.shedaniel.rei.impl.client.search; -import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.entry.EntryStack; import java.util.List; From f5061d043cac7f0217bbe9d4c041b77f9ef911a1 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 27 Aug 2022 13:23:48 +0900 Subject: [PATCH 13/20] Run on macOS for more memory --- .github/workflows/curseforge.yml | 2 +- .github/workflows/gradle.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/curseforge.yml b/.github/workflows/curseforge.yml index e46909da5..d67a5ad2d 100644 --- a/.github/workflows/curseforge.yml +++ b/.github/workflows/curseforge.yml @@ -14,7 +14,7 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: macos-latest if: "!contains(github.event.head_commit.message, 'ci skip')" steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 60cb21cce..600458d1b 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -4,7 +4,7 @@ on: [push] jobs: build: - runs-on: ubuntu-latest + runs-on: macos-latest steps: - uses: actions/checkout@v2 - name: Set up JDK 17 From 94e323f75c17e297c33fba1d3afb5c47ae66a8ad Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 28 Aug 2022 18:50:24 +0900 Subject: [PATCH 14/20] Separate EntryListWidget and FavoritesListWidget more --- .../rei/api/client/ClientHelper.java | 5 +- .../client/gui/widgets/DelegateWidget.java | 4 + .../gui/widgets/DelegateWidgetWithBounds.java | 12 ++ .../api/client/gui/widgets/TooltipQueue.java | 23 +++ .../rei/api/client/gui/widgets/Widgets.java | 4 +- .../rei/api/client/overlay/ScreenOverlay.java | 12 ++ .../api/client/registry/screen/ClickArea.java | 14 ++ .../api/client/view/ViewSearchBuilder.java | 15 ++ .../common/networking/NetworkingHelper.java | 56 +++++++ .../rei/impl/client/ClientInternals.java | 11 +- .../impl/client/provider/TooltipRenderer.java | 34 ++++ build.gradle | 3 +- .../categories/tag/DefaultTagCategory.java | 23 ++- .../rei/fabric/PluginDetectorImpl.java | 25 --- ...plFabric.java => TooltipRendererImpl.java} | 24 ++- ...l.rei.impl.client.provider.TooltipRenderer | 1 + ...mplForge.java => TooltipRendererImpl.java} | 7 +- ...l.rei.impl.client.provider.TooltipRenderer | 1 + .../view/LegacyWrapperViewSearchBuilder.java | 145 ------------------ .../client/view/ViewSearchBuilderImpl.java | 13 ++ .../rei/impl/client/view/ViewsImpl.java | 6 + .../favorites-entries/build.gradle | 3 + .../favorites/FavoritesListWidgetImpl.java | 29 +++- .../favorites/history/DisplayEntry.java | 7 +- .../history/DisplayHistoryManager.java | 0 .../history/DisplayHistoryWidget.java | 6 +- .../listeners/FavoritesRegionListener.java | 2 +- .../panel/FadingFavoritesPanelButton.java | 6 +- .../favorites/panel/FavoritesPanel.java | 13 +- .../panel/FavoritesTogglePanelButton.java | 4 +- .../panel/rows/FavoritesPanelEmptyRow.java | 0 .../panel/rows/FavoritesPanelEntriesRow.java | 6 +- .../panel/rows/FavoritesPanelRow.java | 0 .../panel/rows/FavoritesPanelSectionRow.java | 0 .../rows/FavoritesPanelSeparatorRow.java | 0 .../widget/favorites/trash/TrashWidget.java | 6 +- .../region/EntryStacksRegionWidget.java | 3 +- .../gui/widget/region/RealRegionEntry.java | 5 +- .../widget/region/RegionDraggableStack.java | 0 .../gui/widget/region/RegionEntryWidget.java | 10 +- .../gui/widget/region/RegionListener.java | 0 runtime-frontend/overlay-entries/build.gradle | 3 + .../entries}/CollapsedEntriesTooltip.java | 10 +- .../gui/overlay/entries}/CollapsedStack.java | 2 +- .../entries}/CollapsingEntryListWidget.java | 4 +- .../entries/DefaultEntryListProvider.java | 47 ++++++ .../overlay/entries}/EntryListEntries.java | 2 +- .../entries}/EntryListSearchManager.java | 7 +- .../overlay/entries}/EntryListStackEntry.java | 9 +- .../overlay/entries/EntryListWidgetImpl.java | 87 +++++------ .../entries/cache}/CachedEntryListRender.java | 2 +- .../entries/cache}/CachingEntryRenderer.java | 2 +- .../paginated}/PaginatedEntryListWidget.java | 27 ++-- .../scrolled}/ScrolledEntryListWidget.java | 10 +- .../overlay/widgets}/ConfigButtonWidget.java | 29 ++-- .../widgets}/CraftableFilterButtonWidget.java | 21 ++- ...ient.gui.overlay.entries.EntryListProvider | 1 + ....gui.overlay.widgets.OverlayWidgetProvider | 2 + .../gui/dragging/DraggingContextImpl.java | 15 +- .../client/gui/menu/AbstractMenuEntry.java | 0 .../rei/impl/client/gui/menu/Menu.java | 3 +- .../rei/impl/client/gui/menu/MenuAccess.java | 0 .../impl/client/gui/menu/MenuAccessImpl.java | 10 +- .../rei/impl/client/gui/menu/MenuEntry.java | 0 .../gui/menu/entries/EmptyMenuEntry.java | 0 .../gui/menu/entries/SeparatorMenuEntry.java | 0 .../client/gui/menu/entries/SubMenuEntry.java | 0 .../gui/menu/entries/TextMenuEntry.java | 0 .../gui/menu/entries/ToggleMenuEntry.java | 3 +- .../gui/overlay/AbstractScreenOverlay.java | 43 ++---- .../client/gui/overlay/EntryListProvider.java | 9 -- .../gui/overlay/FavoritesListProvider.java | 11 -- .../gui/overlay/InternalOverlayBounds.java | 11 +- .../client/gui/overlay}/LateRenderable.java | 2 +- .../gui/overlay}/ScreenOverlayImpl.java | 121 +++++++++------ .../overlay/entries/EntryListProvider.java | 33 ++++ .../gui/overlay/entries/EntryListWidget.java | 44 ++++++ .../entries/FavoritesListProvider.java | 34 ++++ .../overlay/entries/FavoritesListWidget.java | 25 +-- .../widgets}/DisplayTooltipComponent.java | 2 +- .../widgets}/DisplayedEntryWidget.java | 2 +- .../widgets/OverlayWidgetProvider.java | 37 +++++ .../widgets}/RegionRenderingDebugger.java | 2 +- .../overlay/widgets/ScaleIndicatorWidget.java | 72 +++++++++ .../rei/impl/client/ClientHelperImpl.java | 12 -- .../impl/client/ClientNetworkHelperImpl.java | 2 +- .../rei/impl/client/REIRuntimeImpl.java | 11 +- .../impl/client/gui/DisplayScreenStack.java | 23 +++ .../impl/client/gui/error/ErrorsScreen.java | 12 +- .../client/gui/widget/EntryHighlighter.java | 64 -------- .../gui/widget/search/OverlaySearchField.java | 46 +++++- .../runtime/DefaultClientRuntimePlugin.java | 4 +- settings.gradle | 3 +- .../rei/impl/client/search/SearchManager.java | 5 + .../rei/impl/common/util/RectangleUtils.java | 0 95 files changed, 876 insertions(+), 588 deletions(-) create mode 100644 api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkingHelper.java create mode 100644 api/src/main/java/me/shedaniel/rei/impl/client/provider/TooltipRenderer.java rename fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/{ScreenOverlayImplFabric.java => TooltipRendererImpl.java} (78%) create mode 100644 fabric/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.TooltipRenderer rename forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/{ScreenOverlayImplForge.java => TooltipRendererImpl.java} (90%) create mode 100644 forge/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.TooltipRenderer delete mode 100644 runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/LegacyWrapperViewSearchBuilder.java create mode 100644 runtime-frontend/favorites-entries/build.gradle rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java => runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java (91%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java (97%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java (100%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java (99%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java (97%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FadingFavoritesPanelButton.java (97%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesPanel.java (93%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesTogglePanelButton.java (97%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEmptyRow.java (100%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java (97%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelRow.java (100%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSectionRow.java (100%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSeparatorRow.java (100%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/trash/TrashWidget.java (97%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java (99%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java (95%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionDraggableStack.java (100%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java (93%) rename {runtime => runtime-frontend/favorites-entries}/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java (100%) create mode 100644 runtime-frontend/overlay-entries/build.gradle rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries}/CollapsedEntriesTooltip.java (93%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries}/CollapsedStack.java (97%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries}/CollapsingEntryListWidget.java (98%) create mode 100644 runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/DefaultEntryListProvider.java rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries}/EntryListEntries.java (97%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries}/EntryListSearchManager.java (97%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries}/EntryListStackEntry.java (96%) rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidgetImpl.java (81%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache}/CachedEntryListRender.java (99%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache}/CachingEntryRenderer.java (98%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/paginated}/PaginatedEntryListWidget.java (90%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/scrolled}/ScrolledEntryListWidget.java (95%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets}/ConfigButtonWidget.java (89%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets}/CraftableFilterButtonWidget.java (92%) create mode 100644 runtime-frontend/overlay-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.entries.EntryListProvider create mode 100644 runtime-frontend/overlay-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.widgets.OverlayWidgetProvider rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java => runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/DraggingContextImpl.java (96%) rename {runtime => runtime-frontend/overlay}/src/main/java/me/shedaniel/rei/impl/client/gui/menu/AbstractMenuEntry.java (100%) rename {runtime => runtime-frontend/overlay}/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java (98%) rename {runtime => runtime-frontend/overlay}/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java (100%) rename {runtime => runtime-frontend/overlay}/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java (95%) rename {runtime => runtime-frontend/overlay}/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuEntry.java (100%) rename {runtime => runtime-frontend/overlay}/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/EmptyMenuEntry.java (100%) rename {runtime => runtime-frontend/overlay}/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SeparatorMenuEntry.java (100%) rename {runtime => runtime-frontend/overlay}/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SubMenuEntry.java (100%) rename {runtime => runtime-frontend/overlay}/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/TextMenuEntry.java (100%) rename {runtime => runtime-frontend/overlay}/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java (97%) rename {runtime => runtime-frontend/overlay}/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java (88%) delete mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/EntryListProvider.java delete mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/FavoritesListProvider.java rename {runtime => runtime-frontend/overlay}/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java (91%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay}/LateRenderable.java (96%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui => runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay}/ScreenOverlayImpl.java (61%) create mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListProvider.java create mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidget.java create mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListProvider.java rename runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java => runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListWidget.java (63%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets}/DisplayTooltipComponent.java (98%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets}/DisplayedEntryWidget.java (99%) create mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region => runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets}/RegionRenderingDebugger.java (98%) create mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ScaleIndicatorWidget.java delete mode 100644 runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryHighlighter.java rename {runtime => shared-internals}/src/main/java/me/shedaniel/rei/impl/common/util/RectangleUtils.java (100%) diff --git a/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java b/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java index 7169e83ad..c044b583c 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java @@ -28,6 +28,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.networking.NetworkingHelper; import me.shedaniel.rei.api.common.util.FormattingUtils; import me.shedaniel.rei.impl.client.ClientInternals; import net.fabricmc.api.EnvType; @@ -206,5 +207,7 @@ default String getModFromIdentifier(ResourceLocation identifier) { * * @return whether the client can use move items packets */ - boolean canUseMovePackets(); + default boolean canUseMovePackets() { + return NetworkingHelper.getInstance().client().canUseMovePackets(); + } } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/DelegateWidget.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/DelegateWidget.java index e4ff00b7b..aa91c9b76 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/DelegateWidget.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/DelegateWidget.java @@ -39,6 +39,10 @@ public DelegateWidget(Widget widget) { this.widget = widget; } + public DelegateWidget() { + this(Widgets.noOp()); + } + protected Widget delegate() { return widget; } diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/DelegateWidgetWithBounds.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/DelegateWidgetWithBounds.java index 593a62588..e7f00d773 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/DelegateWidgetWithBounds.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/DelegateWidgetWithBounds.java @@ -36,6 +36,18 @@ public DelegateWidgetWithBounds(Widget widget, Supplier bounds) { this.bounds = bounds; } + public DelegateWidgetWithBounds(Supplier bounds) { + this(Widgets.noOp(), bounds); + } + + public DelegateWidgetWithBounds(Rectangle bounds) { + this(Widgets.noOp(), () -> bounds); + } + + public DelegateWidgetWithBounds() { + this(new Rectangle()); + } + @Override public Rectangle getBounds() { return bounds.get(); diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipQueue.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipQueue.java index c938cd8d6..007cd777c 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipQueue.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TooltipQueue.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.api.client.gui.widgets; import me.shedaniel.rei.impl.client.ClientInternals; diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java index 67dfe7cbb..0183b480e 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widgets.java @@ -333,7 +333,7 @@ public static BatchedSlots createBatchedSlots() { } public static Widget delegate(Supplier supplier) { - return new DelegateWidget(Widgets.noOp()) { + return new DelegateWidget() { @Override protected Widget delegate() { return supplier.get(); @@ -342,7 +342,7 @@ protected Widget delegate() { } public static WidgetWithBounds delegateWithBounds(Supplier supplier) { - return new DelegateWidgetWithBounds(Widgets.noOp(), Rectangle::new) { + return new DelegateWidgetWithBounds() { @Override protected WidgetWithBounds delegate() { return supplier.get(); diff --git a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java index b9758f235..5d8ed2b80 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java @@ -28,8 +28,11 @@ import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; +import me.shedaniel.rei.api.client.search.SearchFilter; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import java.util.Optional; @@ -96,6 +99,15 @@ public abstract class ScreenOverlay extends WidgetWithBounds { */ public abstract TextField getSearchField(); + /** + * Returns the current search filter. + * + * @return the current search filter + */ + @ApiStatus.Experimental + @Nullable + public abstract SearchFilter getCurrentSearchFilter(); + /** * Renders a tooltip. * diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/screen/ClickArea.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/screen/ClickArea.java index 8b6aad935..97d46001e 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/registry/screen/ClickArea.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/screen/ClickArea.java @@ -44,6 +44,20 @@ public interface ClickArea { @ApiStatus.NonExtendable interface ClickAreaContext { + static ClickAreaContext of(T screen, Point mouse) { + return new ClickAreaContext<>() { + @Override + public T getScreen() { + return screen; + } + + @Override + public Point getMousePosition() { + return mouse; + } + }; + } + T getScreen(); Point getMousePosition(); diff --git a/api/src/main/java/me/shedaniel/rei/api/client/view/ViewSearchBuilder.java b/api/src/main/java/me/shedaniel/rei/api/client/view/ViewSearchBuilder.java index 5f7a2c1a4..985048b7a 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/view/ViewSearchBuilder.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/view/ViewSearchBuilder.java @@ -219,6 +219,21 @@ default ViewSearchBuilder addAllCategories() { */ ViewSearchBuilder processingVisibilityHandlers(boolean processingVisibilityHandlers); + /** + * Force-all displays to the view search builder. + * + * @param displays the displays to add + * @return the {@link ViewSearchBuilder} for chaining + */ + ViewSearchBuilder addDisplays(Collection displays); + + /** + * Returns the collection of additional displays to show. + * + * @return the collection of additional displays to show. + */ + Collection getAdditionalDisplays(); + /** * Opens the view after the search is complete. * diff --git a/api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkingHelper.java b/api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkingHelper.java new file mode 100644 index 000000000..ca1e2ad41 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkingHelper.java @@ -0,0 +1,56 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.api.common.networking; + +import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.api.common.plugins.REIServerPlugin; +import me.shedaniel.rei.api.common.registry.Reloadable; + +public interface NetworkingHelper extends Reloadable { + static NetworkingHelper getInstance() { + return PluginManager.getServerInstance().get(NetworkingHelper.class); + } + + Client client(); + + interface Client { + boolean hasPermissionToUsePackets(); + + boolean hasOperatorPermission(); + + /** + * Returns whether the client can use delete items packets. + * + * @return whether the client can use delete items packets + */ + boolean canUseDeletePackets(); + + /** + * Returns whether the client can use move items packets. + * + * @return whether the client can use move items packets + */ + boolean canUseMovePackets(); + } +} diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java b/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java index 0791ec310..eeb03e5fb 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java @@ -40,7 +40,6 @@ import me.shedaniel.rei.impl.client.provider.*; import me.shedaniel.rei.impl.common.Internals; import net.minecraft.ReportedException; -import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.TooltipFlag; @@ -66,9 +65,9 @@ public final class ClientInternals { private static final List OVERLAY_TICKERS = resolveServices(OverlayTicker.class); private static final AutoCraftingEvaluator AUTO_CRAFTING_EVALUATOR = resolveService(AutoCraftingEvaluator.class); private static final TooltipQueue TOOLTIP_QUEUE = resolveService(TooltipQueue.class); + private static final TooltipRenderer TOOLTIP_RENDERER = resolveService(TooltipRenderer.class); private static Function> favoriteEntryFromJson = (object) -> throwNotSetup(); private static Function clickAreaHandlerResult = (result) -> throwNotSetup(); - private static BiConsumer, TooltipComponent> clientTooltipComponentProvider = (tooltip, result) -> throwNotSetup(); private static BiFunction<@Nullable Point, Collection, Tooltip> tooltipProvider = (point, texts) -> throwNotSetup(); private static TriFunction tooltipContextProvider = (point, texts, search) -> throwNotSetup(); private static Function tooltipEntryProvider = (component) -> throwNotSetup(); @@ -135,14 +134,14 @@ public static ClickArea.Result createClickAreaHandlerResult(boolean applicable) return clickAreaHandlerResult.apply(applicable); } - public static void getClientTooltipComponent(List tooltip, TooltipComponent component) { - clientTooltipComponentProvider.accept(tooltip, component); - } - public static Tooltip createTooltip(@Nullable Point point, Collection texts) { return tooltipProvider.apply(point, texts); } + public static TooltipRenderer getTooltipRenderer() { + return TOOLTIP_RENDERER; + } + public static TooltipContext createTooltipContext(Point point, @Nullable TooltipFlag flag, boolean isSearch) { return tooltipContextProvider.apply(point, flag, isSearch); } diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/provider/TooltipRenderer.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/TooltipRenderer.java new file mode 100644 index 000000000..df510bee7 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/TooltipRenderer.java @@ -0,0 +1,34 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.provider; + +import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import net.minecraft.client.gui.screens.Screen; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public interface TooltipRenderer { + void renderTooltip(Screen screen, PoseStack matrices, Tooltip tooltip, int mouseX, int mouseY); +} diff --git a/build.gradle b/build.gradle index 2acfe1558..8dbc6a359 100755 --- a/build.gradle +++ b/build.gradle @@ -38,8 +38,7 @@ allprojects { ":runtime-frontend:filtering", ":runtime-frontend:display", ":runtime-frontend:overlay", - ":runtime-frontend:paginated-entries", - ":runtime-frontend:scrolled-entries", + ":runtime-frontend:overlay-entries", ":runtime-frontend:favorites-entries", ] depProjects = [ diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/DefaultTagCategory.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/DefaultTagCategory.java index 95a25eace..1ab934333 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/DefaultTagCategory.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/categories/tag/DefaultTagCategory.java @@ -180,19 +180,16 @@ public Tooltip getTooltip(TooltipContext context) { } }) .tooltipLine(new TranslatableComponent("text.rei.tag.copy.clipboard"))); - widgets.add(Widgets.withTranslate(new DelegateWidget(Widgets.noOp()) { - @Override - protected Widget delegate() { - ResourceLocation expandTexture = !expanded[0] ? new ResourceLocation("roughlyenoughitems", "textures/gui/expand.png") - : new ResourceLocation("roughlyenoughitems", "textures/gui/shrink.png"); - return Widgets.concat( - Widgets.createTexturedWidget(expandTexture, - new Rectangle(recipeBounds.x + 5 + 2, recipeBounds.y + 6 + 2, 13 - 4, 13 - 4), 0, 0, 9, 9), - Widgets.createTexturedWidget(new ResourceLocation("roughlyenoughitems", "textures/gui/clipboard.png"), - new Rectangle(recipeBounds.x + 5 + 2, recipeBounds.getMaxY() - 6 - 13 + 2, 13 - 4, 13 - 4), 0, 0, 9, 9) - ); - } - }, 0, 0, 10)); + widgets.add(Widgets.withTranslate(Widgets.delegate(() -> { + ResourceLocation expandTexture = !expanded[0] ? new ResourceLocation("roughlyenoughitems", "textures/gui/expand.png") + : new ResourceLocation("roughlyenoughitems", "textures/gui/shrink.png"); + return Widgets.concat( + Widgets.createTexturedWidget(expandTexture, + new Rectangle(recipeBounds.x + 5 + 2, recipeBounds.y + 6 + 2, 13 - 4, 13 - 4), 0, 0, 9, 9), + Widgets.createTexturedWidget(new ResourceLocation("roughlyenoughitems", "textures/gui/clipboard.png"), + new Rectangle(recipeBounds.x + 5 + 2, recipeBounds.getMaxY() - 6 - 13 + 2, 13 - 4, 13 - 4), 0, 0, 9, 9) + ); + }), 0, 0, 10)); Matrix4f translateMatrix = Matrix4f.createTranslateMatrix(0, 0, 200); Matrix4f identity = new Matrix4f(); diff --git a/fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java b/fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java index c1abbce5f..a355183c3 100644 --- a/fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java +++ b/fabric/src/main/java/me/shedaniel/rei/fabric/PluginDetectorImpl.java @@ -23,28 +23,20 @@ package me.shedaniel.rei.fabric; -import com.google.common.base.Suppliers; import dev.architectury.platform.Platform; import dev.architectury.utils.Env; import me.shedaniel.rei.RoughlyEnoughItemsState; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.common.plugins.*; -import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.init.PluginDetector; import me.shedaniel.rei.impl.init.PrimitivePlatformAdapter; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.entrypoint.EntrypointContainer; -import net.minecraft.client.gui.screens.Screen; -import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; -import net.minecraft.world.inventory.tooltip.TooltipComponent; import org.apache.commons.lang3.tuple.Pair; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.util.*; -import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -144,23 +136,6 @@ public void detectCommonPlugins() { public Supplier detectClientPlugins() { return () -> () -> { loadPlugin(REIClientPlugin.class, ((PluginView) PluginManager.getClientInstance())::registerPlugin); - Supplier method = Suppliers.memoize(() -> { - String methodName = FabricLoader.getInstance().getMappingResolver().mapMethodName("intermediary", "net.minecraft.class_437", "method_32635", "(Ljava/util/List;Lnet/minecraft/class_5632;)V"); - try { - Method declaredMethod = Screen.class.getDeclaredMethod(methodName, List.class, TooltipComponent.class); - if (declaredMethod != null) declaredMethod.setAccessible(true); - return declaredMethod; - } catch (NoSuchMethodException e) { - throw new RuntimeException(e); - } - }); - ClientInternals.attachInstance((BiConsumer, TooltipComponent>) (lines, component) -> { - try { - method.get().invoke(null, lines, component); - } catch (IllegalAccessException | InvocationTargetException e) { - throw new RuntimeException(e); - } - }, "clientTooltipComponentProvider"); }; } } diff --git a/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplFabric.java b/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/TooltipRendererImpl.java similarity index 78% rename from fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplFabric.java rename to fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/TooltipRendererImpl.java index 10c3865ae..df7fdaddb 100644 --- a/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/ScreenOverlayImplFabric.java +++ b/fabric/src/main/java/me/shedaniel/rei/impl/client/gui/fabric/TooltipRendererImpl.java @@ -23,11 +23,12 @@ package me.shedaniel.rei.impl.client.gui.fabric; +import com.google.common.base.Suppliers; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; -import me.shedaniel.rei.impl.client.ClientInternals; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.widget.TooltipImpl; +import me.shedaniel.rei.impl.client.provider.TooltipRenderer; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; @@ -37,13 +38,26 @@ import net.minecraft.util.FormattedCharSequence; import net.minecraft.world.inventory.tooltip.TooltipComponent; +import java.lang.reflect.Method; import java.util.List; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; -public class ScreenOverlayImplFabric extends ScreenOverlayImpl { +public class TooltipRendererImpl implements TooltipRenderer { + private final Supplier method = Suppliers.memoize(() -> { + String methodName = FabricLoader.getInstance().getMappingResolver().mapMethodName("intermediary", "net.minecraft.class_437", "method_32635", "(Ljava/util/List;Lnet/minecraft/class_5632;)V"); + try { + Method declaredMethod = Screen.class.getDeclaredMethod(methodName, List.class, TooltipComponent.class); + if (declaredMethod != null) declaredMethod.setAccessible(true); + return declaredMethod; + } catch (NoSuchMethodException e) { + throw new RuntimeException(e); + } + }); + @Override - public void renderTooltipInner(Screen screen, PoseStack matrices, Tooltip tooltip, int mouseX, int mouseY) { + public void renderTooltip(Screen screen, PoseStack matrices, Tooltip tooltip, int mouseX, int mouseY) { List lines = tooltip.entries().stream() .flatMap(component -> { if (component.isText()) { @@ -65,7 +79,7 @@ public void renderTooltipInner(Screen screen, PoseStack matrices, Tooltip toolti if (component instanceof ClientTooltipComponent) break; try { - ClientInternals.getClientTooltipComponent(lines, component); + method.get().invoke(lines, component); } catch (Throwable exception) { throw new IllegalArgumentException("Failed to add tooltip component! " + component + ", Class: " + (component == null ? null : component.getClass().getCanonicalName()), exception); } diff --git a/fabric/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.TooltipRenderer b/fabric/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.TooltipRenderer new file mode 100644 index 000000000..42a143652 --- /dev/null +++ b/fabric/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.TooltipRenderer @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.gui.fabric.TooltipRendererImpl \ No newline at end of file diff --git a/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplForge.java b/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/TooltipRendererImpl.java similarity index 90% rename from forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplForge.java rename to forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/TooltipRendererImpl.java index e18ba2e23..d957d2642 100644 --- a/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/ScreenOverlayImplForge.java +++ b/forge/src/main/java/me/shedaniel/rei/impl/client/gui/forge/TooltipRendererImpl.java @@ -28,20 +28,19 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import me.shedaniel.rei.impl.client.provider.TooltipRenderer; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.network.chat.Component; -import net.minecraft.world.inventory.tooltip.TooltipComponent; import net.minecraft.world.item.ItemStack; import net.minecraftforge.client.ForgeHooksClient; import java.util.ArrayList; import java.util.List; -public class ScreenOverlayImplForge extends ScreenOverlayImpl { +public class TooltipRendererImpl implements TooltipRenderer { @Override - public void renderTooltipInner(Screen screen, PoseStack matrices, Tooltip tooltip, int mouseX, int mouseY) { + public void renderTooltip(Screen screen, PoseStack matrices, Tooltip tooltip, int mouseX, int mouseY) { matrices.pushPose(); EntryStack stack = tooltip.getContextStack(); ItemStack itemStack = stack.getType() == VanillaEntryTypes.ITEM ? stack.castValue() : ItemStack.EMPTY; diff --git a/forge/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.TooltipRenderer b/forge/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.TooltipRenderer new file mode 100644 index 000000000..0285d5690 --- /dev/null +++ b/forge/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.TooltipRenderer @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.gui.forge.TooltipRendererImpl \ No newline at end of file diff --git a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/LegacyWrapperViewSearchBuilder.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/LegacyWrapperViewSearchBuilder.java deleted file mode 100644 index 406787e9f..000000000 --- a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/LegacyWrapperViewSearchBuilder.java +++ /dev/null @@ -1,145 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.view; - -import me.shedaniel.rei.api.client.registry.display.DisplayCategory; -import me.shedaniel.rei.api.client.view.ViewSearchBuilder; -import me.shedaniel.rei.api.common.category.CategoryIdentifier; -import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.display.DisplaySpec; -import org.jetbrains.annotations.Nullable; - -import java.util.*; - -public final class LegacyWrapperViewSearchBuilder extends AbstractViewSearchBuilder { - private final Map, List> map; - @Nullable - private EntryStack inputNotice; - @Nullable - private EntryStack outputNotice; - @Nullable - private CategoryIdentifier preferredOpenedCategory = null; - - public LegacyWrapperViewSearchBuilder(Map, List> map) { - this.map = map; - } - - @Override - public ViewSearchBuilder addCategory(CategoryIdentifier category) { - return this; - } - - @Override - public ViewSearchBuilder addCategories(Collection> categories) { - return this; - } - - @Override - public Set> getCategories() { - return Collections.emptySet(); - } - - @Override - public ViewSearchBuilder filterCategory(CategoryIdentifier category) { - return this; - } - - @Override - public ViewSearchBuilder filterCategories(Collection> categories) { - return this; - } - - @Override - public Set> getFilteringCategories() { - return Collections.emptySet(); - } - - @Override - public ViewSearchBuilder addRecipesFor(EntryStack stack) { - return this; - } - - @Override - public List> getRecipesFor() { - return inputNotice == null ? Collections.emptyList() : Collections.singletonList(outputNotice); - } - - @Override - public ViewSearchBuilder addUsagesFor(EntryStack stack) { - return this; - } - - @Override - public List> getUsagesFor() { - return inputNotice == null ? Collections.emptyList() : Collections.singletonList(inputNotice); - } - - @Override - public ViewSearchBuilder setPreferredOpenedCategory(@Nullable CategoryIdentifier category) { - this.preferredOpenedCategory = category; - return this; - } - - @Override - @Nullable - public CategoryIdentifier getPreferredOpenedCategory() { - return this.preferredOpenedCategory; - } - - public LegacyWrapperViewSearchBuilder addInputNotice(@Nullable EntryStack stack) { - this.inputNotice = stack; - return this; - } - - public LegacyWrapperViewSearchBuilder addOutputNotice(@Nullable EntryStack stack) { - this.outputNotice = stack; - return this; - } - - @Override - public Map, List> buildMapInternal() { - fillPreferredOpenedCategory(); - return this.map; - } - - @Override - public boolean isMergingDisplays() { - return true; - } - - @Override - public ViewSearchBuilder mergingDisplays(boolean mergingDisplays) { - return this; - } - - @Override - public boolean isProcessingVisibilityHandlers() { - return false; - } - - @Override - public ViewSearchBuilder processingVisibilityHandlers(boolean processingVisibilityHandlers) { - return this; - } -} diff --git a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewSearchBuilderImpl.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewSearchBuilderImpl.java index 354ac7e47..0d8640ac5 100644 --- a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewSearchBuilderImpl.java +++ b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewSearchBuilderImpl.java @@ -27,6 +27,7 @@ import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.display.DisplaySpec; import org.jetbrains.annotations.Nullable; @@ -39,6 +40,7 @@ public final class ViewSearchBuilderImpl extends AbstractViewSearchBuilder { private final Set> categories = new HashSet<>(); private final List> recipesFor = new ArrayList<>(); private final List> usagesFor = new ArrayList<>(); + private final List additionalDisplays = new ArrayList<>(); @Nullable private CategoryIdentifier preferredOpenedCategory = null; private boolean mergeDisplays = true; @@ -140,4 +142,15 @@ public ViewSearchBuilder processingVisibilityHandlers(boolean processingVisibili this.processVisibilityHandlers = processingVisibilityHandlers; return this; } + + @Override + public ViewSearchBuilder addDisplays(Collection displays) { + this.additionalDisplays.addAll(displays); + return this; + } + + @Override + public List getAdditionalDisplays() { + return Collections.unmodifiableList(additionalDisplays); + } } diff --git a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java index 3483b1ee3..a2400eb32 100644 --- a/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java +++ b/runtime-engine/views/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java @@ -211,6 +211,12 @@ private Map, List> _buildMapFor(ViewSearchBuilde generateLiveDisplays(displayRegistry, wrapForError(generator), builder, displayConsumer); } + for (Display display : builder.getAdditionalDisplays()) { + if (!processingVisibilityHandlers || displayRegistry.isDisplayVisible(display)) { + displayConsumer.accept(display); + } + } + Map, List> resultSpeced = (Map, List>) (Map) new LinkedHashMap<>(result); // optimize displays if (builder.isMergingDisplays() && ConfigObject.getInstance().doMergeDisplayUnderOne()) { diff --git a/runtime-frontend/favorites-entries/build.gradle b/runtime-frontend/favorites-entries/build.gradle new file mode 100644 index 000000000..0ce416375 --- /dev/null +++ b/runtime-frontend/favorites-entries/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compileClasspath(project(path: ":runtime-frontend:overlay", configuration: "namedElements")) +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java similarity index 91% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java index 1cec53e3a..82eb891be 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidget.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java @@ -43,7 +43,8 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import me.shedaniel.rei.impl.client.gui.overlay.entries.FavoritesListWidget; +import me.shedaniel.rei.impl.client.gui.overlay.widgets.ScaleIndicatorWidget; import me.shedaniel.rei.impl.client.gui.widget.favorites.history.DisplayHistoryManager; import me.shedaniel.rei.impl.client.gui.widget.favorites.history.DisplayHistoryWidget; import me.shedaniel.rei.impl.client.gui.widget.favorites.listeners.FavoritesRegionListener; @@ -61,17 +62,18 @@ import java.util.stream.Stream; @ApiStatus.Internal -public class FavoritesListWidget extends WidgetWithBounds implements DraggableComponentProviderWidget, DraggableComponentVisitorWidget, OverlayListWidget { +public class FavoritesListWidgetImpl extends WidgetWithBounds implements FavoritesListWidget, DraggableComponentProviderWidget, DraggableComponentVisitorWidget, OverlayListWidget { public Rectangle fullBounds; public Rectangle excludedBounds; public Rectangle favoritesBounds; private EntryStacksRegionWidget region = new EntryStacksRegionWidget<>(new FavoritesRegionListener(this)); - public final FavoritesPanel favoritePanel = new FavoritesPanel(this); + public final FavoritesPanel favoritePanel = new FavoritesPanel(this, region); public final TrashWidget trash = new TrashWidget(this); public final DisplayHistoryWidget displayHistory = new DisplayHistoryWidget(this); public final FavoritesTogglePanelButton togglePanelButton = new FavoritesTogglePanelButton(this); - private List children = ImmutableList.of(favoritePanel, togglePanelButton, region); + private final List children = ImmutableList.of(favoritePanel, togglePanelButton, region); + private final ScaleIndicatorWidget scaleIndicator = new ScaleIndicatorWidget(); @Override public boolean mouseScrolled(double mouseX, double mouseY, double amount) { @@ -79,7 +81,7 @@ public boolean mouseScrolled(double mouseX, double mouseY, double amount) { if (Screen.hasControlDown()) { ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); manager.set("advanced.accessibility.entrySize", manager.getConfig().getEntrySize() + amount * 0.075); - ScreenOverlayImpl.getEntryListWidget().scaleIndicator.setAs(10.0D); + scaleIndicator.set(); } else if (favoritePanel.mouseScrolled(mouseX, mouseY, amount)) { return true; } else if (displayHistory.mouseScrolled(mouseX, mouseY, amount)) { @@ -171,6 +173,9 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { region.render(matrices, mouseX, mouseY, delta); renderAddFavorite(matrices, mouseX, mouseY, delta); + + this.scaleIndicator.setCenter(favoritesBounds.getCenterX(), favoritesBounds.getCenterY()); + this.scaleIndicator.render(matrices, mouseX, mouseY, delta); } private void renderAddFavorite(PoseStack matrices, int mouseX, int mouseY, float delta) { @@ -189,10 +194,12 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { return false; } - public void updateFavoritesBounds(@Nullable String searchTerm) { + @Override + public void initBounds() { this.fullBounds = REIRuntime.getInstance().calculateFavoritesListArea(); this.excludedBounds = RectangleUtils.excludeZones(this.fullBounds, ScreenRegistry.getInstance().exclusionZones().getExclusionZones(minecraft.screen).stream()); this.favoritesBounds = RectangleUtils.excludeZones(this.fullBounds, Stream.of(displayHistory.createBounds(this.fullBounds, null))); + this.updateSearch(); } @Override @@ -234,4 +241,14 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { return true; return false; } + + @Override + public Widget asWidget() { + return this; + } + + @Override + public Rectangle getFavoritesBounds() { + return favoritesBounds; + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java index 14aaa3381..7af1d8a8b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayEntry.java @@ -34,9 +34,9 @@ import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; +import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.impl.client.ClientHelperImpl; import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.client.provider.AutoCraftingEvaluator; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -46,7 +46,6 @@ import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.UUID; @SuppressWarnings("UnstableApiUsage") @@ -239,9 +238,7 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { return true; } - ClientHelperImpl.getInstance() - .openView(Map.of(CategoryRegistry.getInstance().get(display.getCategoryIdentifier()).getCategory(), List.of(display)), - null, List.of(), List.of()); + ViewSearchBuilder.builder().addDisplays(List.of(display)).open(); Widgets.produceClickSound(); return true; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryManager.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java similarity index 99% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java index ba5b470f0..d67235f18 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java @@ -44,7 +44,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.impl.client.gui.widget.DisplayCompositeWidget; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; +import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidgetImpl; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.GameRenderer; @@ -58,14 +58,14 @@ @SuppressWarnings("UnstableApiUsage") public class DisplayHistoryWidget extends WidgetWithBounds implements DraggableComponentVisitorWidget, DraggableComponentProviderWidget { - private final FavoritesListWidget parent; + private final FavoritesListWidgetImpl parent; private final Rectangle bounds = new Rectangle(); private final NumberAnimator height; private boolean ignoreNextMouse; private final NumberAnimator scroll = ValueAnimator.ofDouble(); - public DisplayHistoryWidget(FavoritesListWidget parent) { + public DisplayHistoryWidget(FavoritesListWidgetImpl parent) { this.parent = parent; this.height = ValueAnimator.ofDouble().withConvention(() -> { boolean draggingDisplay = DraggingContext.getInstance().isDraggingComponent() diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java index 79f2ceac8..af361942a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/listeners/FavoritesRegionListener.java @@ -28,7 +28,7 @@ import me.shedaniel.rei.api.client.gui.drag.DraggableStack; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; import me.shedaniel.rei.impl.client.favorites.MutableFavoritesList; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; +import me.shedaniel.rei.impl.client.gui.overlay.entries.FavoritesListWidget; import me.shedaniel.rei.impl.client.gui.widget.region.RealRegionEntry; import me.shedaniel.rei.impl.client.gui.widget.region.RegionEntryWidget; import me.shedaniel.rei.impl.client.gui.widget.region.RegionListener; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FadingFavoritesPanelButton.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FadingFavoritesPanelButton.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FadingFavoritesPanelButton.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FadingFavoritesPanelButton.java index 4652ec53e..e2cbcf461 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FadingFavoritesPanelButton.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FadingFavoritesPanelButton.java @@ -30,7 +30,7 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; +import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidgetImpl; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.renderer.MultiBufferSource; @@ -39,13 +39,13 @@ @SuppressWarnings("UnstableApiUsage") public abstract class FadingFavoritesPanelButton extends WidgetWithBounds { - protected final FavoritesListWidget parent; + protected final FavoritesListWidgetImpl parent; public boolean wasClicked = false; public final NumberAnimator alpha = ValueAnimator.ofDouble(0); public final Rectangle bounds = new Rectangle(); - public FadingFavoritesPanelButton(FavoritesListWidget parent) { + public FadingFavoritesPanelButton(FavoritesListWidgetImpl parent) { this.parent = parent; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesPanel.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesPanel.java similarity index 93% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesPanel.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesPanel.java index f23bb2c10..7d6327fd3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesPanel.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesPanel.java @@ -38,8 +38,9 @@ import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; +import me.shedaniel.rei.impl.client.gui.overlay.entries.FavoritesListWidget; import me.shedaniel.rei.impl.client.gui.widget.favorites.panel.rows.*; +import me.shedaniel.rei.impl.client.gui.widget.region.EntryStacksRegionWidget; import net.minecraft.client.gui.components.events.GuiEventListener; import org.jetbrains.annotations.Nullable; @@ -49,6 +50,7 @@ @SuppressWarnings("UnstableApiUsage") public class FavoritesPanel extends WidgetWithBounds { private final FavoritesListWidget parent; + private final EntryStacksRegionWidget region; public final ProgressValueAnimator expendState = ValueAnimator.ofBoolean(0.1, false); private final Rectangle bounds = new Rectangle(); private final Rectangle innerBounds = new Rectangle(); @@ -75,8 +77,9 @@ public int getMaxScrollHeight() { } }; - public FavoritesPanel(FavoritesListWidget parent) { + public FavoritesPanel(FavoritesListWidget parent, EntryStacksRegionWidget region) { this.parent = parent; + this.region = region; } public void resetRows() { @@ -85,7 +88,7 @@ public void resetRows() { @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - this.bounds.setBounds(updatePanelArea(parent.favoritesBounds)); + this.bounds.setBounds(updatePanelArea(parent.getFavoritesBounds())); this.innerBounds.setBounds(bounds.x + 4, bounds.y + 4, bounds.width - 8, bounds.height - 20); this.expendState.update(delta); int buttonColor = 0xFFFFFF | (Math.round(0x34 * Math.min((float) expendState.progress() * 2, 1)) << 24); @@ -135,6 +138,10 @@ public FavoritesListWidget getParent() { return parent; } + public EntryStacksRegionWidget getRegion() { + return region; + } + public Rectangle getInnerBounds() { return innerBounds; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesTogglePanelButton.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesTogglePanelButton.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesTogglePanelButton.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesTogglePanelButton.java index 32415069b..70743a7fb 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesTogglePanelButton.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/FavoritesTogglePanelButton.java @@ -28,13 +28,13 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; +import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidgetImpl; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.network.chat.TranslatableComponent; @SuppressWarnings("UnstableApiUsage") public class FavoritesTogglePanelButton extends FadingFavoritesPanelButton { - public FavoritesTogglePanelButton(FavoritesListWidget parent) { + public FavoritesTogglePanelButton(FavoritesListWidgetImpl parent) { super(parent); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEmptyRow.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEmptyRow.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEmptyRow.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEmptyRow.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java index 55013445a..1d492deb2 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java @@ -39,7 +39,7 @@ import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; -import me.shedaniel.rei.impl.client.gui.widget.DisplayedEntryWidget; +import me.shedaniel.rei.impl.client.gui.overlay.widgets.DisplayedEntryWidget; import me.shedaniel.rei.impl.client.gui.widget.favorites.panel.FavoritesPanel; import me.shedaniel.rei.impl.client.gui.widget.region.RealRegionEntry; import me.shedaniel.rei.impl.client.gui.widget.region.RegionDraggableStack; @@ -52,7 +52,7 @@ import java.util.List; import java.util.function.Predicate; -import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; +import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.notSteppingOnExclusionZones; @SuppressWarnings("UnstableApiUsage") @@ -135,7 +135,7 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { public DraggableStack getHoveredStack(double mouseX, double mouseY) { for (SectionFavoriteWidget widget : widgets) { if (widget.slot.containsMouse(mouseX, mouseY + panel.getScrolledAmount())) { - RealRegionEntry entry = new RealRegionEntry<>(panel.getParent().getRegion(), widget.entry.copy(), entrySize()); + RealRegionEntry entry = new RealRegionEntry<>(panel.getRegion(), widget.entry.copy(), entrySize()); entry.size.setAs(entrySize() * 100); return new RegionDraggableStack<>(entry, widget.slot); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelRow.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelRow.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelRow.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelRow.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSectionRow.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSectionRow.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSectionRow.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSectionRow.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSeparatorRow.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSeparatorRow.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSeparatorRow.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelSeparatorRow.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/trash/TrashWidget.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/trash/TrashWidget.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/trash/TrashWidget.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/trash/TrashWidget.java index a93ea9b77..7ce5f7e6a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/trash/TrashWidget.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/trash/TrashWidget.java @@ -29,7 +29,7 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; +import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidgetImpl; import me.shedaniel.rei.impl.client.gui.widget.favorites.panel.FavoritesPanel; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.network.chat.Component; @@ -42,11 +42,11 @@ @SuppressWarnings("UnstableApiUsage") public class TrashWidget extends WidgetWithBounds { private final Rectangle bounds = new Rectangle(); - private final FavoritesListWidget parent; + private final FavoritesListWidgetImpl parent; private final NumberAnimator height; private double lastProgress; - public TrashWidget(FavoritesListWidget parent) { + public TrashWidget(FavoritesListWidgetImpl parent) { this.parent = parent; this.height = ValueAnimator.ofDouble().withConvention(() -> { Rectangle fullBounds = this.parent.favoritesBounds; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java similarity index 99% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java index 18969948b..962a32d9d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java @@ -34,7 +34,6 @@ import me.shedaniel.math.FloatingPoint; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.entry.region.RegionEntry; import me.shedaniel.rei.api.client.gui.drag.*; @@ -57,7 +56,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; +import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; public class EntryStacksRegionWidget> extends WidgetWithBounds implements DraggableStackProviderWidget, DraggableStackVisitorWidget { public final RegionListener listener; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java similarity index 95% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java index c5f7bf9cc..6ed75075e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java @@ -30,11 +30,12 @@ import me.shedaniel.rei.api.client.entry.region.RegionEntry; import me.shedaniel.rei.api.client.gui.widgets.Slot; -import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; +import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; +@SuppressWarnings("UnstableApiUsage") public class RealRegionEntry> { public EntryStacksRegionWidget region; - private T entry; + private final T entry; private final RegionEntryWidget widget; private boolean hidden; public ValueAnimator pos = ValueAnimator.ofFloatingPoint(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionDraggableStack.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionDraggableStack.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionDraggableStack.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionDraggableStack.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java similarity index 93% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java index 468feb536..edce563aa 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java @@ -24,7 +24,6 @@ package me.shedaniel.rei.impl.client.gui.widget.region; import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.math.Vector4f; import me.shedaniel.math.FloatingPoint; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.REIRuntime; @@ -35,15 +34,16 @@ import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.client.gui.menu.MenuEntry; -import me.shedaniel.rei.impl.client.gui.widget.DisplayedEntryWidget; +import me.shedaniel.rei.impl.client.gui.overlay.AbstractScreenOverlay; +import me.shedaniel.rei.impl.client.gui.overlay.widgets.DisplayedEntryWidget; import net.minecraft.client.gui.components.events.GuiEventListener; import java.util.*; import java.util.function.Supplier; +@SuppressWarnings("UnstableApiUsage") public class RegionEntryWidget> extends DisplayedEntryWidget { private final RealRegionEntry entry; @@ -71,7 +71,7 @@ public void renderExtra(PoseStack matrices, int mouseX, int mouseY, float delta) FloatingPoint value = entry.pos.value(); FloatingPoint target = entry.pos.target(); if (Math.abs(value.x - target.x) < 1 && Math.abs(value.y - target.y) < 1 && overlayOptional.isPresent() && menuEntries.isPresent()) { - ScreenOverlayImpl overlay = (ScreenOverlayImpl) overlayOptional.get(); + AbstractScreenOverlay overlay = (AbstractScreenOverlay) overlayOptional.get(); MenuAccess access = overlay.menuAccess(); UUID uuid = entry.getEntry().getUuid(); @@ -80,7 +80,7 @@ public void renderExtra(PoseStack matrices, int mouseX, int mouseY, float delta) } } - private MenuEntry convertMenu(ScreenOverlayImpl overlay, FavoriteMenuEntry entry) { + private MenuEntry convertMenu(AbstractScreenOverlay overlay, FavoriteMenuEntry entry) { return new MenuEntry() { @Override public List children() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java rename to runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java diff --git a/runtime-frontend/overlay-entries/build.gradle b/runtime-frontend/overlay-entries/build.gradle new file mode 100644 index 000000000..0ce416375 --- /dev/null +++ b/runtime-frontend/overlay-entries/build.gradle @@ -0,0 +1,3 @@ +dependencies { + compileClasspath(project(path: ":runtime-frontend:overlay", configuration: "namedElements")) +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedEntriesTooltip.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsedEntriesTooltip.java similarity index 93% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedEntriesTooltip.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsedEntriesTooltip.java index 74b540284..264ac057e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedEntriesTooltip.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsedEntriesTooltip.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.entrylist; +package me.shedaniel.rei.impl.client.gui.overlay.entries; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; @@ -37,6 +37,8 @@ import net.minecraft.util.Mth; import net.minecraft.world.inventory.tooltip.TooltipComponent; +import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; + public class CollapsedEntriesTooltip implements ClientTooltipComponent, TooltipComponent { private static final int MAX_WIDTH = 140; private final CollapsedStack stack; @@ -47,14 +49,14 @@ public CollapsedEntriesTooltip(CollapsedStack stack) { @Override public int getHeight() { - int entrySize = EntryListWidget.entrySize(); + int entrySize = entrySize(); int w = Math.max(1, MAX_WIDTH / entrySize); return Math.min(3, Mth.ceil(stack.getIngredient().size() / (float) w)) * entrySize + 2; } @Override public int getWidth(Font font) { - int entrySize = EntryListWidget.entrySize(); + int entrySize = entrySize(); int w = Math.max(1, MAX_WIDTH / entrySize); int size = stack.getIngredient().size(); return Math.min(size, w) * entrySize; @@ -62,7 +64,7 @@ public int getWidth(Font font) { @Override public void renderImage(Font font, int x, int y, PoseStack poses, ItemRenderer renderer, int z) { - int entrySize = EntryListWidget.entrySize(); + int entrySize = entrySize(); int w = Math.max(1, MAX_WIDTH / entrySize); int i = 0; poses.pushPose(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedStack.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsedStack.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedStack.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsedStack.java index 1957db3e1..c48de3d5f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsedStack.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsedStack.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.entrylist; +package me.shedaniel.rei.impl.client.gui.overlay.entries; import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntry; import me.shedaniel.rei.api.common.entry.EntryStack; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsingEntryListWidget.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsingEntryListWidget.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsingEntryListWidget.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsingEntryListWidget.java index 1869936d0..735905f21 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CollapsingEntryListWidget.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsingEntryListWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.entrylist; +package me.shedaniel.rei.impl.client.gui.overlay.entries; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; @@ -32,7 +32,7 @@ import java.util.List; import java.util.Map; -public abstract class CollapsingEntryListWidget extends EntryListWidget { +public abstract class CollapsingEntryListWidget extends EntryListWidgetImpl { private Int2ObjectMap collapsedStackIndexed = new Int2ObjectOpenHashMap<>(); public abstract List | List>*/ Object> getStacks(); diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/DefaultEntryListProvider.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/DefaultEntryListProvider.java new file mode 100644 index 000000000..5d3410f09 --- /dev/null +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/DefaultEntryListProvider.java @@ -0,0 +1,47 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.overlay.entries; + +import com.google.common.base.Suppliers; +import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.impl.client.gui.overlay.entries.paginated.PaginatedEntryListWidget; +import me.shedaniel.rei.impl.client.gui.overlay.entries.scrolled.ScrolledEntryListWidget; +import org.jetbrains.annotations.Nullable; + +import java.util.function.Supplier; + +public class DefaultEntryListProvider implements EntryListProvider { + private final Supplier paginated = Suppliers.memoize(PaginatedEntryListWidget::new); + private final Supplier scrolled = Suppliers.memoize(ScrolledEntryListWidget::new); + + @Override + @Nullable + public EntryListWidget getEntryList() { + if (ConfigObject.getInstance().isEntryListWidgetScrolled()) { + return scrolled.get(); + } else { + return paginated.get(); + } + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListEntries.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListEntries.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListEntries.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListEntries.java index 095c0fbb9..daecf616d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListEntries.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListEntries.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.entrylist; +package me.shedaniel.rei.impl.client.gui.overlay.entries; import java.util.ArrayList; import java.util.List; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListSearchManager.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListSearchManager.java index a2187dd42..2be121ddf 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListSearchManager.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListSearchManager.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.entrylist; +package me.shedaniel.rei.impl.client.gui.overlay.entries; import com.google.common.base.Stopwatch; import it.unimi.dsi.fastutil.longs.LongOpenHashSet; @@ -32,6 +32,7 @@ import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntry; import me.shedaniel.rei.api.client.registry.entry.CollapsibleEntryRegistry; import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; +import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.client.view.Views; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; @@ -148,4 +149,8 @@ private List> copyAndOrder(List> list) { public boolean matches(EntryStack stack) { return searchManager.matches(stack); } + + public SearchManager getSearchManager() { + return searchManager; + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListStackEntry.java similarity index 96% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListStackEntry.java index fa8104cd0..e1ec62fa4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListStackEntry.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListStackEntry.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.entrylist; +package me.shedaniel.rei.impl.client.gui.overlay.entries; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.api.animator.NumberAnimator; @@ -38,19 +38,18 @@ import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; -import me.shedaniel.rei.impl.client.gui.widget.DisplayedEntryWidget; +import me.shedaniel.rei.impl.client.gui.overlay.entries.cache.CachedEntryListRender; +import me.shedaniel.rei.impl.client.gui.overlay.widgets.DisplayedEntryWidget; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.Mth; import net.minecraft.world.inventory.tooltip.TooltipComponent; import org.jetbrains.annotations.Nullable; -import org.w3c.dom.css.Rect; import java.util.List; -import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; +import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; @SuppressWarnings("UnstableApiUsage") public class EntryListStackEntry extends DisplayedEntryWidget { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidgetImpl.java similarity index 81% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidgetImpl.java index e3009d27b..8fd0d1bd7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/EntryListWidget.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidgetImpl.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.entrylist; +package me.shedaniel.rei.impl.client.gui.overlay.entries; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.api.animator.NumberAnimator; @@ -40,17 +40,17 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; -import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; +import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; +import me.shedaniel.rei.api.common.networking.NetworkingHelper; import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.client.ClientHelperImpl; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; -import me.shedaniel.rei.impl.client.gui.widget.region.RegionRenderingDebugger; +import me.shedaniel.rei.impl.client.gui.overlay.widgets.RegionRenderingDebugger; +import me.shedaniel.rei.impl.client.gui.overlay.widgets.ScaleIndicatorWidget; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.player.LocalPlayer; @@ -60,23 +60,19 @@ import net.minecraft.world.InteractionResult; import net.minecraft.world.item.ItemStack; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import java.util.List; -@SuppressWarnings("UnstableApiUsage") +import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; + @ApiStatus.Internal -public abstract class EntryListWidget extends WidgetWithBounds implements OverlayListWidget, DraggableStackVisitorWidget { - private static final int SIZE = 18; +public abstract class EntryListWidgetImpl extends WidgetWithBounds implements EntryListWidget, DraggableStackVisitorWidget { protected final RegionRenderingDebugger debugger = new RegionRenderingDebugger(); protected Rectangle bounds, innerBounds; protected int updatedCount; protected int lastUpdatedCount; - public final NumberAnimator scaleIndicator = ValueAnimator.ofDouble(0.0D) - .withConvention(() -> 0.0D, 8000); - - public static int entrySize() { - return Mth.ceil(SIZE * ConfigObject.getInstance().getEntrySize()); - } + private final ScaleIndicatorWidget scaleIndicator = new ScaleIndicatorWidget(); public static boolean notSteppingOnExclusionZones(int left, int top, int width, int height) { Minecraft instance = Minecraft.getInstance(); @@ -171,7 +167,7 @@ public boolean mouseScrolled(double mouseX, double mouseY, double amount) { if (Screen.hasControlDown()) { ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); manager.set("advanced.accessibility.entrySize", manager.getConfig().getEntrySize() + amount * 0.075); - scaleIndicator.setAs(10.0D); + scaleIndicator.set(); } } @@ -192,7 +188,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { debugger.render(matrices, bounds.x, bounds.y, delta); - if (containsChecked(mouseX, mouseY, false) && ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && !minecraft.player.containerMenu.getCarried().isEmpty() && ClientHelperImpl.getInstance().canDeleteItems()) { + if (containsChecked(mouseX, mouseY, false) && ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && !minecraft.player.containerMenu.getCarried().isEmpty() && NetworkingHelper.getInstance().client().canUseDeletePackets()) { EntryStack stack = EntryStacks.of(minecraft.player.containerMenu.getCarried().copy()); if (stack.getType() != VanillaEntryTypes.ITEM) { EntryStack cheatsAs = stack.cheatsAs(); @@ -208,18 +204,8 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { Tooltip.create(new TranslatableComponent("text.rei.delete_items")).queue(); } - scaleIndicator.update(delta); - if (scaleIndicator.value() > 0.04) { - matrices.pushPose(); - matrices.translate(0, 0, 500); - TextComponent component = new TextComponent(Math.round(ConfigObject.getInstance().getEntrySize() * 100) + "%"); - int width = font.width(component); - int backgroundColor = ((int) Math.round(0xa0 * Mth.clamp(scaleIndicator.value(), 0.0, 1.0))) << 24; - int textColor = ((int) Math.round(0xdd * Mth.clamp(scaleIndicator.value(), 0.0, 1.0))) << 24; - fillGradient(matrices, bounds.getCenterX() - width / 2 - 2, bounds.getCenterY() - 6, bounds.getCenterX() + width / 2 + 2, bounds.getCenterY() + 6, backgroundColor, backgroundColor); - font.draw(matrices, component, bounds.getCenterX() - width / 2, bounds.getCenterY() - 4, 0xFFFFFF | textColor); - matrices.popPose(); - } + this.scaleIndicator.setCenter(bounds.getCenterX(), bounds.getCenterY()); + this.scaleIndicator.render(matrices, mouseX, mouseY, delta); } protected abstract void renderEntries(boolean fastEntryRendering, PoseStack matrices, int mouseX, int mouseY, float delta); @@ -233,17 +219,10 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { return false; } - public void updateArea(Rectangle bounds, String searchTerm) { + @Override + public void initBounds(Rectangle bounds) { this.bounds = REIRuntime.getInstance().calculateEntryListArea(bounds); - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - if (favoritesListWidget != null) { - favoritesListWidget.updateFavoritesBounds(searchTerm); - } - if (ConfigObject.getInstance().isFavoritesEnabled() && favoritesListWidget == null) { - updateSearch(searchTerm, true); - } else { - updateEntriesPosition(); - } + updateEntriesPosition(); } public boolean hasSpace() { @@ -258,24 +237,17 @@ public void updateEntriesPosition() { boolean zoomed = ConfigObject.getInstance().isFocusModeZoomed(); this.innerBounds = updateInnerBounds(bounds); updateEntries(entrySize, zoomed); - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - if (favoritesListWidget != null) { - favoritesListWidget.getRegion().updateEntriesPosition(entry -> true); - } } protected abstract void updateEntries(int entrySize, boolean zoomed); - public void updateSearch(String searchTerm, boolean ignoreLastSearch) { - EntryListEntries.INSTANCE.updateSearch(searchTerm, ignoreLastSearch, () -> { + @Override + public void initSearch(String searchTerm, boolean ignorePrevious) { + EntryListEntries.INSTANCE.updateSearch(searchTerm, ignorePrevious, () -> { updatedCount++; updateEntriesPosition(); }); debugger.debugTime = ConfigObject.getInstance().doDebugRenderTimeRequired(); - FavoritesListWidget favorites = ScreenOverlayImpl.getFavoritesListWidget(); - if (favorites != null) { - favorites.updateSearch(); - } } @Override @@ -296,7 +268,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { public boolean mouseReleased(double mouseX, double mouseY, int button) { if (containsChecked(mouseX, mouseY, false)) { LocalPlayer player = minecraft.player; - if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && player != null && player.containerMenu != null && !player.containerMenu.getCarried().isEmpty() && ClientHelperImpl.getInstance().canDeleteItems()) { + if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && player != null && player.containerMenu != null && !player.containerMenu.getCarried().isEmpty() && NetworkingHelper.getInstance().client().canUseDeletePackets()) { EntryStack stack = EntryStacks.of(minecraft.player.containerMenu.getCarried().copy()); if (stack.getType() != VanillaEntryTypes.ITEM) { EntryStack cheatsAs = stack.cheatsAs(); @@ -357,11 +329,22 @@ public EntryStack getFocusedStack() { protected abstract List getSlots(); - public void init(ScreenOverlayImpl overlay) { + public void init(ScreenOverlay overlay) { } @Override public void queueReloadSearch() { - updateSearch(REIRuntime.getInstance().getSearchTextField().getText(), true); + initSearch(REIRuntime.getInstance().getSearchTextField().getText(), true); + } + + @Override + public Widget asWidget() { + return this; + } + + @Override + @Nullable + public SearchFilter getSearchFilter() { + return EntryListSearchManager.INSTANCE.getSearchManager().getSearchFilter(); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CachedEntryListRender.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachedEntryListRender.java similarity index 99% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CachedEntryListRender.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachedEntryListRender.java index 60c7b98ce..6de0aa09e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CachedEntryListRender.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachedEntryListRender.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.overlay.entries.cache; import com.mojang.blaze3d.pipeline.TextureTarget; import com.mojang.blaze3d.platform.Lighting; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CachingEntryRenderer.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachingEntryRenderer.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CachingEntryRenderer.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachingEntryRenderer.java index 78ae8e365..76e299632 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/CachingEntryRenderer.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachingEntryRenderer.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.entrylist; +package me.shedaniel.rei.impl.client.gui.overlay.entries.cache; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/paginated/PaginatedEntryListWidget.java similarity index 90% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/paginated/PaginatedEntryListWidget.java index 83e0f7d45..c00ed0d62 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/PaginatedEntryListWidget.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/paginated/PaginatedEntryListWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.entrylist; +package me.shedaniel.rei.impl.client.gui.overlay.entries.paginated; import com.google.common.collect.Iterators; import com.google.common.collect.Lists; @@ -33,20 +33,23 @@ import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; import me.shedaniel.rei.api.client.gui.widgets.*; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.ClientHelperImpl; import me.shedaniel.rei.impl.client.gui.InternalTextures; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.changelog.ChangelogLoader; -import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; +import me.shedaniel.rei.impl.client.gui.overlay.entries.CollapsedStack; +import me.shedaniel.rei.impl.client.gui.overlay.entries.CollapsingEntryListWidget; +import me.shedaniel.rei.impl.client.gui.overlay.entries.EntryListStackEntry; +import me.shedaniel.rei.impl.client.gui.overlay.entries.cache.CachedEntryListRender; +import me.shedaniel.rei.impl.client.gui.overlay.entries.cache.CachingEntryRenderer; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.Mth; +import java.time.LocalDateTime; import java.util.*; import java.util.stream.Stream; @@ -207,7 +210,7 @@ public List children() { } @Override - public void init(ScreenOverlayImpl overlay) { + public void init(ScreenOverlay overlay) { Rectangle overlayBounds = overlay.getBounds(); this.additionalWidgets = new ArrayList<>(); this.leftButton = Widgets.createButton(new Rectangle(overlayBounds.x, overlayBounds.y + (ConfigObject.getInstance().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 5, 16, 16), new TextComponent("")) @@ -230,15 +233,15 @@ public void init(ScreenOverlayImpl overlay) { matrices.popPose(); helper.setBlitOffset(helper.getBlitOffset() - 1); })); - this.changelogButton = Widgets.createButton(new Rectangle(overlayBounds.getMaxX() - 18 - 18, overlayBounds.y + (ConfigObject.getInstance().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 5, 16, 16), new TextComponent("")) + /*this.changelogButton = Widgets.createButton(new Rectangle(overlayBounds.getMaxX() - 18 - 18, overlayBounds.y + (ConfigObject.getInstance().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 5, 16, 16), new TextComponent("")) .onClick(button -> { ChangelogLoader.show(); }) .containsMousePredicate((button, point) -> button.getBounds().contains(point) && overlay.isNotInExclusionZones(point.x, point.y)) .tooltipLine(new TranslatableComponent("text.rei.changelog.title")) - .focusable(false); + .focusable(false);*/ this.additionalWidgets.add(changelogButton); - this.additionalWidgets.add(Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { + /*this.additionalWidgets.add(Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { helper.setBlitOffset(helper.getBlitOffset() + 1); RenderSystem.setShaderTexture(0, InternalTextures.CHEST_GUI_TEXTURE); Rectangle bounds = changelogButton.getBounds(); @@ -247,7 +250,7 @@ public void init(ScreenOverlayImpl overlay) { helper.blit(matrices, bounds.x + 1, bounds.y + 2, !ChangelogLoader.hasVisited() ? 28 : 14, 0, 14, 14); matrices.popPose(); helper.setBlitOffset(helper.getBlitOffset() - 1); - })); + }));*/ this.rightButton = Widgets.createButton(new Rectangle(overlayBounds.getMaxX() - 18, overlayBounds.y + (ConfigObject.getInstance().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 5, 16, 16), new TextComponent("")) .onClick(button -> { setPage(getPage() + 1); @@ -268,13 +271,13 @@ public void init(ScreenOverlayImpl overlay) { matrices.popPose(); helper.setBlitOffset(helper.getBlitOffset() - 1); })); - this.additionalWidgets.add(Widgets.createClickableLabel(new Point(overlayBounds.x + ((overlayBounds.width - 18) / 2), overlayBounds.y + (ConfigObject.getInstance().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 10), NarratorChatListener.NO_TITLE, label -> { + this.additionalWidgets.add(Widgets.createClickableLabel(new Point(overlayBounds.x + ((overlayBounds.width/* - 18*/) / 2), overlayBounds.y + (ConfigObject.getInstance().getSearchFieldLocation() == SearchFieldLocation.TOP_SIDE ? 24 : 0) + 10), NarratorChatListener.NO_TITLE, label -> { setPage(0); updateEntriesPosition(); }).tooltip(new TranslatableComponent("text.rei.go_back_first_page")).focusable(false).onRender((matrices, label) -> { label.setClickable(getTotalPages() > 1); label.setMessage(new TextComponent(String.format("%s/%s", getPage() + 1, Math.max(getTotalPages(), 1)))); - }).rainbow(new Random().nextFloat() < 1.0E-4D || ClientHelperImpl.getInstance().isAprilFools.get())); + }).rainbow(new Random().nextFloat() < 1.0E-4D || (LocalDateTime.now().getMonthValue() == 4 && LocalDateTime.now().getDayOfMonth() == 1))); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/scrolled/ScrolledEntryListWidget.java similarity index 95% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/scrolled/ScrolledEntryListWidget.java index 7de0b2e9c..d539c4848 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/entrylist/ScrolledEntryListWidget.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/scrolled/ScrolledEntryListWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.entrylist; +package me.shedaniel.rei.impl.client.gui.overlay.entries.scrolled; import com.google.common.base.Predicates; import com.google.common.collect.Lists; @@ -31,12 +31,14 @@ import me.shedaniel.clothconfig2.api.ScissorsHandler; import me.shedaniel.clothconfig2.api.scroll.ScrollingContainer; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.BatchedSlots; import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.impl.client.gui.overlay.entries.CollapsedStack; +import me.shedaniel.rei.impl.client.gui.overlay.entries.CollapsingEntryListWidget; +import me.shedaniel.rei.impl.client.gui.overlay.entries.EntryListStackEntry; import net.minecraft.client.gui.screens.Screen; import net.minecraft.util.Mth; @@ -46,6 +48,8 @@ import java.util.List; import java.util.stream.Stream; +import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; + public class ScrolledEntryListWidget extends CollapsingEntryListWidget { private List | EntryIngredient*/ Object> stacks = new ArrayList<>(); protected List entries = Collections.emptyList(); @@ -198,7 +202,7 @@ protected List getSlots() { public int size() { return entries.size(); } - + @Override public Slot get(int index) { return entries.get(index).slot; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidget.java similarity index 89% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidget.java index d468a6128..faffe97dd 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/ConfigButtonWidget.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.overlay.widgets; import com.mojang.blaze3d.platform.Window; import com.mojang.blaze3d.systems.RenderSystem; @@ -35,12 +35,13 @@ import me.shedaniel.rei.api.client.gui.config.SyntaxHighlightingMode; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; import me.shedaniel.rei.api.client.gui.widgets.Button; +import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; -import me.shedaniel.rei.impl.client.ClientHelperImpl; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.api.common.networking.NetworkingHelper; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.InternalTextures; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.client.gui.menu.MenuEntry; import me.shedaniel.rei.impl.client.gui.menu.entries.*; @@ -52,13 +53,19 @@ import java.util.Collection; import java.util.List; import java.util.UUID; +import java.util.function.Consumer; +import java.util.function.UnaryOperator; -public class ConfigButtonWidget { +public class ConfigButtonWidget implements OverlayWidgetProvider { private static final UUID CONFIG_MENU_UUID = UUID.fromString("4357bc36-0a4e-47d2-8e07-ddc220df4a0f"); - public static Widget create(ScreenOverlayImpl overlay) { + @Override + public List provide(ScreenOverlay overlay, MenuAccess access, Consumer textFieldSink, UnaryOperator lateRenderable) { + return List.of(create(overlay, access, lateRenderable)); + } + + public static Widget create(ScreenOverlay overlay, MenuAccess access, UnaryOperator lateRenderable) { Rectangle bounds = getConfigButtonBounds(); - MenuAccess access = overlay.menuAccess(); Button configButton = Widgets.createButton(bounds, NarratorChatListener.NO_TITLE) .onClick(button -> { if (Screen.hasShiftDown() || Screen.hasControlDown()) { @@ -68,8 +75,8 @@ public static Widget create(ScreenOverlayImpl overlay) { ConfigManager.getInstance().openConfigScreen(REIRuntime.getInstance().getPreviousScreen()); }) .onRender((matrices, button) -> { - if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && ClientHelperImpl.getInstance().hasOperatorPermission()) { - button.setTint(ClientHelperImpl.getInstance().hasPermissionToUsePackets() ? 721354752 : 1476440063); + if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && NetworkingHelper.getInstance().client().hasOperatorPermission()) { + button.setTint(NetworkingHelper.getInstance().client().hasPermissionToUsePackets() ? 721354752 : 1476440063); } else { button.removeTint(); } @@ -84,7 +91,7 @@ public static Widget create(ScreenOverlayImpl overlay) { helper.blit(matrices, bounds.x + 3, bounds.y + 3, 0, 0, 14, 14); helper.setBlitOffset(helper.getBlitOffset() - 1); }); - return InternalWidgets.wrapLateRenderable(Widgets.concat(configButton, overlayWidget)); + return lateRenderable.apply(Widgets.concat(configButton, overlayWidget)); } private static Collection menuEntries() { @@ -99,11 +106,11 @@ private static Collection menuEntries() { new TextMenuEntry(() -> { if (!ClientHelper.getInstance().isCheating()) return new TranslatableComponent("text.rei.cheating_disabled"); - else if (!ClientHelperImpl.getInstance().hasOperatorPermission()) { + else if (!NetworkingHelper.getInstance().client().hasOperatorPermission()) { if (Minecraft.getInstance().gameMode.hasInfiniteItems()) return new TranslatableComponent("text.rei.cheating_limited_creative_enabled"); else return new TranslatableComponent("text.rei.cheating_enabled_no_perms"); - } else if (ClientHelperImpl.getInstance().hasPermissionToUsePackets()) + } else if (NetworkingHelper.getInstance().client().hasPermissionToUsePackets()) return new TranslatableComponent("text.rei.cheating_enabled"); else return new TranslatableComponent("text.rei.cheating_limited_enabled"); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidget.java similarity index 92% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidget.java index 7994ba44b..63ff5fd0d 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.overlay.widgets; import com.mojang.math.Vector4f; import me.shedaniel.math.Rectangle; @@ -36,7 +36,6 @@ import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.client.gui.menu.MenuEntry; import me.shedaniel.rei.impl.client.gui.menu.entries.SubMenuEntry; @@ -57,13 +56,23 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.function.Consumer; +import java.util.function.UnaryOperator; -public class CraftableFilterButtonWidget { +public class CraftableFilterButtonWidget implements OverlayWidgetProvider { public static final UUID FILTER_MENU_UUID = UUID.fromString("2839e998-1679-4f9e-a257-37411d16f1e6"); - public static Widget create(ScreenOverlayImpl overlay) { + @Override + public List provide(ScreenOverlay overlay, MenuAccess access, Consumer textFieldSink, UnaryOperator lateRenderable) { + if (ConfigObject.getInstance().isCraftableFilterEnabled()) { + return List.of(create(overlay, access, lateRenderable)); + } else { + return List.of(); + } + } + + private static Widget create(ScreenOverlay overlay, MenuAccess access, UnaryOperator lateRenderable) { Rectangle bounds = getCraftableFilterBounds(); - MenuAccess access = overlay.menuAccess(); ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); ItemStack icon = new ItemStack(Blocks.CRAFTING_TABLE); Button filterButton = Widgets.createButton(bounds, NarratorChatListener.NO_TITLE) @@ -86,7 +95,7 @@ public static Widget create(ScreenOverlayImpl overlay) { itemRenderer.renderGuiItem(icon, (int) vector.x(), (int) vector.y()); itemRenderer.blitOffset = 0.0F; }); - return InternalWidgets.wrapLateRenderable(Widgets.concat(filterButton, overlayWidget)); + return lateRenderable.apply(Widgets.concat(filterButton, overlayWidget)); } private static Collection menuEntries() { diff --git a/runtime-frontend/overlay-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.entries.EntryListProvider b/runtime-frontend/overlay-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.entries.EntryListProvider new file mode 100644 index 000000000..efb8be84a --- /dev/null +++ b/runtime-frontend/overlay-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.entries.EntryListProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.gui.overlay.entries.DefaultEntryListProvider \ No newline at end of file diff --git a/runtime-frontend/overlay-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.widgets.OverlayWidgetProvider b/runtime-frontend/overlay-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.widgets.OverlayWidgetProvider new file mode 100644 index 000000000..2c15f0570 --- /dev/null +++ b/runtime-frontend/overlay-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.widgets.OverlayWidgetProvider @@ -0,0 +1,2 @@ +me.shedaniel.rei.impl.client.gui.overlay.widgets.ConfigButtonWidget +me.shedaniel.rei.impl.client.gui.overlay.widgets.CraftableFilterButtonWidget \ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/DraggingContextImpl.java similarity index 96% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/DraggingContextImpl.java index 50d6ab020..ea78fa47a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/CurrentDraggingStack.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/DraggingContextImpl.java @@ -38,7 +38,6 @@ import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentVisitor; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.impl.client.gui.InternalCursorState; -import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; import net.minecraft.Util; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; @@ -51,7 +50,7 @@ import java.util.function.Supplier; @SuppressWarnings("UnstableApiUsage") -public class CurrentDraggingStack extends Widget implements LateRenderable, DraggingContext { +public class DraggingContextImpl extends Widget implements DraggingContext { private DraggableComponentProvider provider; private DraggableComponentVisitor visitor; @Nullable @@ -253,7 +252,7 @@ private DraggableEntry(DraggableComponent component, Point start) { public DraggableBoundsProvider getBoundsProvider() { if (boundsProvider == null) { - boundsProvider = DraggableBoundsProvider.concat(visitor.getDraggableAcceptingBounds(CurrentDraggingStack.this, component).toList()); + boundsProvider = DraggableBoundsProvider.concat(visitor.getDraggableAcceptingBounds(DraggingContextImpl.this, component).toList()); } return boundsProvider; @@ -261,9 +260,9 @@ public DraggableBoundsProvider getBoundsProvider() { } private static class ShapeBounds { - private VoxelShape shape; - private NumberAnimator alpha; - private int hash; + private final VoxelShape shape; + private final NumberAnimator alpha; + private final int hash; public ShapeBounds(VoxelShape shape) { this.shape = shape; @@ -291,8 +290,8 @@ public void update(double delta) { private static class RenderBackEntry { private final DraggableComponent component; private final Supplier position; - private ValueAnimator bounds = ValueAnimator.ofFloatingRectangle(); - private int lastDestination = -1; + private final ValueAnimator bounds = ValueAnimator.ofFloatingRectangle(); + private final int lastDestination = -1; public RenderBackEntry(DraggableComponent component, Rectangle initialPosition, Supplier position) { this.component = component; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/AbstractMenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/AbstractMenuEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/AbstractMenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/AbstractMenuEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java index 010294296..4bbb47671 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java @@ -33,7 +33,6 @@ import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.impl.client.gui.menu.entries.SubMenuEntry; -import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; import net.minecraft.client.Minecraft; import org.jetbrains.annotations.ApiStatus; @@ -43,7 +42,7 @@ import java.util.UUID; @ApiStatus.Internal -public class Menu extends WidgetWithBounds implements LateRenderable { +public class Menu extends WidgetWithBounds { public static final UUID WEATHER = UUID.randomUUID(); public static final UUID GAME_TYPE = UUID.randomUUID(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java similarity index 95% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java index c51330f94..e7be8c3e3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java @@ -30,7 +30,7 @@ import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import me.shedaniel.rei.impl.client.gui.overlay.ScreenOverlayImpl; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -121,14 +121,12 @@ public boolean mouseScrolled(double mouseX, double mouseY, double amount) { } private static class OverlayMenu { - private UUID uuid; - private Menu menu; - private Widget wrappedMenu; - private Predicate inBounds; + private final UUID uuid; + private final Widget wrappedMenu; + private final Predicate inBounds; public OverlayMenu(UUID uuid, Menu menu, Widget wrappedMenu, Predicate or, Predicate and) { this.uuid = uuid; - this.menu = menu; this.wrappedMenu = wrappedMenu; this.inBounds = or.or(menu::containsMouse).and(and); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/EmptyMenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/EmptyMenuEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/EmptyMenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/EmptyMenuEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SeparatorMenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SeparatorMenuEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SeparatorMenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SeparatorMenuEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SubMenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SubMenuEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SubMenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SubMenuEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/TextMenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/TextMenuEntry.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/TextMenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/TextMenuEntry.java diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java similarity index 97% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java index 7c707681a..3ac2cb627 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java @@ -32,7 +32,6 @@ import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.menu.AbstractMenuEntry; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.resources.sounds.SimpleSoundInstance; @@ -118,7 +117,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { ScissorsHandler.INSTANCE.clearScissors(); matrices.pushPose(); matrices.translate(0, 0, -400); - ScreenOverlayImpl.getInstance().renderTooltip(matrices, tooltip); + REIRuntime.getInstance().getOverlay().get().renderTooltip(matrices, tooltip); matrices.popPose(); for (Rectangle area : areas) { ScissorsHandler.INSTANCE.scissor(area); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java similarity index 88% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java index aebecbc4f..611a55748 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java @@ -23,7 +23,6 @@ package me.shedaniel.rei.impl.client.gui.overlay; -import com.google.common.collect.Lists; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Point; @@ -44,23 +43,22 @@ import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.client.gui.dragging.CurrentDraggingStack; +import me.shedaniel.rei.impl.client.ClientInternals; +import me.shedaniel.rei.impl.client.gui.dragging.DraggingContextImpl; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.client.gui.menu.MenuAccessImpl; -import me.shedaniel.rei.impl.client.gui.widget.EntryHighlighter; -import me.shedaniel.rei.impl.client.gui.widget.LateRenderable; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; +import java.util.ArrayList; import java.util.List; public abstract class AbstractScreenOverlay extends ScreenOverlay { - private final List widgets = Lists.newLinkedList(); - private final CurrentDraggingStack draggingStack = new CurrentDraggingStack(); + private final List widgets = new ArrayList<>(); + private final DraggingContextImpl draggingContext = new DraggingContextImpl(); private final MenuAccessImpl menuAccess = new MenuAccessImpl(); private final Rectangle bounds = new Rectangle(); private boolean shouldReload = false; @@ -88,7 +86,7 @@ public boolean isSearchReloadQueued() { @Override public DraggingContext getDraggingContext() { - return draggingStack; + return draggingContext; } @Override @@ -106,14 +104,14 @@ protected boolean hasSpace() { } public void init() { - this.draggingStack.set(DraggableComponentProvider.from(ScreenRegistry.getInstance()::getDraggableComponentProviders), + this.draggingContext.set(DraggableComponentProvider.from(ScreenRegistry.getInstance()::getDraggableComponentProviders), DraggableComponentVisitor.from(ScreenRegistry.getInstance()::getDraggableComponentVisitors)); this.shouldReload = false; this.shouldReloadSearch = false; this.bounds.setBounds(InternalOverlayBounds.calculateOverlayBounds()); this.widgets.clear(); - this.widgets.add(draggingStack); + this.widgets.add(draggingContext); } @Override @@ -133,15 +131,12 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { shouldReloadSearch = false; updateSearch(); } - if (OverlaySearchField.isHighlighting) { - EntryHighlighter.render(matrices); - } if (!hasSpace()) return; RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); this.renderWidgets(matrices, mouseX, mouseY, delta); if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { Screen screen = Minecraft.getInstance().screen; - ClickArea.ClickAreaContext context = createClickAreaContext(mouseX, mouseY, screen); + ClickArea.ClickAreaContext context = ClickArea.ClickAreaContext.of(screen, new Point(mouseX, mouseY)); List clickAreaTooltips = ScreenRegistry.getInstance().getClickAreaTooltips((Class) screen.getClass(), context); if (clickAreaTooltips != null && !clickAreaTooltips.isEmpty()) { Tooltip.create(clickAreaTooltips).queue(); @@ -175,11 +170,9 @@ public void lateRender(PoseStack matrices, int mouseX, int mouseY, float delta) @Override public void renderTooltip(PoseStack matrices, Tooltip tooltip) { - renderTooltipInner(minecraft.screen, matrices, tooltip, tooltip.getX(), tooltip.getY()); + ClientInternals.getTooltipRenderer().renderTooltip(minecraft.screen, matrices, tooltip, tooltip.getX(), tooltip.getY()); } - protected abstract void renderTooltipInner(Screen screen, PoseStack matrices, Tooltip tooltip, int mouseX, int mouseY); - public void renderWidgets(PoseStack matrices, int mouseX, int mouseY, float delta) { if (!REIRuntime.getInstance().isOverlayVisible()) return; @@ -189,20 +182,6 @@ public void renderWidgets(PoseStack matrices, int mouseX, int mouseY, float delt } } - private ClickArea.ClickAreaContext createClickAreaContext(double mouseX, double mouseY, Screen screen) { - return new ClickArea.ClickAreaContext<>() { - @Override - public Screen getScreen() { - return screen; - } - - @Override - public Point getMousePosition() { - return new Point(mouseX, mouseY); - } - }; - } - protected abstract void updateSearch(); public MenuAccess menuAccess() { @@ -245,7 +224,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { } if (ConfigObject.getInstance().areClickableRecipeArrowsEnabled()) { Screen screen = Minecraft.getInstance().screen; - ClickArea.ClickAreaContext context = createClickAreaContext(mouseX, mouseY, screen); + ClickArea.ClickAreaContext context = ClickArea.ClickAreaContext.of(screen, new Point(mouseX, mouseY)); if (ScreenRegistry.getInstance().executeClickArea((Class) screen.getClass(), context)) { return true; } diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/EntryListProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/EntryListProvider.java deleted file mode 100644 index 8ad40444b..000000000 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/EntryListProvider.java +++ /dev/null @@ -1,9 +0,0 @@ -package me.shedaniel.rei.impl.client.gui.overlay; - -import me.shedaniel.rei.api.client.overlay.OverlayListWidget; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal -public interface EntryListProvider { - OverlayListWidget getEntryList(); -} diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/FavoritesListProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/FavoritesListProvider.java deleted file mode 100644 index 07e329074..000000000 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/FavoritesListProvider.java +++ /dev/null @@ -1,11 +0,0 @@ -package me.shedaniel.rei.impl.client.gui.overlay; - -import me.shedaniel.rei.api.client.overlay.OverlayListWidget; -import org.jetbrains.annotations.ApiStatus; - -import java.util.Optional; - -@ApiStatus.Internal -public interface FavoritesListProvider { - Optional getFavoritesList(); -} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java similarity index 91% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java index 4b9aa557d..29160b394 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java @@ -28,10 +28,15 @@ import me.shedaniel.rei.api.client.gui.config.DisplayPanelLocation; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import net.minecraft.client.Minecraft; +import net.minecraft.util.Mth; -import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; - -class InternalOverlayBounds { +public class InternalOverlayBounds { + private static final int SIZE = 18; + + public static int entrySize() { + return Mth.ceil(SIZE * ConfigObject.getInstance().getEntrySize()); + } + static Rectangle calculateOverlayBounds() { Rectangle bounds = ScreenRegistry.getInstance().getOverlayBounds(ConfigObject.getInstance().getDisplayPanelLocation(), Minecraft.getInstance().screen); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/LateRenderable.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/LateRenderable.java similarity index 96% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/LateRenderable.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/LateRenderable.java index 2a8fc5644..6bfdb0e9a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/LateRenderable.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/LateRenderable.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.overlay; import org.jetbrains.annotations.ApiStatus; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java similarity index 61% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java index 1943ad379..1dc6d2326 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ScreenOverlayImpl.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java @@ -21,37 +21,44 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui; +package me.shedaniel.rei.impl.client.gui.overlay; import com.mojang.blaze3d.platform.Window; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; +import me.shedaniel.rei.api.client.gui.widgets.DelegateWidget; import me.shedaniel.rei.api.client.gui.widgets.TextField; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.overlay.OverlayListWidget; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; -import me.shedaniel.rei.impl.client.gui.overlay.AbstractScreenOverlay; -import me.shedaniel.rei.impl.client.gui.widget.ConfigButtonWidget; -import me.shedaniel.rei.impl.client.gui.widget.CraftableFilterButtonWidget; -import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget; -import me.shedaniel.rei.impl.client.gui.widget.entrylist.PaginatedEntryListWidget; -import me.shedaniel.rei.impl.client.gui.widget.entrylist.ScrolledEntryListWidget; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; +import me.shedaniel.rei.api.client.search.SearchFilter; +import me.shedaniel.rei.impl.client.ClientInternals; +import me.shedaniel.rei.impl.client.gui.overlay.entries.EntryListProvider; +import me.shedaniel.rei.impl.client.gui.overlay.entries.EntryListWidget; +import me.shedaniel.rei.impl.client.gui.overlay.entries.FavoritesListProvider; +import me.shedaniel.rei.impl.client.gui.overlay.entries.FavoritesListWidget; +import me.shedaniel.rei.impl.client.gui.overlay.widgets.OverlayWidgetProvider; +import me.shedaniel.rei.impl.common.InternalLogger; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.Objects; import java.util.Optional; @ApiStatus.Internal -public abstract class ScreenOverlayImpl extends AbstractScreenOverlay { +public final class ScreenOverlayImpl extends AbstractScreenOverlay { + private static final List ENTRY_LIST_PROVIDERS = ClientInternals.resolveServices(EntryListProvider.class); + private static final List FAVORITES_LIST_PROVIDERS = ClientInternals.resolveServices(FavoritesListProvider.class); + private static final List OVERLAY_WIDGET_PROVIDERS = ClientInternals.resolveServices(OverlayWidgetProvider.class); private EntryListWidget entryListWidget = null; private FavoritesListWidget favoritesListWidget = null; - private OverlaySearchField searchField = null; + private TextField searchField = null; public static EntryListWidget getEntryListWidget() { return getInstance().getEntryList(); @@ -70,24 +77,37 @@ public static ScreenOverlayImpl getInstance() { public void init() { super.init(); - TextField searchField = getSearchField(); - searchField.asWidget().getBounds().setBounds(getSearchFieldArea()); - this.children().add(searchField.asWidget()); + this.searchField = null; - if (ConfigObject.getInstance().isFavoritesEnabled()) { - getFavoritesListWidget().favoritePanel.resetRows(); - this.children().add(getFavoritesListWidget()); + FavoritesListWidget favoritesListWidget = getFavoritesListWidget(); + + if (favoritesListWidget != null) { + this.children().add(favoritesListWidget.asWidget()); } EntryListWidget entryListWidget = getEntryListWidget(); - entryListWidget.updateArea(this.getBounds(), searchField.getText()); - this.children().add(entryListWidget); - searchField.setResponder(s -> entryListWidget.updateSearch(s, false)); + entryListWidget.initBounds(this.getBounds()); + entryListWidget.initSearch(searchField.getText(), true); + this.children().add(entryListWidget.asWidget()); + searchField.setResponder(s -> entryListWidget.initSearch(s, false)); entryListWidget.init(this); - this.children().add(ConfigButtonWidget.create(this)); - if (ConfigObject.getInstance().isCraftableFilterEnabled()) { - this.children().add(CraftableFilterButtonWidget.create(this)); + for (OverlayWidgetProvider provider : OVERLAY_WIDGET_PROVIDERS) { + provider.provide(this, menuAccess(), textField -> this.searchField = textField, + LateRenderableWidget::new); + } + + if (this.searchField != null) { + this.searchField.asWidget().getBounds().setBounds(getSearchFieldArea()); + this.children().add(this.searchField.asWidget()); + } else { + InternalLogger.getInstance().warn("Search Field is not found! This might cause problems!"); + } + } + + private static class LateRenderableWidget extends DelegateWidget implements LateRenderable { + private LateRenderableWidget(Widget widget) { + super(widget); } } @@ -120,7 +140,7 @@ private Rectangle getCenterSearchFieldArea(int widthRemoved) { @Override protected void updateSearch() { - getEntryListWidget().updateSearch(getSearchField().getText(), true); + getEntryListWidget().initSearch(getSearchField().getText(), true); } @Override @@ -130,7 +150,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (!REIRuntime.getInstance().isOverlayVisible()) return false; if (ConfigObject.getInstance().getFocusSearchFieldKeybind().matchesKey(keyCode, scanCode)) { getSearchField().setFocused(true); - setFocused(getSearchField()); + setFocused(getSearchField().asWidget()); getSearchField().keybindFocusTime = System.currentTimeMillis(); getSearchField().keybindFocusKey = keyCode; return true; @@ -161,22 +181,17 @@ public void setFocused(@Nullable GuiEventListener focused) { @Override public EntryListWidget getEntryList() { - boolean widgetScrolled = ConfigObject.getInstance().isEntryListWidgetScrolled(); - - if (entryListWidget != null) { - if (widgetScrolled && entryListWidget instanceof ScrolledEntryListWidget) { - return entryListWidget; - } else if (!widgetScrolled && entryListWidget instanceof PaginatedEntryListWidget) { - return entryListWidget; - } + EntryListWidget current = null; + for (EntryListProvider provider : ENTRY_LIST_PROVIDERS) { + current = provider.getEntryList(); + if (current != null) break; + } + if (current != null) throw new IllegalStateException("No Entry List available!"); + if (current != entryListWidget) { + entryListWidget = current; + current.initBounds(Objects.requireNonNullElse(getBounds(), new Rectangle())); + current.initSearch(getSearchField().getText(), true); } - - entryListWidget = widgetScrolled ? new ScrolledEntryListWidget() : new PaginatedEntryListWidget(); - - Rectangle overlayBounds = getBounds(); - entryListWidget.updateArea(Objects.requireNonNullElse(overlayBounds, new Rectangle()), getSearchField().getText()); - entryListWidget.updateEntriesPosition(); - return entryListWidget; } @@ -187,10 +202,16 @@ public Optional getFavoritesList() { private FavoritesListWidget getFavoritesListNullable() { if (ConfigObject.getInstance().isFavoritesEnabled()) { - if (favoritesListWidget == null) { - favoritesListWidget = new FavoritesListWidget(); + FavoritesListWidget current = null; + for (FavoritesListProvider provider : FAVORITES_LIST_PROVIDERS) { + current = provider.getFavoritesList(); + if (current != null) break; + } + if (current != null) throw new IllegalStateException("No Entry List available!"); + if (current != favoritesListWidget) { + favoritesListWidget = current; + current.initBounds(); } - return favoritesListWidget; } else { return favoritesListWidget = null; @@ -198,11 +219,13 @@ private FavoritesListWidget getFavoritesListNullable() { } @Override - public OverlaySearchField getSearchField() { - if (searchField == null) { - searchField = new OverlaySearchField(0, 0, 0, 0); - } - - return searchField; + public TextField getSearchField() { + return Objects.requireNonNullElseGet(searchField, () -> Widgets.createTextField(new Rectangle())); + } + + @Override + @Nullable + public SearchFilter getCurrentSearchFilter() { + return getEntryList().getSearchFilter(); } } diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListProvider.java new file mode 100644 index 000000000..0e736a595 --- /dev/null +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListProvider.java @@ -0,0 +1,33 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.overlay.entries; + +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +@ApiStatus.Internal +public interface EntryListProvider { + @Nullable + EntryListWidget getEntryList(); +} diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidget.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidget.java new file mode 100644 index 000000000..6f3001116 --- /dev/null +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidget.java @@ -0,0 +1,44 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.overlay.entries; + +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.api.client.search.SearchFilter; +import org.jetbrains.annotations.Nullable; + +public interface EntryListWidget extends OverlayListWidget { + void initBounds(Rectangle bounds); + + void initSearch(String searchTerm, boolean ignorePrevious); + + Widget asWidget(); + + void init(ScreenOverlay overlay); + + @Nullable + SearchFilter getSearchFilter(); +} diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListProvider.java new file mode 100644 index 000000000..ca88d3934 --- /dev/null +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListProvider.java @@ -0,0 +1,34 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.overlay.entries; + +import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; + +@ApiStatus.Internal +public interface FavoritesListProvider { + @Nullable + FavoritesListWidget getFavoritesList(); +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListWidget.java similarity index 63% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListWidget.java index 3a0956bbe..ee75003eb 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/InternalWidgets.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListWidget.java @@ -21,27 +21,16 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.overlay.entries; -import me.shedaniel.rei.api.client.gui.widgets.DelegateWidget; +import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Widget; -import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import org.jetbrains.annotations.ApiStatus; +import me.shedaniel.rei.api.client.overlay.OverlayListWidget; -@ApiStatus.Internal -@Environment(EnvType.CLIENT) -public final class InternalWidgets { - private InternalWidgets() {} +public interface FavoritesListWidget extends OverlayListWidget { + void initBounds(); - public static WidgetWithBounds wrapLateRenderable(Widget widget) { - return new LateRenderableWidget(widget); - } + Widget asWidget(); - private static class LateRenderableWidget extends DelegateWidget implements LateRenderable { - private LateRenderableWidget(Widget widget) { - super(widget); - } - } + Rectangle getFavoritesBounds(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/DisplayTooltipComponent.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/DisplayTooltipComponent.java index 7afa419ed..4c92004dd 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayTooltipComponent.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/DisplayTooltipComponent.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.overlay.widgets; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Rectangle; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/DisplayedEntryWidget.java similarity index 99% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/DisplayedEntryWidget.java index ed64c8d35..32fc48f73 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayedEntryWidget.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/DisplayedEntryWidget.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget; +package me.shedaniel.rei.impl.client.gui.overlay.widgets; import com.google.common.base.Suppliers; import me.shedaniel.rei.api.client.ClientHelper; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java new file mode 100644 index 000000000..e89e4e98f --- /dev/null +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java @@ -0,0 +1,37 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.overlay.widgets; + +import me.shedaniel.rei.api.client.gui.widgets.TextField; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.UnaryOperator; + +public interface OverlayWidgetProvider { + List provide(ScreenOverlay overlay, MenuAccess access, Consumer textFieldSink, UnaryOperator lateRenderable); +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionRenderingDebugger.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/RegionRenderingDebugger.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionRenderingDebugger.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/RegionRenderingDebugger.java index b5e3a7e66..74f0694a5 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionRenderingDebugger.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/RegionRenderingDebugger.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.region; +package me.shedaniel.rei.impl.client.gui.overlay.widgets; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.Tesselator; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ScaleIndicatorWidget.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ScaleIndicatorWidget.java new file mode 100644 index 000000000..5a5439fce --- /dev/null +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ScaleIndicatorWidget.java @@ -0,0 +1,72 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.overlay.widgets; + +import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.clothconfig2.api.animator.NumberAnimator; +import me.shedaniel.clothconfig2.api.animator.ValueAnimator; +import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.util.Mth; + +import java.util.List; + +@SuppressWarnings("UnstableApiUsage") +public class ScaleIndicatorWidget extends Widget { + private final NumberAnimator scaleIndicator = ValueAnimator.ofDouble(0.0D) + .withConvention(() -> 0.0D, 8000); + private int x, y; + + public void setCenter(int x, int y) { + this.x = x; + this.y = y; + } + + public void set() { + this.scaleIndicator.setAs(10); + } + + @Override + public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { + scaleIndicator.update(delta); + if (scaleIndicator.value() > 0.04) { + matrices.pushPose(); + matrices.translate(0, 0, 500); + TextComponent component = new TextComponent(Math.round(ConfigObject.getInstance().getEntrySize() * 100) + "%"); + int width = font.width(component); + int backgroundColor = ((int) Math.round(0xa0 * Mth.clamp(scaleIndicator.value(), 0.0, 1.0))) << 24; + int textColor = ((int) Math.round(0xdd * Mth.clamp(scaleIndicator.value(), 0.0, 1.0))) << 24; + fillGradient(matrices, x - width / 2 - 2, y - 6, x + width / 2 + 2, y + 6, backgroundColor, backgroundColor); + font.draw(matrices, component, x - width / 2, y - 4, 0xFFFFFF | textColor); + matrices.popPose(); + } + } + + @Override + public List children() { + return List.of(); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java index 3c1cbcb01..c132fa569 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientHelperImpl.java @@ -23,7 +23,6 @@ package me.shedaniel.rei.impl.client; -import com.google.common.base.Suppliers; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; @@ -44,23 +43,12 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -import java.time.LocalDateTime; import java.util.List; import java.util.Map; -import java.util.function.Supplier; @ApiStatus.Internal @Environment(EnvType.CLIENT) public class ClientHelperImpl extends ClientNetworkHelperImpl implements ClientModNameHelperImpl { - public final Supplier isAprilFools = Suppliers.memoize(() -> { - try { - LocalDateTime now = LocalDateTime.now(); - return now.getMonthValue() == 4 && now.getDayOfMonth() == 1; - } catch (Throwable ignored) { - } - return false; - }); - /** * @return the instance of {@link ClientHelperImpl} * @see ClientHelper#getInstance() diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientNetworkHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientNetworkHelperImpl.java index 18efbbf22..746c29a06 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientNetworkHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientNetworkHelperImpl.java @@ -68,7 +68,7 @@ public boolean canUseHotbarPackets() { return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET); } - public boolean canDeleteItems() { + public boolean canUseDeletePackets() { return hasPermissionToUsePackets() || Minecraft.getInstance().gameMode.hasInfiniteItems(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java index 0c4007509..a38354ff6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java @@ -28,7 +28,6 @@ import dev.architectury.event.EventResult; import dev.architectury.event.events.client.ClientGuiEvent; import dev.architectury.event.events.client.ClientTickEvent; -import dev.architectury.platform.Platform; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; @@ -52,7 +51,6 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -import java.lang.reflect.InvocationTargetException; import java.util.Optional; import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; @@ -76,14 +74,7 @@ public static REIRuntimeImpl getInstance() { @Override public Optional getOverlay(boolean reset, boolean init) { if ((overlay == null && init) || reset) { - try { - overlay = (ScreenOverlayImpl) Class.forName(Platform.isForge() ? "me.shedaniel.rei.impl.client.gui.forge.ScreenOverlayImplForge" - : "me.shedaniel.rei.impl.client.gui.fabric.ScreenOverlayImplFabric") - .getDeclaredConstructor() - .newInstance(); - } catch (InstantiationException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { - throw new RuntimeException(e); - } + overlay = new ScreenOverlayImpl(); overlay.init(); overlay.getSearchField().setFocused(false); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/DisplayScreenStack.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/DisplayScreenStack.java index 4b12aa5d6..9b590da56 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/DisplayScreenStack.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/DisplayScreenStack.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui; import com.google.common.collect.Iterables; diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/error/ErrorsScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/error/ErrorsScreen.java index ab0006ea0..ce6abd0eb 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/error/ErrorsScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/error/ErrorsScreen.java @@ -27,7 +27,6 @@ import me.shedaniel.rei.impl.client.gui.error.ErrorsEntryListWidget.TextEntry; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; -import net.minecraft.client.gui.components.AbstractButton; import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.GenericDirtMessageScreen; import net.minecraft.client.gui.screens.Screen; @@ -40,11 +39,10 @@ @ApiStatus.Internal public class ErrorsScreen extends Screen { - private List components; - private AbstractButton doneButton; + private final List components; + private final Screen parent; + private final boolean quitable; private ErrorsEntryListWidget listWidget; - private Screen parent; - private boolean quitable; public ErrorsScreen(Component title, List components, Screen parent, boolean quitable) { super(title); @@ -81,9 +79,9 @@ public void init() { } listWidget._addEntry(new TextEntry(NarratorChatListener.NO_TITLE, listWidget.getItemWidth())); if (quitable) { - addRenderableWidget(doneButton = new Button(width / 2 - 100, height - 26, 200, 20, new TranslatableComponent("gui.done"), button -> Minecraft.getInstance().setScreen(parent))); + addRenderableWidget(new Button(width / 2 - 100, height - 26, 200, 20, new TranslatableComponent("gui.done"), button -> Minecraft.getInstance().setScreen(parent))); } else { - addRenderableWidget(doneButton = new Button(width / 2 - 100, height - 26, 200, 20, new TranslatableComponent("menu.quit"), button -> exit())); + addRenderableWidget(new Button(width / 2 - 100, height - 26, 200, 20, new TranslatableComponent("menu.quit"), button -> exit())); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryHighlighter.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryHighlighter.java deleted file mode 100644 index 850fa333d..000000000 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/EntryHighlighter.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.widget; - -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListSearchManager; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.GuiComponent; -import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; -import net.minecraft.world.inventory.Slot; - -public class EntryHighlighter extends GuiComponent { - public static void render(PoseStack matrices) { - RenderSystem.disableDepthTest(); - RenderSystem.colorMask(true, true, true, false); - if (Minecraft.getInstance().screen instanceof AbstractContainerScreen containerScreen) { - int x = containerScreen.leftPos, y = containerScreen.topPos; - for (Slot slot : containerScreen.getMenu().slots) { - if (!slot.hasItem() || !EntryListSearchManager.INSTANCE.matches(EntryStacks.of(slot.getItem()))) { - matrices.pushPose(); - matrices.translate(0, 0, 500f); - fillGradient(matrices, x + slot.x, y + slot.y, x + slot.x + 16, y + slot.y + 16, 0xdc202020, 0xdc202020, 0); - matrices.popPose(); - } else { - matrices.pushPose(); - matrices.translate(0, 0, 200f); - fillGradient(matrices, x + slot.x, y + slot.y, x + slot.x + 16, y + slot.y + 16, 0x345fff3b, 0x345fff3b, 0); - - fillGradient(matrices, x + slot.x - 1, y + slot.y - 1, x + slot.x, y + slot.y + 16 + 1, 0xff5fff3b, 0xff5fff3b, 0); - fillGradient(matrices, x + slot.x + 16, y + slot.y - 1, x + slot.x + 16 + 1, y + slot.y + 16 + 1, 0xff5fff3b, 0xff5fff3b, 0); - fillGradient(matrices, x + slot.x - 1, y + slot.y - 1, x + slot.x + 16, y + slot.y, 0xff5fff3b, 0xff5fff3b, 0); - fillGradient(matrices, x + slot.x - 1, y + slot.y + 16, x + slot.x + 16, y + slot.y + 16 + 1, 0xff5fff3b, 0xff5fff3b, 0); - - matrices.popPose(); - } - } - } - RenderSystem.colorMask(true, true, true, true); - RenderSystem.enableDepthTest(); - } -} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java index c3a5506e8..edf611866 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java @@ -39,9 +39,9 @@ import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.SyntaxHighlightingMode; import me.shedaniel.rei.api.client.gui.widgets.*; +import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.REIRuntimeImpl; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; +import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.HighlightInfo; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.PartHighlightInfo; @@ -50,6 +50,7 @@ import me.shedaniel.rei.impl.client.util.TextTransformations; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.resources.language.I18n; import net.minecraft.client.resources.sounds.SimpleSoundInstance; @@ -59,6 +60,7 @@ import net.minecraft.sounds.SoundEvents; import net.minecraft.util.FormattedCharSequence; import net.minecraft.util.Tuple; +import net.minecraft.world.inventory.Slot; import org.jetbrains.annotations.ApiStatus; import org.lwjgl.glfw.GLFW; @@ -113,7 +115,7 @@ public FormattedCharSequence format(String text, int index) { return TextTransformations.forwardWithTransformation(text, (s, charIndex, c) -> { HighlightInfo arg = highlighter.highlighted[charIndex + index]; Style style = Style.EMPTY; - if (isMain && ScreenOverlayImpl.getEntryListWidget().getEntries().findAny().isEmpty() && !textField.getText().isEmpty()) { + if (isMain && REIRuntime.getInstance().getOverlay().get().getEntryList().getEntries().findAny().isEmpty() && !textField.getText().isEmpty()) { style = ERROR_STYLE; } if (arg instanceof PartHighlightInfo part) { @@ -227,7 +229,7 @@ private void drawHint(PoseStack poses, int mouseX, int mouseY) { Tooltip tooltip = pair.getFirst().provideTooltip(new Point(mouseX, mouseY)); if (tooltip != null) { REIRuntime.getInstance().clearTooltips(); - ScreenOverlayImpl.getInstance().renderTooltip(poses, tooltip); + REIRuntime.getInstance().getOverlay().get().renderTooltip(poses, tooltip); } } } @@ -270,7 +272,7 @@ public int getBorderColor(TextField textField) { isHighlighting = isHighlighting && ConfigObject.getInstance().isInventoryHighlightingAllowed(); if (isMain && isHighlighting) { return 0xfff2ff0c; - } else if (isMain && ScreenOverlayImpl.getEntryListWidget().getEntries().findAny().isEmpty() && !textField.getText().isEmpty()) { + } else if (isMain && REIRuntime.getInstance().getOverlay().get().getEntryList().getEntries().findAny().isEmpty() && !textField.getText().isEmpty()) { return 0xffff5555; } else { return TextField.BorderColorProvider.DEFAULT.getBorderColor(textField); @@ -365,6 +367,9 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { textField.setSuggestion(!textField.isFocused() && textField.getText().isEmpty() ? I18n.get("text.rei.search.field.suggestion") : null); super.render(matrices, mouseX, mouseY, delta); RenderSystem.enableDepthTest(); + if (isMain && isHighlighting) { + this.renderEntryHighlighting(matrices); + } } @Override @@ -376,4 +381,35 @@ public void setResponder(Consumer responder) { public WidgetWithBounds asWidget() { return this; } + + public static void renderEntryHighlighting(PoseStack matrices) { + RenderSystem.disableDepthTest(); + RenderSystem.colorMask(true, true, true, false); + SearchFilter filter = REIRuntime.getInstance().getOverlay().get().getCurrentSearchFilter(); + if (filter == null) return; + if (Minecraft.getInstance().screen instanceof AbstractContainerScreen containerScreen) { + int x = containerScreen.leftPos, y = containerScreen.topPos; + for (Slot slot : containerScreen.getMenu().slots) { + if (!slot.hasItem() || !filter.test(EntryStacks.of(slot.getItem()))) { + matrices.pushPose(); + matrices.translate(0, 0, 500f); + fillGradient(matrices, x + slot.x, y + slot.y, x + slot.x + 16, y + slot.y + 16, 0xdc202020, 0xdc202020, 0); + matrices.popPose(); + } else { + matrices.pushPose(); + matrices.translate(0, 0, 200f); + fillGradient(matrices, x + slot.x, y + slot.y, x + slot.x + 16, y + slot.y + 16, 0x345fff3b, 0x345fff3b, 0); + + fillGradient(matrices, x + slot.x - 1, y + slot.y - 1, x + slot.x, y + slot.y + 16 + 1, 0xff5fff3b, 0xff5fff3b, 0); + fillGradient(matrices, x + slot.x + 16, y + slot.y - 1, x + slot.x + 16 + 1, y + slot.y + 16 + 1, 0xff5fff3b, 0xff5fff3b, 0); + fillGradient(matrices, x + slot.x - 1, y + slot.y - 1, x + slot.x + 16, y + slot.y, 0xff5fff3b, 0xff5fff3b, 0); + fillGradient(matrices, x + slot.x - 1, y + slot.y + 16, x + slot.x + 16, y + slot.y + 16 + 1, 0xff5fff3b, 0xff5fff3b, 0); + + matrices.popPose(); + } + } + } + RenderSystem.colorMask(true, true, true, true); + RenderSystem.enableDepthTest(); + } } diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java index 36fef8034..4ae0ed545 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java @@ -48,7 +48,6 @@ import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.client.ClientHelperImpl; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; @@ -61,6 +60,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +import java.time.LocalDateTime; import java.util.Collections; import java.util.function.Function; @@ -73,7 +73,7 @@ public DefaultClientRuntimePlugin() { @Override public void registerEntries(EntryRegistry registry) { - if (ClientHelperImpl.getInstance().isAprilFools.get()) { + if (LocalDateTime.now().getMonthValue() == 4 && LocalDateTime.now().getDayOfMonth() == 1) { registry.addEntry(ClientEntryStacks.of(new AbstractRenderer() { private ResourceLocation id = new ResourceLocation("roughlyenoughitems", "textures/gui/kirb.png"); diff --git a/settings.gradle b/settings.gradle index 3dc9f111a..415a48d16 100755 --- a/settings.gradle +++ b/settings.gradle @@ -36,8 +36,7 @@ include "runtime-frontend:widgets" include "runtime-frontend:filtering" include "runtime-frontend:display" include "runtime-frontend:overlay" -include "runtime-frontend:paginated-entries" -include "runtime-frontend:scrolled-entries" +include "runtime-frontend:overlay-entries" include "runtime-frontend:favorites-entries" include "runtime" include "fabric" diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/SearchManager.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/SearchManager.java index 2b7ba8d0f..cdbc75925 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/SearchManager.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/SearchManager.java @@ -23,7 +23,9 @@ package me.shedaniel.rei.impl.client.search; +import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.common.entry.EntryStack; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.concurrent.Future; @@ -44,4 +46,7 @@ public interface SearchManager extends Supplier>> { Future getAsync(Consumer>> consumer); boolean matches(EntryStack stack); + + @Nullable + SearchFilter getSearchFilter(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/util/RectangleUtils.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/common/util/RectangleUtils.java similarity index 100% rename from runtime/src/main/java/me/shedaniel/rei/impl/common/util/RectangleUtils.java rename to shared-internals/src/main/java/me/shedaniel/rei/impl/common/util/RectangleUtils.java From fb91ed996b01f986492de4007cb86be5e68ad192 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 28 Aug 2022 20:48:46 +0900 Subject: [PATCH 15/20] More internal changes --- .../rei/api/client/gui/widgets/TextField.java | 3 + .../rei/api/client/overlay/ScreenOverlay.java | 19 +++ .../registry/screen/ScreenRegistry.java | 23 ++- .../rei/impl/client/ClientInternals.java | 7 + .../impl/client/provider/OverlayProvider.java | 9 ++ .../plugin/client/DefaultClientPlugin.java | 46 +++++- .../favorites/EntryStackFavoriteEntry.java | 93 +++++++++++ .../runtime/SearchFilterPrepareWatcher.java | 3 +- .../panel/rows/FavoritesPanelEntriesRow.java | 6 +- .../region/EntryStacksRegionWidget.java | 2 +- .../gui/widget/region/RealRegionEntry.java | 2 +- .../gui/widget/region/RegionEntryWidget.java | 50 +----- .../gui/widget/region/RegionListener.java | 5 +- .../entries/CollapsedEntriesTooltip.java | 2 +- .../overlay/entries/EntryListStackEntry.java | 2 +- .../overlay/entries/EntryListWidgetImpl.java | 29 +--- .../scrolled/ScrolledEntryListWidget.java | 2 +- ...t.java => ConfigButtonWidgetProvider.java} | 10 +- ... CraftableFilterButtonWidgetProvider.java} | 20 +-- .../widgets/SearchFieldWidgetProvider.java | 25 +++ .../widgets}/search/DelegateTextField.java | 8 +- .../widgets}/search/OverlaySearchField.java | 33 ++-- .../OverlaySearchFieldSyntaxHighlighter.java | 2 +- ....gui.overlay.widgets.OverlayWidgetProvider | 5 +- .../rei/impl/client/gui/menu/MenuEntry.java | 44 ----- .../gui/overlay/AbstractScreenOverlay.java | 4 +- .../gui/overlay/InternalOverlayBounds.java | 10 +- .../client/gui/overlay/ScreenOverlayImpl.java | 22 +-- .../overlay/ScreenOverlayProviderImpl.java | 11 ++ .../dragging/DraggingContextImpl.java | 2 +- .../{ => overlay}/menu/AbstractMenuEntry.java | 6 +- .../client/gui/{ => overlay}/menu/Menu.java | 33 ++-- .../{ => overlay}/menu/MenuAccessImpl.java | 33 +++- .../menu/entries/EmptyMenuEntry.java | 4 +- .../menu/entries/SeparatorMenuEntry.java | 4 +- .../menu/entries/SubMenuEntry.java | 23 +-- .../menu/entries/TextMenuEntry.java | 4 +- .../menu/entries/ToggleMenuEntry.java | 6 +- .../provider/OverlayMenuEntryProvider.java | 18 +++ ...l.rei.impl.client.provider.OverlayProvider | 1 + .../widget/basewidgets/TextFieldWidget.java | 6 + .../rei/RoughlyEnoughItemsCoreClient.java | 31 +--- .../rei/impl/client/REIRuntimeImpl.java | 7 +- .../screen/AbstractDisplayViewingScreen.java | 13 +- .../runtime/DefaultClientRuntimePlugin.java | 150 ------------------ .../client/runtime/InputMethodWatcher.java | 9 +- .../runtime/PluginStageExecutionWatcher.java | 3 +- .../runtime/SearchBarHighlightWatcher.java | 3 +- .../impl/client/gui/hints/HintProvider.java | 3 +- .../rei/impl/client/gui/menu/MenuAccess.java | 21 +-- .../client/search/AsyncSearchManager.java | 7 + .../impl/client/util/InternalEntryBounds.java | 12 ++ 52 files changed, 462 insertions(+), 434 deletions(-) create mode 100644 api/src/main/java/me/shedaniel/rei/impl/client/provider/OverlayProvider.java create mode 100644 default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/EntryStackFavoriteEntry.java rename runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/{ConfigButtonWidget.java => ConfigButtonWidgetProvider.java} (97%) rename runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/{CraftableFilterButtonWidget.java => CraftableFilterButtonWidgetProvider.java} (91%) create mode 100644 runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets}/search/DelegateTextField.java (94%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets}/search/OverlaySearchField.java (93%) rename {runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget => runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets}/search/OverlaySearchFieldSyntaxHighlighter.java (98%) delete mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuEntry.java create mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayProviderImpl.java rename runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/{ => overlay}/dragging/DraggingContextImpl.java (99%) rename runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/{ => overlay}/menu/AbstractMenuEntry.java (93%) rename runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/{ => overlay}/menu/Menu.java (88%) rename runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/{ => overlay}/menu/MenuAccessImpl.java (74%) rename runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/{ => overlay}/menu/entries/EmptyMenuEntry.java (93%) rename runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/{ => overlay}/menu/entries/SeparatorMenuEntry.java (93%) rename runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/{ => overlay}/menu/entries/SubMenuEntry.java (87%) rename runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/{ => overlay}/menu/entries/TextMenuEntry.java (94%) rename runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/{ => overlay}/menu/entries/ToggleMenuEntry.java (95%) create mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java create mode 100644 runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.OverlayProvider rename {runtime-frontend/overlay => shared-internals}/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java (66%) create mode 100644 shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/InternalEntryBounds.java diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TextField.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TextField.java index 1757e77b5..4b062c6bd 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TextField.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/TextField.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.api.client.gui.widgets; +import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.vertex.PoseStack; import it.unimi.dsi.fastutil.booleans.BooleanConsumer; import me.shedaniel.clothconfig2.api.TickableWidget; @@ -78,6 +79,8 @@ public interface TextField extends TickableWidget { void setFocused(boolean focused); + void setFocusedFromKey(boolean focused, InputConstants.Key key); + void setResponder(Consumer responder); void setFocusedResponder(BooleanConsumer responder); diff --git a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java index 5d8ed2b80..9954a57a9 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java @@ -24,6 +24,8 @@ package me.shedaniel.rei.api.client.overlay; import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; @@ -38,6 +40,10 @@ @Environment(EnvType.CLIENT) public abstract class ScreenOverlay extends WidgetWithBounds { + public static Optional getInstance() { + return REIRuntime.getInstance().getOverlay(); + } + /** * Queues reload of the overlay. */ @@ -78,6 +84,19 @@ public abstract class ScreenOverlay extends WidgetWithBounds { */ public abstract boolean isNotInExclusionZones(double mouseX, double mouseY); + /** + * Returns whether a specified bounds is within the bounds of the overlay. + * + * @param bounds the bounds to test + * @return whether the bounds is within the bounds of the overlay + */ + public boolean isNotInExclusionZones(Rectangle bounds) { + return isNotInExclusionZones(bounds.x, bounds.y) && + isNotInExclusionZones(bounds.getMaxX(), bounds.y) && + isNotInExclusionZones(bounds.x, bounds.getMaxY()) && + isNotInExclusionZones(bounds.getMaxX(), bounds.getMaxY()); + } + /** * Returns the entry list of the overlay. * diff --git a/api/src/main/java/me/shedaniel/rei/api/client/registry/screen/ScreenRegistry.java b/api/src/main/java/me/shedaniel/rei/api/client/registry/screen/ScreenRegistry.java index d43b96be6..45d32737d 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/registry/screen/ScreenRegistry.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/registry/screen/ScreenRegistry.java @@ -25,6 +25,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.gui.config.DisplayPanelLocation; import me.shedaniel.rei.api.client.gui.drag.DraggableStackProvider; import me.shedaniel.rei.api.client.gui.drag.DraggableStackProviderWidget; @@ -49,14 +50,12 @@ import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.Component; import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.InteractionResult; import net.minecraft.world.inventory.AbstractContainerMenu; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -289,4 +288,20 @@ default boolean executeClickArea(Class screenClass, ClickA return false; } + + default boolean shouldDisplay(Screen screen) { + if (REIRuntime.getInstance().getOverlay().isEmpty()) return false; + if (screen == null) return false; + if (screen != Minecraft.getInstance().screen) return false; + try { + for (OverlayDecider decider : getDeciders(screen)) { + InteractionResult result = decider.shouldScreenBeOverlaid(screen); + if (result != InteractionResult.PASS) { + return result != InteractionResult.FAIL && REIRuntime.getInstance().getPreviousScreen() != null; + } + } + } catch (ConcurrentModificationException ignored) { + } + return false; + } } diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java b/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java index eeb03e5fb..22c64a606 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.client; +import com.google.common.base.Suppliers; import com.mojang.serialization.DataResult; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.ClientHelper; @@ -30,6 +31,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; import me.shedaniel.rei.api.client.gui.widgets.TooltipQueue; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.entry.PreFilteredEntryList; import me.shedaniel.rei.api.client.registry.screen.ClickArea; @@ -66,6 +68,7 @@ public final class ClientInternals { private static final AutoCraftingEvaluator AUTO_CRAFTING_EVALUATOR = resolveService(AutoCraftingEvaluator.class); private static final TooltipQueue TOOLTIP_QUEUE = resolveService(TooltipQueue.class); private static final TooltipRenderer TOOLTIP_RENDERER = resolveService(TooltipRenderer.class); + private static final OverlayProvider SCREEN_OVERLAY_PROVIDER = resolveService(OverlayProvider.class); private static Function> favoriteEntryFromJson = (object) -> throwNotSetup(); private static Function clickAreaHandlerResult = (result) -> throwNotSetup(); private static BiFunction<@Nullable Point, Collection, Tooltip> tooltipProvider = (point, texts) -> throwNotSetup(); @@ -142,6 +145,10 @@ public static TooltipRenderer getTooltipRenderer() { return TOOLTIP_RENDERER; } + public static ScreenOverlay getNewOverlay() { + return SCREEN_OVERLAY_PROVIDER.provide(); + } + public static TooltipContext createTooltipContext(Point point, @Nullable TooltipFlag flag, boolean isSearch) { return tooltipContextProvider.apply(point, flag, isSearch); } diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/provider/OverlayProvider.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/OverlayProvider.java new file mode 100644 index 000000000..c3688626a --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/OverlayProvider.java @@ -0,0 +1,9 @@ +package me.shedaniel.rei.impl.client.provider; + +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Internal +public interface OverlayProvider { + ScreenOverlay provide(); +} diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java index cc39f9e3a..01c7f3b0c 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientPlugin.java @@ -26,13 +26,23 @@ import com.google.common.collect.Iterators; import com.google.common.collect.Lists; import com.google.common.collect.Sets; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; import dev.architectury.platform.Platform; import it.unimi.dsi.fastutil.objects.Object2FloatMap; import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet; import it.unimi.dsi.fastutil.objects.ReferenceSet; import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.ClientHelper; +import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; +import me.shedaniel.rei.api.client.gui.AbstractRenderer; +import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentProviderWidget; +import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentVisitorWidget; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; @@ -40,6 +50,7 @@ import me.shedaniel.rei.api.client.registry.screen.ExclusionZones; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.client.registry.transfer.TransferHandlerRegistry; +import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.EntryIngredients; @@ -55,6 +66,7 @@ import me.shedaniel.rei.plugin.client.categories.tag.DefaultTagCategory; import me.shedaniel.rei.plugin.client.exclusionzones.DefaultPotionEffectExclusionZones; import me.shedaniel.rei.plugin.client.exclusionzones.DefaultRecipeBookExclusionZones; +import me.shedaniel.rei.plugin.client.favorites.EntryStackFavoriteEntry; import me.shedaniel.rei.plugin.client.favorites.GameModeFavoriteEntry; import me.shedaniel.rei.plugin.client.favorites.TimeFavoriteEntry; import me.shedaniel.rei.plugin.client.favorites.WeatherFavoriteEntry; @@ -77,6 +89,7 @@ import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener; import net.minecraft.core.Registry; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.BlockTags; @@ -97,7 +110,9 @@ import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.FluidState; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; +import java.time.LocalDateTime; import java.util.*; import java.util.function.Supplier; import java.util.function.UnaryOperator; @@ -135,6 +150,24 @@ public void registerEntries(EntryRegistry registry) { registry.addEntry(EntryStacks.of(fluid)); } } + + if (LocalDateTime.now().getMonthValue() == 4 && LocalDateTime.now().getDayOfMonth() == 1) { + registry.addEntry(ClientEntryStacks.of(new AbstractRenderer() { + private final ResourceLocation id = new ResourceLocation("roughlyenoughitems", "textures/gui/kirb.png"); + + @Override + public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { + RenderSystem.setShaderTexture(0, id); + innerBlit(matrices.last().pose(), bounds.x, bounds.getMaxX(), bounds.y, bounds.getMaxY(), getBlitOffset(), 0, 1, 0, 1); + } + + @Override + @Nullable + public Tooltip getTooltip(TooltipContext context) { + return Tooltip.create(context, new TextComponent("Kirby"), ClientHelper.getInstance().getFormattedModFromModId("Dream Land")); + } + })); + } } @Override @@ -324,7 +357,6 @@ public void registerDisplays(DisplayRegistry registry) { } protected void registerForgePotions(DisplayRegistry registry, BuiltinClientPlugin clientPlugin) { - } @Override @@ -341,6 +373,17 @@ public void registerScreens(ScreenRegistry registry) { registry.registerContainerClickArea(new Rectangle(78, 32, 28, 23), FurnaceScreen.class, SMELTING); registry.registerContainerClickArea(new Rectangle(78, 32, 28, 23), SmokerScreen.class, SMOKING); registry.registerContainerClickArea(new Rectangle(78, 32, 28, 23), BlastFurnaceScreen.class, BLASTING); + + registry.registerDraggableComponentProvider(DraggableComponentProviderWidget.from(context -> { + if (!ScreenRegistry.getInstance().shouldDisplay(context.getScreen()) || !REIRuntime.getInstance().isOverlayVisible()) + return Collections.emptyList(); + return Widgets.walk(REIRuntime.getInstance().getOverlay().get().children(), DraggableComponentProviderWidget.class::isInstance); + })); + registry.registerDraggableComponentVisitor(DraggableComponentVisitorWidget.from(context -> { + if (!ScreenRegistry.getInstance().shouldDisplay(context.getScreen()) || !REIRuntime.getInstance().isOverlayVisible()) + return Collections.emptyList(); + return Widgets.walk(REIRuntime.getInstance().getOverlay().get().children(), DraggableComponentVisitorWidget.class::isInstance); + })); } @Override @@ -350,6 +393,7 @@ public void registerTransferHandlers(TransferHandlerRegistry registry) { @Override public void registerFavorites(FavoriteEntryType.Registry registry) { + registry.register(FavoriteEntryType.ENTRY_STACK, EntryStackFavoriteEntry.Type.INSTANCE); registry.register(GameModeFavoriteEntry.ID, GameModeFavoriteEntry.Type.INSTANCE); registry.getOrCrateSection(new TranslatableComponent(GameModeFavoriteEntry.TRANSLATION_KEY)) .add(Stream.concat( diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/EntryStackFavoriteEntry.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/EntryStackFavoriteEntry.java new file mode 100644 index 000000000..ecd9e673e --- /dev/null +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/EntryStackFavoriteEntry.java @@ -0,0 +1,93 @@ +package me.shedaniel.rei.plugin.client.favorites; + +import com.mojang.serialization.DataResult; +import com.mojang.serialization.Lifecycle; +import me.shedaniel.rei.api.client.favorites.FavoriteEntry; +import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; +import me.shedaniel.rei.api.client.gui.Renderer; +import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; + +import java.util.function.Function; + +public class EntryStackFavoriteEntry extends FavoriteEntry { + private static final Function, String> CANCEL_FLUID_AMOUNT = s -> null; + private final EntryStack stack; + private final long hash; + + public EntryStackFavoriteEntry(EntryStack stack) { + this.stack = stack.normalize(); + this.hash = EntryStacks.hashExact(this.stack); + } + + @Override + public boolean isInvalid() { + return this.stack.isEmpty(); + } + + @Override + public Renderer getRenderer(boolean showcase) { + return this.stack; + } + + @Override + public boolean doAction(int button) { + return false; + } + + @Override + public long hashIgnoreAmount() { + return hash; + } + + @Override + public FavoriteEntry copy() { + return new EntryStackFavoriteEntry(stack.normalize()); + } + + @Override + public ResourceLocation getType() { + return FavoriteEntryType.ENTRY_STACK; + } + + @Override + public boolean isSame(FavoriteEntry other) { + if (!(other instanceof EntryStackFavoriteEntry that)) return false; + return EntryStacks.equalsExact(stack, that.stack); + } + + public enum Type implements FavoriteEntryType { + INSTANCE; + + private final String key = "data"; + + @Override + public DataResult read(CompoundTag object) { + EntryStack stack; + try { + stack = EntryStack.read(object.getCompound(key)); + } catch (Throwable throwable) { + return DataResult.error(throwable.getMessage()); + } + return DataResult.success(new EntryStackFavoriteEntry(stack), Lifecycle.stable()); + } + + @Override + public DataResult fromArgs(Object... args) { + if (args.length == 0) return DataResult.error("Cannot create EntryStackFavoriteEntry from empty args!"); + if (!(args[0] instanceof EntryStack stack)) + return DataResult.error("Creation of EntryStackFavoriteEntry from args expected EntryStack as the first argument!"); + if (!stack.supportSaving()) + return DataResult.error("Creation of EntryStackFavoriteEntry from an unserializable stack!"); + return DataResult.success(new EntryStackFavoriteEntry(stack), Lifecycle.stable()); + } + + @Override + public CompoundTag save(EntryStackFavoriteEntry entry, CompoundTag tag) { + tag.put(key, entry.stack.saveStack()); + return tag; + } + } +} \ No newline at end of file diff --git a/runtime-engine/search/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchFilterPrepareWatcher.java b/runtime-engine/search/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchFilterPrepareWatcher.java index 77a36f55c..3d03165ae 100644 --- a/runtime-engine/search/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchFilterPrepareWatcher.java +++ b/runtime-engine/search/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchFilterPrepareWatcher.java @@ -29,6 +29,7 @@ import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.client.search.argument.Argument; import net.minecraft.Util; import net.minecraft.network.chat.Component; @@ -85,7 +86,7 @@ public Color getColor() { } @Override - public List getButtons() { + public List getButtons(MenuAccess access) { return Collections.emptyList(); } } diff --git a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java index 1d492deb2..9f281e022 100644 --- a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/panel/rows/FavoritesPanelEntriesRow.java @@ -35,6 +35,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.util.ClientEntryStacks; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; @@ -52,8 +53,7 @@ import java.util.List; import java.util.function.Predicate; -import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; -import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.notSteppingOnExclusionZones; +import static me.shedaniel.rei.impl.client.util.InternalEntryBounds.entrySize; @SuppressWarnings("UnstableApiUsage") public class FavoritesPanelEntriesRow extends FavoritesPanelRow { @@ -210,7 +210,7 @@ public void updateEntriesPosition(Predicate animated) { currentY++; } - if (notSteppingOnExclusionZones(xPos, yPos + lastY - panel.getScrolledAmountInt(), entrySize, entrySize)) { + if (ScreenOverlay.getInstance().get().isNotInExclusionZones(new Rectangle(xPos, yPos + lastY - panel.getScrolledAmountInt(), entrySize, entrySize))) { widget.moveTo(animated.test(widget), xPos, yPos); break; } else { diff --git a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java index 962a32d9d..942e7d8cf 100644 --- a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/EntryStacksRegionWidget.java @@ -56,7 +56,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; +import static me.shedaniel.rei.impl.client.util.InternalEntryBounds.entrySize; public class EntryStacksRegionWidget> extends WidgetWithBounds implements DraggableStackProviderWidget, DraggableStackVisitorWidget { public final RegionListener listener; diff --git a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java index 6ed75075e..062e2bfbc 100644 --- a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RealRegionEntry.java @@ -30,7 +30,7 @@ import me.shedaniel.rei.api.client.entry.region.RegionEntry; import me.shedaniel.rei.api.client.gui.widgets.Slot; -import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; +import static me.shedaniel.rei.impl.client.util.InternalEntryBounds.entrySize; @SuppressWarnings("UnstableApiUsage") public class RealRegionEntry> { diff --git a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java index edce563aa..2df833fcf 100644 --- a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionEntryWidget.java @@ -33,14 +33,13 @@ import me.shedaniel.rei.api.client.gui.widgets.Slot; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; -import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; -import me.shedaniel.rei.impl.client.gui.menu.MenuEntry; import me.shedaniel.rei.impl.client.gui.overlay.AbstractScreenOverlay; import me.shedaniel.rei.impl.client.gui.overlay.widgets.DisplayedEntryWidget; -import net.minecraft.client.gui.components.events.GuiEventListener; -import java.util.*; +import java.util.Collection; +import java.util.Optional; +import java.util.UUID; import java.util.function.Supplier; @SuppressWarnings("UnstableApiUsage") @@ -75,51 +74,10 @@ public void renderExtra(PoseStack matrices, int mouseX, int mouseY, float delta) MenuAccess access = overlay.menuAccess(); UUID uuid = entry.getEntry().getUuid(); - access.openOrClose(uuid, slot.getBounds(), () -> - CollectionUtils.map(menuEntries.get().get(), entry -> convertMenu(overlay, entry))); + access.openOrClose(uuid, slot.getBounds(), menuEntries.get()); } } - private MenuEntry convertMenu(AbstractScreenOverlay overlay, FavoriteMenuEntry entry) { - return new MenuEntry() { - @Override - public List children() { - return Collections.singletonList(entry); - } - - @Override - public void render(PoseStack poseStack, int i, int j, float f) { - entry.render(poseStack, i, j, f); - } - - @Override - public int getEntryWidth() { - return entry.getEntryWidth(); - } - - @Override - public int getEntryHeight() { - return entry.getEntryHeight(); - } - - @Override - public void updateInformation(int xPos, int yPos, boolean selected, boolean containsMouse, boolean rendering, int width) { - entry.closeMenu = overlay.menuAccess()::close; - entry.updateInformation(xPos, yPos, selected, containsMouse, rendering, width); - } - - @Override - public int getZ() { - return entry.getZ(); - } - - @Override - public void setZ(int z) { - entry.setZ(z); - } - }; - } - @Override public boolean doMouse(Slot slot, double mouseX, double mouseY, int button) { return entry.getEntry().doAction(button) || super.doMouse(slot, mouseX, mouseY, button); diff --git a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java index 7ef8917ed..4f77e9782 100644 --- a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/region/RegionListener.java @@ -23,11 +23,12 @@ package me.shedaniel.rei.impl.client.gui.widget.region; +import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.entry.region.RegionEntry; import me.shedaniel.rei.api.client.favorites.FavoriteEntry; import me.shedaniel.rei.api.client.gui.drag.DraggableStack; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; -import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.Nullable; @@ -70,6 +71,6 @@ default void onSetNewEntries(Stream entries) {} default void onConsumed(RealRegionEntry entry) {} default boolean notSteppingOnExclusionZones(int left, int top, int width, int height) { - return EntryListWidget.notSteppingOnExclusionZones(left, top, width, height); + return ScreenOverlay.getInstance().get().isNotInExclusionZones(new Rectangle(left, top, width, height)); } } diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsedEntriesTooltip.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsedEntriesTooltip.java index 264ac057e..9521c2e5b 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsedEntriesTooltip.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/CollapsedEntriesTooltip.java @@ -37,7 +37,7 @@ import net.minecraft.util.Mth; import net.minecraft.world.inventory.tooltip.TooltipComponent; -import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; +import static me.shedaniel.rei.impl.client.util.InternalEntryBounds.entrySize; public class CollapsedEntriesTooltip implements ClientTooltipComponent, TooltipComponent { private static final int MAX_WIDTH = 140; diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListStackEntry.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListStackEntry.java index e1ec62fa4..a093050f5 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListStackEntry.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListStackEntry.java @@ -49,7 +49,7 @@ import java.util.List; -import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; +import static me.shedaniel.rei.impl.client.util.InternalEntryBounds.entrySize; @SuppressWarnings("UnstableApiUsage") public class EntryListStackEntry extends DisplayedEntryWidget { diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidgetImpl.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidgetImpl.java index 8fd0d1bd7..c9c4b3d85 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidgetImpl.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidgetImpl.java @@ -24,8 +24,6 @@ package me.shedaniel.rei.impl.client.gui.overlay.entries; import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.clothconfig2.api.animator.NumberAnimator; -import me.shedaniel.clothconfig2.api.animator.ValueAnimator; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.ClientHelper; @@ -54,7 +52,6 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.player.LocalPlayer; -import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.Mth; import net.minecraft.world.InteractionResult; @@ -64,7 +61,7 @@ import java.util.List; -import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; +import static me.shedaniel.rei.impl.client.util.InternalEntryBounds.entrySize; @ApiStatus.Internal public abstract class EntryListWidgetImpl extends WidgetWithBounds implements EntryListWidget, DraggableStackVisitorWidget { @@ -75,28 +72,8 @@ public abstract class EntryListWidgetImpl extends WidgetWithBounds implements En private final ScaleIndicatorWidget scaleIndicator = new ScaleIndicatorWidget(); public static boolean notSteppingOnExclusionZones(int left, int top, int width, int height) { - Minecraft instance = Minecraft.getInstance(); - for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(instance.screen)) { - InteractionResult fit = canItemSlotWidgetFit(left, top, width, height, decider); - if (fit != InteractionResult.PASS) - return fit == InteractionResult.SUCCESS; - } - return true; - } - - private static InteractionResult canItemSlotWidgetFit(int left, int top, int width, int height, OverlayDecider decider) { - InteractionResult fit; - fit = decider.isInZone(left, top); - if (fit != InteractionResult.PASS) - return fit; - fit = decider.isInZone(left + width, top); - if (fit != InteractionResult.PASS) - return fit; - fit = decider.isInZone(left, top + height); - if (fit != InteractionResult.PASS) - return fit; - fit = decider.isInZone(left + width, top + height); - return fit; + ScreenOverlay overlay = ScreenOverlay.getInstance().get(); + return overlay.isNotInExclusionZones(new Rectangle(left, top, width, height)); } private boolean containsChecked(Point point, boolean inner) { diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/scrolled/ScrolledEntryListWidget.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/scrolled/ScrolledEntryListWidget.java index d539c4848..cda032b0d 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/scrolled/ScrolledEntryListWidget.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/scrolled/ScrolledEntryListWidget.java @@ -48,7 +48,7 @@ import java.util.List; import java.util.stream.Stream; -import static me.shedaniel.rei.impl.client.gui.overlay.InternalOverlayBounds.entrySize; +import static me.shedaniel.rei.impl.client.util.InternalEntryBounds.entrySize; public class ScrolledEntryListWidget extends CollapsingEntryListWidget { private List | EntryIngredient*/ Object> stacks = new ArrayList<>(); diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidget.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java similarity index 97% rename from runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidget.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java index faffe97dd..eabe883a5 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidget.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java @@ -30,6 +30,7 @@ import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.client.gui.config.AppearanceTheme; import me.shedaniel.rei.api.client.gui.config.DisplayPanelLocation; import me.shedaniel.rei.api.client.gui.config.SyntaxHighlightingMode; @@ -43,8 +44,7 @@ import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.InternalTextures; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; -import me.shedaniel.rei.impl.client.gui.menu.MenuEntry; -import me.shedaniel.rei.impl.client.gui.menu.entries.*; +import me.shedaniel.rei.impl.client.gui.overlay.menu.entries.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.gui.screens.Screen; @@ -56,7 +56,7 @@ import java.util.function.Consumer; import java.util.function.UnaryOperator; -public class ConfigButtonWidget implements OverlayWidgetProvider { +public class ConfigButtonWidgetProvider implements OverlayWidgetProvider { private static final UUID CONFIG_MENU_UUID = UUID.fromString("4357bc36-0a4e-47d2-8e07-ddc220df4a0f"); @Override @@ -81,7 +81,7 @@ public static Widget create(ScreenOverlay overlay, MenuAccess access, UnaryOpera button.removeTint(); } - access.openOrClose(CONFIG_MENU_UUID, button.getBounds(), ConfigButtonWidget::menuEntries); + access.openOrClose(CONFIG_MENU_UUID, button.getBounds(), ConfigButtonWidgetProvider::menuEntries); }) .focusable(false) .containsMousePredicate((button, point) -> button.getBounds().contains(point) && overlay.isNotInExclusionZones(point.x, point.y)); @@ -94,7 +94,7 @@ public static Widget create(ScreenOverlay overlay, MenuAccess access, UnaryOpera return lateRenderable.apply(Widgets.concat(configButton, overlayWidget)); } - private static Collection menuEntries() { + private static Collection menuEntries() { ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); ConfigObject config = ConfigObject.getInstance(); return List.of( diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidget.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java similarity index 91% rename from runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidget.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java index 63ff5fd0d..f5fbc42a0 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidget.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java @@ -28,6 +28,7 @@ import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; import me.shedaniel.rei.api.client.gui.widgets.*; import me.shedaniel.rei.api.client.overlay.OverlayListWidget; @@ -37,9 +38,8 @@ import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; -import me.shedaniel.rei.impl.client.gui.menu.MenuEntry; -import me.shedaniel.rei.impl.client.gui.menu.entries.SubMenuEntry; -import me.shedaniel.rei.impl.client.gui.menu.entries.ToggleMenuEntry; +import me.shedaniel.rei.impl.client.gui.overlay.menu.entries.SubMenuEntry; +import me.shedaniel.rei.impl.client.gui.overlay.menu.entries.ToggleMenuEntry; import me.shedaniel.rei.impl.client.gui.screen.ConfigReloadingScreen; import me.shedaniel.rei.impl.common.InternalLogger; import net.minecraft.client.Minecraft; @@ -59,7 +59,7 @@ import java.util.function.Consumer; import java.util.function.UnaryOperator; -public class CraftableFilterButtonWidget implements OverlayWidgetProvider { +public class CraftableFilterButtonWidgetProvider implements OverlayWidgetProvider { public static final UUID FILTER_MENU_UUID = UUID.fromString("2839e998-1679-4f9e-a257-37411d16f1e6"); @Override @@ -84,7 +84,7 @@ private static Widget create(ScreenOverlay overlay, MenuAccess access, UnaryOper .onRender((matrices, button) -> { button.setTint(ConfigManager.getInstance().isCraftableOnlyEnabled() ? 0x3800d907 : 0x38ff0000); - access.openOrClose(FILTER_MENU_UUID, button.getBounds(), CraftableFilterButtonWidget::menuEntries); + access.openOrClose(FILTER_MENU_UUID, button.getBounds(), CraftableFilterButtonWidgetProvider::menuEntries); }) .containsMousePredicate((button, point) -> button.getBounds().contains(point) && overlay.isNotInExclusionZones(point.x, point.y)) .tooltipLineSupplier(button -> new TranslatableComponent(ConfigManager.getInstance().isCraftableOnlyEnabled() ? "text.rei.showing_craftable" : "text.rei.showing_all")); @@ -98,12 +98,12 @@ private static Widget create(ScreenOverlay overlay, MenuAccess access, UnaryOper return lateRenderable.apply(Widgets.concat(filterButton, overlayWidget)); } - private static Collection menuEntries() { + private static Collection menuEntries() { ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); ConfigObject config = ConfigObject.getInstance(); - ArrayList entries = new ArrayList<>(List.of( + ArrayList entries = new ArrayList<>(List.of( new SubMenuEntry(new TranslatableComponent("text.rei.config.menu.search_field.position"), Arrays.stream(SearchFieldLocation.values()) - .map(location -> ToggleMenuEntry.of(new TextComponent(location.toString()), + .map(location -> ToggleMenuEntry.of(new TextComponent(location.toString()), () -> config.getSearchFieldLocation() == location, bool -> manager.set("appearance.layout.searchFieldLocation", location)) .withActive(() -> config.getSearchFieldLocation() != location) @@ -126,11 +126,11 @@ public static List>> getApplicableInp .toList(); } - public static List createInputMethodEntries(List>> applicableInputMethods) { + public static List createInputMethodEntries(List>> applicableInputMethods) { ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); ConfigObject config = ConfigObject.getInstance(); return applicableInputMethods.stream() - .map(pair -> ToggleMenuEntry.of(pair.getValue().getName(), + .map(pair -> ToggleMenuEntry.of(pair.getValue().getName(), () -> Objects.equals(config.getInputMethodId(), pair.getKey()), bool -> { ExecutorService service = Executors.newSingleThreadExecutor(); diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java new file mode 100644 index 000000000..7fb67cf34 --- /dev/null +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java @@ -0,0 +1,25 @@ +package me.shedaniel.rei.impl.client.gui.overlay.widgets; + +import me.shedaniel.rei.api.client.gui.widgets.TextField; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; +import me.shedaniel.rei.impl.client.gui.overlay.widgets.search.OverlaySearchField; + +import java.util.List; +import java.util.function.Consumer; +import java.util.function.UnaryOperator; + +public class SearchFieldWidgetProvider implements OverlayWidgetProvider { + private OverlaySearchField searchField; + + @Override + public List provide(ScreenOverlay overlay, MenuAccess access, Consumer textFieldSink, UnaryOperator lateRenderable) { + if (searchField == null) { + searchField = new OverlaySearchField(access); + } + + textFieldSink.accept(searchField); + return List.of(lateRenderable.apply(searchField)); + } +} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/DelegateTextField.java similarity index 94% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/DelegateTextField.java index f0eefef0d..d52764bff 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/DelegateTextField.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/DelegateTextField.java @@ -21,8 +21,9 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.search; +package me.shedaniel.rei.impl.client.gui.overlay.widgets.search; +import com.mojang.blaze3d.platform.InputConstants; import it.unimi.dsi.fastutil.booleans.BooleanConsumer; import me.shedaniel.rei.api.client.gui.widgets.TextField; import org.jetbrains.annotations.Nullable; @@ -169,6 +170,11 @@ default void setFocused(boolean focused) { delegateTextField().setFocused(focused); } + @Override + default void setFocusedFromKey(boolean focused, InputConstants.Key key) { + delegateTextField().setFocusedFromKey(focused, key); + } + @Override default void tick() { delegateTextField().tick(); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchField.java similarity index 93% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchField.java index edf611866..6484f82e2 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchField.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchField.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.search; +package me.shedaniel.rei.impl.client.gui.overlay.widgets.search; import com.google.common.collect.Lists; import com.mojang.blaze3d.platform.InputConstants; @@ -43,10 +43,11 @@ import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.HighlightInfo; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.PartHighlightInfo; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.QuoteHighlightInfo; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchFieldSyntaxHighlighter.SplitterHighlightInfo; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; +import me.shedaniel.rei.impl.client.gui.overlay.widgets.search.OverlaySearchFieldSyntaxHighlighter.HighlightInfo; +import me.shedaniel.rei.impl.client.gui.overlay.widgets.search.OverlaySearchFieldSyntaxHighlighter.PartHighlightInfo; +import me.shedaniel.rei.impl.client.gui.overlay.widgets.search.OverlaySearchFieldSyntaxHighlighter.QuoteHighlightInfo; +import me.shedaniel.rei.impl.client.gui.overlay.widgets.search.OverlaySearchFieldSyntaxHighlighter.SplitterHighlightInfo; import me.shedaniel.rei.impl.client.util.TextTransformations; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -77,6 +78,7 @@ public class OverlaySearchField extends DelegateWidget implements DelegateTextFi private static final Style QUOTES_STYLE = Style.EMPTY.withColor(ChatFormatting.GOLD); private static final Style ERROR_STYLE = Style.EMPTY.withColor(TextColor.fromRgb(0xff5555)); private final TextField textField; + private final MenuAccess access; private boolean previouslyClicking = false; private final OverlaySearchFieldSyntaxHighlighter highlighter; public long keybindFocusTime = -1; @@ -86,10 +88,11 @@ public class OverlaySearchField extends DelegateWidget implements DelegateTextFi private List history = Lists.newArrayListWithCapacity(100); private final NumberAnimator progress = ValueAnimator.ofDouble(); - public OverlaySearchField(int x, int y, int width, int height) { + public OverlaySearchField(MenuAccess access) { super(Widgets.noOp()); - this.textField = Widgets.createTextField(new Rectangle(x, y, width, height)); - this.textField.setMaxLength(10000); + this.access = access; + this.textField = Widgets.createTextField(new Rectangle()); + this.textField.setMaxLength(1000); this.textField.setFormatter(this); this.textField.setSuggestionRenderer(this); this.textField.setFocusedResponder(this::focused); @@ -173,7 +176,7 @@ private void drawHint(PoseStack poses, int mouseX, int mouseY) { OptionalDouble progress = hintProviders.stream().map(HintProvider::getProgress).filter(Objects::nonNull).mapToDouble(Double::doubleValue) .average(); List buttons = hints.stream().map(Pair::getFirst).distinct() - .map(HintProvider::getButtons) + .map(provider -> provider.getButtons(access)) .flatMap(List::stream) .toList(); boolean hasProgress = progress.isPresent(); @@ -354,6 +357,18 @@ public boolean charTyped(char character, int modifiers) { return super.charTyped(character, modifiers); } + @Override + public void setFocusedFromKey(boolean focused, InputConstants.Key key) { + DelegateTextField.super.setFocusedFromKey(focused, key); + if (focused && key.getType() == InputConstants.Type.KEYSYM) { + keybindFocusTime = System.currentTimeMillis(); + keybindFocusKey = key.getValue(); + } else { + keybindFocusTime = -1; + keybindFocusKey = -1; + } + } + @Override public boolean containsMouse(double mouseX, double mouseY) { return (!isMain || REIRuntime.getInstance().getOverlay().get().isNotInExclusionZones(mouseX, mouseY)) && super.containsMouse(mouseX, mouseY); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchFieldSyntaxHighlighter.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchFieldSyntaxHighlighter.java similarity index 98% rename from runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchFieldSyntaxHighlighter.java rename to runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchFieldSyntaxHighlighter.java index 487aba72f..33fc128de 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/search/OverlaySearchFieldSyntaxHighlighter.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchFieldSyntaxHighlighter.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.widget.search; +package me.shedaniel.rei.impl.client.gui.overlay.widgets.search; import it.unimi.dsi.fastutil.ints.IntIntPair; import me.shedaniel.rei.api.client.search.SearchFilter; diff --git a/runtime-frontend/overlay-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.widgets.OverlayWidgetProvider b/runtime-frontend/overlay-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.widgets.OverlayWidgetProvider index 2c15f0570..9d6ab17dd 100644 --- a/runtime-frontend/overlay-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.widgets.OverlayWidgetProvider +++ b/runtime-frontend/overlay-entries/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.widgets.OverlayWidgetProvider @@ -1,2 +1,3 @@ -me.shedaniel.rei.impl.client.gui.overlay.widgets.ConfigButtonWidget -me.shedaniel.rei.impl.client.gui.overlay.widgets.CraftableFilterButtonWidget \ No newline at end of file +me.shedaniel.rei.impl.client.gui.overlay.widgets.ConfigButtonWidgetProvider +me.shedaniel.rei.impl.client.gui.overlay.widgets.CraftableFilterButtonWidgetProvider +me.shedaniel.rei.impl.client.gui.overlay.widgets.SearchFieldWidgetProvider \ No newline at end of file diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuEntry.java deleted file mode 100644 index e5c7109d8..000000000 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuEntry.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.menu; - -import me.shedaniel.rei.api.client.gui.widgets.Widget; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal -public abstract class MenuEntry extends Widget { - @ApiStatus.Internal - @Deprecated - Menu parent = null; - - public final Menu getParent() { - return parent; - } - - public abstract int getEntryWidth(); - - public abstract int getEntryHeight(); - - public abstract void updateInformation(int xPos, int yPos, boolean selected, boolean containsMouse, boolean rendering, int width); -} diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java index 611a55748..d1c3a5f22 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/AbstractScreenOverlay.java @@ -44,9 +44,9 @@ import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.impl.client.ClientInternals; -import me.shedaniel.rei.impl.client.gui.dragging.DraggingContextImpl; +import me.shedaniel.rei.impl.client.gui.overlay.dragging.DraggingContextImpl; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; -import me.shedaniel.rei.impl.client.gui.menu.MenuAccessImpl; +import me.shedaniel.rei.impl.client.gui.overlay.menu.MenuAccessImpl; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java index 29160b394..bf98c858f 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/InternalOverlayBounds.java @@ -27,16 +27,10 @@ import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.config.DisplayPanelLocation; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; +import me.shedaniel.rei.impl.client.util.InternalEntryBounds; import net.minecraft.client.Minecraft; -import net.minecraft.util.Mth; public class InternalOverlayBounds { - private static final int SIZE = 18; - - public static int entrySize() { - return Mth.ceil(SIZE * ConfigObject.getInstance().getEntrySize()); - } - static Rectangle calculateOverlayBounds() { Rectangle bounds = ScreenRegistry.getInstance().getOverlayBounds(ConfigObject.getInstance().getDisplayPanelLocation(), Minecraft.getInstance().screen); @@ -44,7 +38,7 @@ static Rectangle calculateOverlayBounds() { if (ConfigObject.getInstance().getDisplayPanelLocation() == DisplayPanelLocation.RIGHT) bounds.x += widthReduction; bounds.width -= widthReduction; - int maxWidth = (int) Math.ceil(entrySize() * ConfigObject.getInstance().getHorizontalEntriesBoundariesColumns() + entrySize() * 0.75); + int maxWidth = (int) Math.ceil(InternalEntryBounds.entrySize() * ConfigObject.getInstance().getHorizontalEntriesBoundariesColumns() + InternalEntryBounds.entrySize() * 0.75); if (bounds.width > maxWidth) { if (ConfigObject.getInstance().getDisplayPanelLocation() == DisplayPanelLocation.RIGHT) bounds.x += bounds.width - maxWidth; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java index 1dc6d2326..ba55096b4 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.client.gui.overlay; +import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.platform.Window; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; @@ -33,6 +34,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.impl.client.ClientInternals; @@ -61,16 +63,20 @@ public final class ScreenOverlayImpl extends AbstractScreenOverlay { private TextField searchField = null; public static EntryListWidget getEntryListWidget() { - return getInstance().getEntryList(); + return getInstanceInternal().getEntryList(); } @Nullable public static FavoritesListWidget getFavoritesListWidget() { - return getInstance().getFavoritesListNullable(); + return getInstanceInternal().getFavoritesListNullable(); } - public static ScreenOverlayImpl getInstance() { - return (ScreenOverlayImpl) REIRuntime.getInstance().getOverlay().get(); + private static ScreenOverlayImpl getInstanceInternal() { + return (ScreenOverlayImpl) ScreenOverlay.getInstance().orElseThrow(); + } + + public ScreenOverlayImpl() { + this.init(); } @Override @@ -149,10 +155,8 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (!hasSpace()) return false; if (!REIRuntime.getInstance().isOverlayVisible()) return false; if (ConfigObject.getInstance().getFocusSearchFieldKeybind().matchesKey(keyCode, scanCode)) { - getSearchField().setFocused(true); + getSearchField().setFocusedFromKey(true, InputConstants.getKey(keyCode, scanCode)); setFocused(getSearchField().asWidget()); - getSearchField().keybindFocusTime = System.currentTimeMillis(); - getSearchField().keybindFocusKey = keyCode; return true; } return false; @@ -164,10 +168,8 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { boolean visible = REIRuntime.getInstance().isOverlayVisible(); if (!hasSpace() || !visible) return false; if (ConfigObject.getInstance().getFocusSearchFieldKeybind().matchesMouse(button)) { - getSearchField().setFocused(true); + getSearchField().setFocusedFromKey(true, InputConstants.Type.MOUSE.getOrCreate(button)); setFocused(getSearchField().asWidget()); - getSearchField().keybindFocusTime = -1; - getSearchField().keybindFocusKey = -1; return true; } return false; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayProviderImpl.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayProviderImpl.java new file mode 100644 index 000000000..0f7adad5e --- /dev/null +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayProviderImpl.java @@ -0,0 +1,11 @@ +package me.shedaniel.rei.impl.client.gui.overlay; + +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.impl.client.provider.OverlayProvider; + +public class ScreenOverlayProviderImpl implements OverlayProvider { + @Override + public ScreenOverlay provide() { + return new ScreenOverlayImpl(); + } +} diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/DraggingContextImpl.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/dragging/DraggingContextImpl.java similarity index 99% rename from runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/DraggingContextImpl.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/dragging/DraggingContextImpl.java index ea78fa47a..383f13e13 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/dragging/DraggingContextImpl.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/dragging/DraggingContextImpl.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.dragging; +package me.shedaniel.rei.impl.client.gui.overlay.dragging; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.api.animator.NumberAnimator; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/AbstractMenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/AbstractMenuEntry.java similarity index 93% rename from runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/AbstractMenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/AbstractMenuEntry.java index 0debff33b..6cd269c3c 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/AbstractMenuEntry.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/AbstractMenuEntry.java @@ -21,9 +21,11 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.menu; +package me.shedaniel.rei.impl.client.gui.overlay.menu; -public abstract class AbstractMenuEntry extends MenuEntry { +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; + +public abstract class AbstractMenuEntry extends FavoriteMenuEntry { private int x, y, width; private boolean selected, containsMouse, rendering; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/Menu.java similarity index 88% rename from runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/Menu.java index 4bbb47671..89675b0be 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/Menu.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/Menu.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.menu; +package me.shedaniel.rei.impl.client.gui.overlay.menu; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; @@ -31,8 +31,9 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; -import me.shedaniel.rei.impl.client.gui.menu.entries.SubMenuEntry; +import me.shedaniel.rei.impl.client.gui.overlay.menu.entries.SubMenuEntry; import net.minecraft.client.Minecraft; import org.jetbrains.annotations.ApiStatus; @@ -49,12 +50,12 @@ public class Menu extends WidgetWithBounds { public final Point menuStartPoint; public final boolean facingRight; public final boolean facingDownwards; - private final List entries = Lists.newArrayList(); + private final List entries = Lists.newArrayList(); public final ScrollingContainer scrolling = new ScrollingContainer() { @Override public int getMaxScrollHeight() { int i = 0; - for (MenuEntry entry : children()) { + for (FavoriteMenuEntry entry : children()) { i += entry.getEntryHeight(); } return i; @@ -71,7 +72,7 @@ public boolean hasScrollBar() { } }; - public Menu(Rectangle menuStart, Collection entries, boolean sort) { + public Menu(Rectangle menuStart, Collection entries, boolean sort) { buildEntries(entries, sort); int fullWidth = Minecraft.getInstance().screen.width; int fullHeight = Minecraft.getInstance().screen.height; @@ -91,15 +92,17 @@ public Menu(Rectangle menuStart, Collection entries, boolean sort) { } @SuppressWarnings("deprecation") - private void buildEntries(Collection entries, boolean sort) { + private void buildEntries(Collection entries, boolean sort) { this.entries.clear(); this.entries.addAll(entries); if (sort) { this.entries.sort(Comparator.comparing(entry -> entry instanceof SubMenuEntry ? 0 : 1) .thenComparing(entry -> entry instanceof SubMenuEntry menuEntry ? menuEntry.text.getString() : "")); } - for (MenuEntry entry : this.entries) { - entry.parent = this; + for (FavoriteMenuEntry entry : this.entries) { + if (entry instanceof SubMenuEntry) { + ((SubMenuEntry) entry).parentMenu = this; + } } } @@ -122,7 +125,7 @@ public int getInnerHeight(int y) { public int getMaxEntryWidth() { int i = 0; - for (MenuEntry entry : children()) { + for (FavoriteMenuEntry entry : children()) { if (entry.getEntryWidth() > i) i = entry.getEntryWidth(); } @@ -136,9 +139,9 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { fill(matrices, bounds.x, bounds.y, bounds.getMaxX(), bounds.getMaxY(), containsMouse(mouseX, mouseY) ? (ConfigObject.getInstance().isUsingDarkTheme() ? -17587 : -1) : -6250336); fill(matrices, innerBounds.x, innerBounds.y, innerBounds.getMaxX(), innerBounds.getMaxY(), -16777216); boolean contains = innerBounds.contains(mouseX, mouseY); - MenuEntry focused = getFocused() instanceof MenuEntry menuEntry ? menuEntry : null; + FavoriteMenuEntry focused = getFocused() instanceof FavoriteMenuEntry menuEntry ? menuEntry : null; int currentY = innerBounds.y - scrolling.scrollAmountInt(); - for (MenuEntry child : children()) { + for (FavoriteMenuEntry child : children()) { boolean containsMouse = contains && mouseY >= currentY && mouseY < currentY + child.getEntryHeight(); if (containsMouse) { focused = child; @@ -147,7 +150,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { } currentY = innerBounds.y - scrolling.scrollAmountInt(); ScissorsHandler.INSTANCE.scissor(scrolling.getScissorBounds()); - for (MenuEntry child : children()) { + for (FavoriteMenuEntry child : children()) { boolean rendering = currentY + child.getEntryHeight() >= innerBounds.y && currentY <= innerBounds.getMaxY(); boolean containsMouse = contains && mouseY >= currentY && mouseY < currentY + child.getEntryHeight(); child.updateInformation(innerBounds.x, currentY, focused == child || containsMouse, containsMouse, rendering, getMaxEntryWidth()); @@ -182,7 +185,7 @@ public boolean mouseScrolled(double mouseX, double mouseY, double amount) { scrolling.offset(ClothConfigInitializer.getScrollStep() * -amount, true); return true; } - for (MenuEntry child : children()) { + for (FavoriteMenuEntry child : children()) { if (child instanceof SubMenuEntry) { if (child.mouseScrolled(mouseX, mouseY, amount)) return true; @@ -194,7 +197,7 @@ public boolean mouseScrolled(double mouseX, double mouseY, double amount) { @Override public boolean containsMouse(double mouseX, double mouseY) { if (super.containsMouse(mouseX, mouseY)) return true; - for (MenuEntry child : children()) { + for (FavoriteMenuEntry child : children()) { if (child.containsMouse(mouseX, mouseY)) { return true; } @@ -203,7 +206,7 @@ public boolean containsMouse(double mouseX, double mouseY) { } @Override - public List children() { + public List children() { return entries; } } diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/MenuAccessImpl.java similarity index 74% rename from runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/MenuAccessImpl.java index e7be8c3e3..2a5a40fbe 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccessImpl.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/MenuAccessImpl.java @@ -21,22 +21,27 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.menu; +package me.shedaniel.rei.impl.client.gui.overlay.menu; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Point; +import me.shedaniel.math.Rectangle; import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; -import me.shedaniel.rei.impl.client.gui.overlay.ScreenOverlayImpl; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import org.jetbrains.annotations.Nullable; +import java.util.Collection; import java.util.List; import java.util.UUID; import java.util.function.Consumer; import java.util.function.Predicate; +import java.util.function.Supplier; public class MenuAccessImpl implements MenuAccess { public final List afterRenders = Lists.newArrayList(); @@ -72,18 +77,34 @@ private void proceedOpenMenuOrElse(UUID uuid, Runnable runnable, Consumer false, point -> true); + public void open(UUID uuid, Rectangle selfBounds, Supplier> menuSupplier) { + open(uuid, selfBounds, menuSupplier, point -> false, point -> true); } @Override - public void open(UUID uuid, Menu menu, Predicate or, Predicate and) { + public void open(UUID uuid, Rectangle selfBounds, Supplier> menuSupplier, Predicate or, Predicate and) { + Menu menu = new Menu(selfBounds, menuSupplier.get(), false); this.menu = new OverlayMenu(uuid, menu, Widgets.withTranslate(menu, 0, 0, 400), or, and); } + @Override + public void openOrClose(UUID uuid, Rectangle selfBounds, Supplier> menuSupplier) { + boolean isOpened = isOpened(uuid); + if (isOpened || !isAnyOpened()) { + boolean inBounds = (isValidPoint(PointHelper.ofMouse()) && selfBounds.contains(PointHelper.ofMouse())) || isInBounds(uuid); + if (isOpened != inBounds) { + if (inBounds) { + open(uuid, selfBounds.clone(), menuSupplier, selfBounds::contains, point -> true); + } else { + close(); + } + } + } + } + @Override public boolean isValidPoint(Point point) { - return ScreenOverlayImpl.getInstance().isNotInExclusionZones(point.x, point.y); + return ScreenOverlay.getInstance().orElseThrow().isNotInExclusionZones(point.x, point.y); } @Override diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/EmptyMenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/EmptyMenuEntry.java similarity index 93% rename from runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/EmptyMenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/EmptyMenuEntry.java index e269a496d..092ef0e48 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/EmptyMenuEntry.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/EmptyMenuEntry.java @@ -21,10 +21,10 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.menu.entries; +package me.shedaniel.rei.impl.client.gui.overlay.menu.entries; import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.rei.impl.client.gui.menu.AbstractMenuEntry; +import me.shedaniel.rei.impl.client.gui.overlay.menu.AbstractMenuEntry; import net.minecraft.client.gui.components.events.GuiEventListener; import java.util.Collections; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SeparatorMenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/SeparatorMenuEntry.java similarity index 93% rename from runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SeparatorMenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/SeparatorMenuEntry.java index bd0425e74..792039877 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SeparatorMenuEntry.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/SeparatorMenuEntry.java @@ -21,10 +21,10 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.menu.entries; +package me.shedaniel.rei.impl.client.gui.overlay.menu.entries; import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.rei.impl.client.gui.menu.AbstractMenuEntry; +import me.shedaniel.rei.impl.client.gui.overlay.menu.AbstractMenuEntry; import net.minecraft.client.gui.components.events.GuiEventListener; import java.util.Collections; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SubMenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/SubMenuEntry.java similarity index 87% rename from runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SubMenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/SubMenuEntry.java index 24ae2249c..8de4d621d 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/SubMenuEntry.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/SubMenuEntry.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.menu.entries; +package me.shedaniel.rei.impl.client.gui.overlay.menu.entries; import com.google.common.base.MoreObjects; import com.google.common.collect.Lists; @@ -29,11 +29,11 @@ import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.clothconfig2.api.ScissorsHandler; import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.impl.client.gui.InternalTextures; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; -import me.shedaniel.rei.impl.client.gui.menu.AbstractMenuEntry; -import me.shedaniel.rei.impl.client.gui.menu.Menu; -import me.shedaniel.rei.impl.client.gui.menu.MenuEntry; +import me.shedaniel.rei.impl.client.gui.InternalTextures; +import me.shedaniel.rei.impl.client.gui.overlay.menu.AbstractMenuEntry; +import me.shedaniel.rei.impl.client.gui.overlay.menu.Menu; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.network.chat.Component; @@ -45,18 +45,19 @@ public class SubMenuEntry extends AbstractMenuEntry { public final Component text; private int textWidth = -69; - protected List entries; + protected List entries; + public Menu parentMenu; protected Menu childMenu; public SubMenuEntry(Component text) { this(text, Collections.emptyList()); } - public SubMenuEntry(Component text, Supplier> entries) { + public SubMenuEntry(Component text, Supplier> entries) { this(text, entries.get()); } - public SubMenuEntry(Component text, List entries) { + public SubMenuEntry(Component text, List entries) { this.text = MoreObjects.firstNonNull(text, ImmutableTextComponent.EMPTY); this.entries = entries; } @@ -70,7 +71,7 @@ private int getTextWidth() { public Menu getChildMenu() { if (childMenu == null) { - this.childMenu = new Menu(new Rectangle(getParent().getBounds().x + 1, getY() - 1, getParent().getBounds().width - 2, getEntryHeight() - 2), entries, false); + this.childMenu = new Menu(new Rectangle(parentMenu.getBounds().x + 1, getY() - 1, parentMenu.getBounds().width - 2, getEntryHeight() - 2), entries, false); } return childMenu; } @@ -92,11 +93,11 @@ public void render(PoseStack poses, int mouseX, int mouseY, float delta) { if (!entries.isEmpty()) { Menu menu = getChildMenu(); - Rectangle menuStart = new Rectangle(getParent().getBounds().x, getY(), getParent().getBounds().width, getEntryHeight()); + Rectangle menuStart = new Rectangle(parentMenu.getBounds().x, getY(), parentMenu.getBounds().width, getEntryHeight()); int fullWidth = Minecraft.getInstance().screen.width; int fullHeight = Minecraft.getInstance().screen.height; - boolean facingRight = getParent().facingRight; + boolean facingRight = parentMenu.facingRight; int menuWidth = menu.getMaxEntryWidth() + 2 + (menu.hasScrollBar() ? 6 : 0); if (facingRight && fullWidth - menuStart.getMaxX() < menuWidth + 10) { facingRight = false; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/TextMenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/TextMenuEntry.java similarity index 94% rename from runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/TextMenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/TextMenuEntry.java index 57fb07d55..7b30096ad 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/TextMenuEntry.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/TextMenuEntry.java @@ -21,10 +21,10 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.menu.entries; +package me.shedaniel.rei.impl.client.gui.overlay.menu.entries; import com.mojang.blaze3d.vertex.PoseStack; -import me.shedaniel.rei.impl.client.gui.menu.AbstractMenuEntry; +import me.shedaniel.rei.impl.client.gui.overlay.menu.AbstractMenuEntry; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.network.chat.Component; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/ToggleMenuEntry.java similarity index 95% rename from runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java rename to runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/ToggleMenuEntry.java index 3ac2cb627..e47ae5ef5 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/entries/ToggleMenuEntry.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/entries/ToggleMenuEntry.java @@ -21,7 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.client.gui.menu.entries; +package me.shedaniel.rei.impl.client.gui.overlay.menu.entries; import com.google.common.collect.Lists; import com.mojang.blaze3d.vertex.PoseStack; @@ -32,7 +32,7 @@ import me.shedaniel.rei.api.client.config.ConfigManager; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; -import me.shedaniel.rei.impl.client.gui.menu.AbstractMenuEntry; +import me.shedaniel.rei.impl.client.gui.overlay.menu.AbstractMenuEntry; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.network.chat.Component; @@ -117,7 +117,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { ScissorsHandler.INSTANCE.clearScissors(); matrices.pushPose(); matrices.translate(0, 0, -400); - REIRuntime.getInstance().getOverlay().get().renderTooltip(matrices, tooltip); + REIRuntime.getInstance().getOverlay().orElseThrow().renderTooltip(matrices, tooltip); matrices.popPose(); for (Rectangle area : areas) { ScissorsHandler.INSTANCE.scissor(area); diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java new file mode 100644 index 000000000..401659300 --- /dev/null +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java @@ -0,0 +1,18 @@ +package me.shedaniel.rei.impl.client.gui.overlay.menu.provider; + +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; +import me.shedaniel.rei.impl.client.ClientInternals; + +import java.util.List; + +public interface OverlayMenuEntryProvider { + List PROVIDERS = ClientInternals.resolveServices(OverlayMenuEntryProvider.class); + + List provide(Type type); + + enum Type { + CRAFTABLE_FILTER, + CONFIG, + ; + } +} diff --git a/runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.OverlayProvider b/runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.OverlayProvider new file mode 100644 index 000000000..876eea91d --- /dev/null +++ b/runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.provider.OverlayProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.gui.overlay.ScreenOverlayProviderImpl \ No newline at end of file diff --git a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java index c71d9fd83..059f907c9 100644 --- a/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java +++ b/runtime-frontend/widgets/src/main/java/me/shedaniel/rei/impl/client/gui/widget/basewidgets/TextFieldWidget.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.client.gui.widget.basewidgets; +import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.*; import com.mojang.math.Matrix4f; @@ -594,6 +595,11 @@ public void setFocused(boolean focused) { this.focusedResponder.accept(focused); } + @Override + public void setFocusedFromKey(boolean focused, InputConstants.Key key) { + setFocused(focused); + } + @Override public WidgetWithBounds asWidget() { return this; diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java index 435bdc722..9526129fe 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java @@ -43,7 +43,6 @@ import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.client.registry.screen.ClickArea; -import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.util.CollectionUtils; @@ -54,8 +53,8 @@ import me.shedaniel.rei.impl.client.gui.InternalCursorState; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.widget.CatchingExceptionUtils; -import me.shedaniel.rei.impl.client.gui.widget.TooltipImpl; import me.shedaniel.rei.impl.client.gui.widget.TooltipContextImpl; +import me.shedaniel.rei.impl.client.gui.widget.TooltipImpl; import me.shedaniel.rei.impl.common.util.IssuesDetector; import me.shedaniel.rei.impl.init.PluginDetector; import net.fabricmc.api.EnvType; @@ -74,7 +73,6 @@ import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.InteractionResult; import net.minecraft.world.inventory.CraftingMenu; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; @@ -85,7 +83,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; -import java.util.ConcurrentModificationException; import java.util.List; import java.util.function.BiFunction; import java.util.function.BooleanSupplier; @@ -108,10 +105,8 @@ public static void attachClientInternals() { ClientInternals.attachInstance((TriFunction) TooltipContextImpl::new, "tooltipContextProvider"); ClientInternals.attachInstance((Function) TooltipImpl.TooltipEntryImpl::new, "tooltipEntryProvider"); ClientInternals.attachInstance((Function<@Nullable Boolean, ClickArea.Result>) successful -> new ClickArea.Result() { - private List> categories = Lists.newArrayList(); - private BooleanSupplier execute = () -> { - return false; - }; + private final List> categories = Lists.newArrayList(); + private BooleanSupplier execute = () -> false; private Supplier tooltip = () -> { if (categories != null && !categories.isEmpty()) { Component collect = CollectionUtils.mapAndJoinToComponent(categories, @@ -213,27 +208,11 @@ public void onInitializeClient() { } public static boolean shouldReturn(Screen screen) { - if (REIRuntime.getInstance().getOverlay().isEmpty()) return true; - if (screen == null) return true; - if (screen != Minecraft.getInstance().screen) return true; - return _shouldReturn(screen); + return !ScreenRegistry.getInstance().shouldDisplay(screen); } private static ScreenOverlay getOverlay() { - return REIRuntime.getInstance().getOverlay().orElseThrow(() -> new IllegalStateException("Overlay not initialized!")); - } - - private static boolean _shouldReturn(Screen screen) { - try { - for (OverlayDecider decider : ScreenRegistry.getInstance().getDeciders(screen)) { - InteractionResult result = decider.shouldScreenBeOverlaid(screen); - if (result != InteractionResult.PASS) { - return result == InteractionResult.FAIL || REIRuntime.getInstance().getPreviousScreen() == null; - } - } - } catch (ConcurrentModificationException ignored) { - } - return true; + return REIRuntime.getInstance().getOverlay().orElseThrow(); } private void registerEvents() { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java index a38354ff6..d14d6a72b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java @@ -53,12 +53,12 @@ import java.util.Optional; -import static me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget.entrySize; +import static me.shedaniel.rei.impl.client.util.InternalEntryBounds.entrySize; @ApiStatus.Internal @Environment(EnvType.CLIENT) public class REIRuntimeImpl implements REIRuntime { - private ScreenOverlayImpl overlay; + private ScreenOverlay overlay; private AbstractContainerScreen previousContainerScreen = null; private Screen previousScreen = null; @@ -74,8 +74,7 @@ public static REIRuntimeImpl getInstance() { @Override public Optional getOverlay(boolean reset, boolean init) { if ((overlay == null && init) || reset) { - overlay = new ScreenOverlayImpl(); - overlay.init(); + overlay = ClientInternals.getNewOverlay(); overlay.getSearchField().setFocused(false); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java index 4e3f612df..7a704e62b 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java @@ -48,7 +48,6 @@ import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.ClientHelperImpl; -import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget; import me.shedaniel.rei.impl.display.DisplaySpec; import net.minecraft.ChatFormatting; import net.minecraft.client.gui.Font; @@ -74,6 +73,8 @@ import java.util.function.UnaryOperator; import java.util.stream.Stream; +import static me.shedaniel.rei.impl.client.util.InternalEntryBounds.entrySize; + public abstract class AbstractDisplayViewingScreen extends Screen implements DisplayScreen { protected final Map, List> categoryMap; protected final List> categories; @@ -273,7 +274,7 @@ public boolean equals(Object obj) { @Override public int getHeight() { - int entrySize = EntryListWidget.entrySize(); + int entrySize = entrySize(); int w = Math.max(1, MAX_WIDTH / entrySize); int height = Math.min(6, Mth.ceil(widget.getEntries().size() / (float) w)) * entrySize + 2; height += 12; @@ -283,7 +284,7 @@ public int getHeight() { @Override public int getWidth(Font font) { - int entrySize = EntryListWidget.entrySize(); + int entrySize = entrySize(); int w = Math.max(1, MAX_WIDTH / entrySize); int size = widget.getEntries().size(); int width = Math.min(size, w) * entrySize; @@ -294,7 +295,7 @@ public int getWidth(Font font) { @Override public void renderImage(Font font, int x, int y, PoseStack poses, ItemRenderer renderer, int z) { - int entrySize = EntryListWidget.entrySize(); + int entrySize = entrySize(); int w = Math.max(1, MAX_WIDTH / entrySize); int i = 0; poses.pushPose(); @@ -322,7 +323,7 @@ public void renderText(Font font, int x, int y, Matrix4f pose, MultiBufferSource x, y + 2, -1, true, pose, buffers, false, 0, 15728880); if (tagMatch != null) { - int entrySize = EntryListWidget.entrySize(); + int entrySize = entrySize(); int w = Math.max(1, MAX_WIDTH / entrySize); font.drawInBatch(new TranslatableComponent("text.rei.tag_accept", tagMatch.toString()) .withStyle(ChatFormatting.GRAY), @@ -336,7 +337,7 @@ public void renderText(Font font, int x, int y, Matrix4f pose, MultiBufferSource } protected static ScreenOverlay getOverlay() { - return REIRuntime.getInstance().getOverlay().orElseThrow(() -> new IllegalStateException("Overlay not initialized!")); + return REIRuntime.getInstance().getOverlay().orElseThrow(); } private boolean handleFocuses(int button) { diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java index 4ae0ed545..b06294a6a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java @@ -23,75 +23,23 @@ package me.shedaniel.rei.plugin.client.runtime; -import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.Lifecycle; -import me.shedaniel.math.Rectangle; -import me.shedaniel.rei.RoughlyEnoughItemsCoreClient; -import me.shedaniel.rei.api.client.ClientHelper; -import me.shedaniel.rei.api.client.REIRuntime; -import me.shedaniel.rei.api.client.favorites.FavoriteEntry; -import me.shedaniel.rei.api.client.favorites.FavoriteEntryType; -import me.shedaniel.rei.api.client.gui.AbstractRenderer; -import me.shedaniel.rei.api.client.gui.Renderer; -import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentProviderWidget; -import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentVisitorWidget; import me.shedaniel.rei.api.client.gui.widgets.Panel; -import me.shedaniel.rei.api.client.gui.widgets.Tooltip; -import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; -import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.plugins.REIClientPlugin; -import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.client.registry.screen.ExclusionZones; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; -import me.shedaniel.rei.api.client.util.ClientEntryStacks; -import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.gui.screens.Screen; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.Nullable; -import java.time.LocalDateTime; import java.util.Collections; -import java.util.function.Function; @Environment(EnvType.CLIENT) @ApiStatus.Internal public class DefaultClientRuntimePlugin implements REIClientPlugin { - @SuppressWarnings("rawtypes") - public DefaultClientRuntimePlugin() { - } - - @Override - public void registerEntries(EntryRegistry registry) { - if (LocalDateTime.now().getMonthValue() == 4 && LocalDateTime.now().getDayOfMonth() == 1) { - registry.addEntry(ClientEntryStacks.of(new AbstractRenderer() { - private ResourceLocation id = new ResourceLocation("roughlyenoughitems", "textures/gui/kirb.png"); - - @Override - public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { - RenderSystem.setShaderTexture(0, id); - innerBlit(matrices.last().pose(), bounds.x, bounds.getMaxX(), bounds.y, bounds.getMaxY(), getBlitOffset(), 0, 1, 0, 1); - } - - @Override - @Nullable - public Tooltip getTooltip(TooltipContext context) { - return Tooltip.create(context, new TextComponent("Kirby"), ClientHelper.getInstance().getFormattedModFromModId("Dream Land")); - } - })); - } - } - @Override public void registerScreens(ScreenRegistry registry) { ExclusionZones zones = registry.exclusionZones(); @@ -110,103 +58,5 @@ public void registerScreens(ScreenRegistry registry) { } return Collections.emptyList(); }); - registry.registerDraggableComponentProvider(DraggableComponentProviderWidget.from(context -> { - if (RoughlyEnoughItemsCoreClient.shouldReturn(context.getScreen()) || !REIRuntime.getInstance().isOverlayVisible()) return Collections.emptyList(); - return Widgets.walk(REIRuntime.getInstance().getOverlay().get().children(), DraggableComponentProviderWidget.class::isInstance); - })); - registry.registerDraggableComponentVisitor(DraggableComponentVisitorWidget.from(context -> { - if (RoughlyEnoughItemsCoreClient.shouldReturn(context.getScreen()) || !REIRuntime.getInstance().isOverlayVisible()) return Collections.emptyList(); - return Widgets.walk(REIRuntime.getInstance().getOverlay().get().children(), DraggableComponentVisitorWidget.class::isInstance); - })); - } - - @Override - public void registerFavorites(FavoriteEntryType.Registry registry) { - registry.register(EntryStackFavoriteType.INSTANCE.id, EntryStackFavoriteType.INSTANCE); - } - - private enum EntryStackFavoriteType implements FavoriteEntryType { - INSTANCE(FavoriteEntryType.ENTRY_STACK); - - private final String key = "data"; - private ResourceLocation id; - - EntryStackFavoriteType(ResourceLocation id) { - this.id = id; - } - - @Override - public DataResult read(CompoundTag object) { - EntryStack stack; - try { - stack = EntryStack.read(object.getCompound(key)); - } catch (Throwable throwable) { - return DataResult.error(throwable.getMessage()); - } - return DataResult.success(new EntryStackFavoriteEntry(stack), Lifecycle.stable()); - } - - @Override - public DataResult fromArgs(Object... args) { - if (args.length == 0) return DataResult.error("Cannot create EntryStackFavoriteEntry from empty args!"); - if (!(args[0] instanceof EntryStack stack)) - return DataResult.error("Creation of EntryStackFavoriteEntry from args expected EntryStack as the first argument!"); - if (!stack.supportSaving()) - return DataResult.error("Creation of EntryStackFavoriteEntry from an unserializable stack!"); - return DataResult.success(new EntryStackFavoriteEntry(stack), Lifecycle.stable()); - } - - @Override - public CompoundTag save(EntryStackFavoriteEntry entry, CompoundTag tag) { - tag.put(key, entry.stack.saveStack()); - return tag; - } - } - - private static class EntryStackFavoriteEntry extends FavoriteEntry { - private static final Function, String> CANCEL_FLUID_AMOUNT = s -> null; - private final EntryStack stack; - private final long hash; - - public EntryStackFavoriteEntry(EntryStack stack) { - this.stack = stack.normalize(); - this.hash = EntryStacks.hashExact(this.stack); - } - - @Override - public boolean isInvalid() { - return this.stack.isEmpty(); - } - - @Override - public Renderer getRenderer(boolean showcase) { - return this.stack; - } - - @Override - public boolean doAction(int button) { - return false; - } - - @Override - public long hashIgnoreAmount() { - return hash; - } - - @Override - public FavoriteEntry copy() { - return new EntryStackFavoriteEntry(stack.normalize()); - } - - @Override - public ResourceLocation getType() { - return EntryStackFavoriteType.INSTANCE.id; - } - - @Override - public boolean isSame(FavoriteEntry other) { - if (!(other instanceof EntryStackFavoriteEntry that)) return false; - return EntryStacks.equalsExact(stack, that.stack); - } } } diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java index 49d419973..94d1514f9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java @@ -32,7 +32,6 @@ import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.client.gui.widget.CraftableFilterButtonWidget; @@ -48,8 +47,11 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.UUID; public class InputMethodWatcher implements HintProvider { + public static final UUID MENU_UUID = UUID.fromString("b93cc166-d06f-4c5f-9bf0-334d18b4adaf"); + @Override public List provide() { if (PluginManager.areAnyReloading() || OverlaySearchField.isHighlighting) return Collections.emptyList(); @@ -91,11 +93,10 @@ public Color getColor() { } @Override - public List getButtons() { + public List getButtons(MenuAccess access) { return List.of( new HintButton(new TranslatableComponent("text.rei.input.methods.hint.configure"), bounds -> { - MenuAccess access = ScreenOverlayImpl.getInstance().menuAccess(); - access.openOrClose(CraftableFilterButtonWidget.FILTER_MENU_UUID, bounds.clone(), + access.openOrClose(MENU_UUID, bounds.clone(), () -> CraftableFilterButtonWidget.createInputMethodEntries(CraftableFilterButtonWidget.getApplicableInputMethods())); }), new HintButton(new TranslatableComponent("text.rei.input.methods.hint.ignore"), bounds -> { diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java index 179a89724..4380b71bd 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/PluginStageExecutionWatcher.java @@ -36,6 +36,7 @@ import me.shedaniel.rei.api.common.registry.Reloadable; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import org.apache.commons.lang3.StringUtils; @@ -190,7 +191,7 @@ public Color getColor() { } @Override - public List getButtons() { + public List getButtons(MenuAccess access) { return Collections.emptyList(); } diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchBarHighlightWatcher.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchBarHighlightWatcher.java index efaaa35d1..157c0b098 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchBarHighlightWatcher.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchBarHighlightWatcher.java @@ -27,6 +27,7 @@ import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; @@ -54,7 +55,7 @@ public Color getColor() { } @Override - public List getButtons() { + public List getButtons(MenuAccess access) { return Collections.emptyList(); } } diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java index 66a9f6a20..475e48f44 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/hints/HintProvider.java @@ -27,6 +27,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.common.Internals; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -52,7 +53,7 @@ default Double getProgress() { Color getColor(); - List getButtons(); + List getButtons(MenuAccess access); record HintButton(Component name, Consumer action) {} } diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java similarity index 66% rename from runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java rename to shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java index b890ccd94..79daeb3f0 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/menu/MenuAccess.java @@ -25,7 +25,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; -import me.shedaniel.math.impl.PointHelper; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import java.util.Collection; import java.util.UUID; @@ -39,24 +39,11 @@ public interface MenuAccess { boolean isInBounds(UUID uuid); - void open(UUID uuid, Menu menu); + void open(UUID uuid, Rectangle selfBounds, Supplier> menuSupplier); - void open(UUID uuid, Menu menu, Predicate or, Predicate and); + void open(UUID uuid, Rectangle selfBounds, Supplier> menuSupplier, Predicate or, Predicate and); - default void openOrClose(UUID uuid, Rectangle selfBounds, Supplier> menuSupplier) { - boolean isOpened = isOpened(uuid); - if (isOpened || !isAnyOpened()) { - boolean inBounds = (isValidPoint(PointHelper.ofMouse()) && selfBounds.contains(PointHelper.ofMouse())) || isInBounds(uuid); - if (isOpened != inBounds) { - if (inBounds) { - Menu menu = new Menu(selfBounds.clone(), menuSupplier.get(), false); - open(uuid, menu, selfBounds::contains, point -> true); - } else { - close(); - } - } - } - } + void openOrClose(UUID uuid, Rectangle selfBounds, Supplier> menuSupplier); boolean isValidPoint(Point point); diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java index eab390d90..be9216e72 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/search/AsyncSearchManager.java @@ -29,6 +29,7 @@ import me.shedaniel.rei.api.client.search.SearchProvider; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.CollectionUtils; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -152,4 +153,10 @@ public List> get() { public boolean matches(EntryStack stack) { return filter.test(stack); } + + @Override + @Nullable + public SearchFilter getSearchFilter() { + return filter; + } } diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/InternalEntryBounds.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/InternalEntryBounds.java new file mode 100644 index 000000000..30569d0a0 --- /dev/null +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/InternalEntryBounds.java @@ -0,0 +1,12 @@ +package me.shedaniel.rei.impl.client.util; + +import me.shedaniel.rei.api.client.config.ConfigObject; +import net.minecraft.util.Mth; + +public class InternalEntryBounds { + private static final int SIZE = 18; + + public static int entrySize() { + return Mth.ceil(SIZE * ConfigObject.getInstance().getEntrySize()); + } +} From 229b1fecdac427d3debe68f52ed7276e54a11cd0 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 11 Sep 2022 02:32:57 +0800 Subject: [PATCH 16/20] Improve Overlay Menus --- .../rei/api/client/gui/widgets/Widget.java | 8 +- .../rei/api/client/overlay/ScreenOverlay.java | 11 ++ gradle.properties | 1 + .../favorites/FavoritesListWidgetImpl.java | 5 + .../widgets/ConfigButtonWidgetProvider.java | 4 +- .../CraftableFilterButtonWidgetProvider.java | 89 +++------ .../widgets/SearchFieldWidgetProvider.java | 39 +++- .../widgets/search/OverlaySearchField.java | 8 +- .../client/gui/overlay/ScreenOverlayImpl.java | 90 ++++----- .../overlay/entries/EntryListProvider.java | 5 + .../entries/FavoritesListProvider.java | 6 +- .../overlay/entries/FavoritesListWidget.java | 5 + .../gui/overlay/hints/InputMethodWatcher.java | 172 ++++++++++++++++++ .../provider/OverlayMenuEntryProvider.java | 2 + .../widgets/OverlayWidgetProvider.java | 11 +- ...iel.rei.impl.client.gui.hints.HintProvider | 1 + ...lay.menu.provider.OverlayMenuEntryProvider | 1 + .../rei/RoughlyEnoughItemsCoreClient.java | 4 +- .../gui/widget/AutoCraftingButtonWidget.java | 13 +- .../gui/widget/DisplayCompositeWidget.java | 13 +- .../client/runtime/InputMethodWatcher.java | 107 ----------- .../runtime/SearchBarHighlightWatcher.java | 4 +- ...iel.rei.impl.client.gui.hints.HintProvider | 3 +- 23 files changed, 333 insertions(+), 269 deletions(-) create mode 100644 runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/hints/InputMethodWatcher.java create mode 100644 runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider create mode 100644 runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.menu.provider.OverlayMenuEntryProvider delete mode 100644 runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java diff --git a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java index 2e683f51a..9f7fe44b9 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/gui/widgets/Widget.java @@ -57,18 +57,18 @@ public abstract class Widget extends AbstractContainerEventHandler implements ne * The font for rendering text */ protected final Font font = minecraft.font; - private static final Stack mouseStack = new Stack<>(); + private static final Stack MOUSE_STACK = new Stack<>(); public static Point mouse() { - return mouseStack.empty() ? PointHelper.ofMouse() : mouseStack.peek(); + return MOUSE_STACK.empty() ? PointHelper.ofMouse() : MOUSE_STACK.peek(); } public static Point pushMouse(Point mouse) { - return mouseStack.push(mouse); + return MOUSE_STACK.push(mouse); } public static Point popMouse() { - return mouseStack.pop(); + return MOUSE_STACK.pop(); } public static Point translateMouse(PoseStack poses) { diff --git a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java index 9954a57a9..496fb72d9 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java @@ -31,6 +31,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.api.client.search.SearchFilter; +import me.shedaniel.rei.api.common.display.Display; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import org.jetbrains.annotations.ApiStatus; @@ -134,4 +135,14 @@ public boolean isNotInExclusionZones(Rectangle bounds) { * @param tooltip the tooltip */ public abstract void renderTooltip(PoseStack matrices, Tooltip tooltip); + + /** + * Returns whether slot highlighting is on for the current search filter. + * + * @return whether slot highlighting is on for the current search filter. + */ + public abstract boolean isHighlighting(); + + @ApiStatus.Experimental + public abstract boolean submitDisplayHistory(Display display, @Nullable Rectangle fromBounds); } diff --git a/gradle.properties b/gradle.properties index d287dec04..92c5ff156 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,4 @@ +org.gradle.java.home=C:\\Program Files\\OpenJDK\\jdk-17.0.2 org.gradle.jvmargs=-Xmx10G base_version=8.4 unstable=false diff --git a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java index 82eb891be..8a3dace66 100644 --- a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java @@ -251,4 +251,9 @@ public Widget asWidget() { public Rectangle getFavoritesBounds() { return favoritesBounds; } + + @Override + public void submitDisplayHistory(Display display, @Nullable Rectangle fromBounds) { + displayHistory.addDisplay(fromBounds, display); + } } diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java index eabe883a5..eef3e2686 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java @@ -36,7 +36,6 @@ import me.shedaniel.rei.api.client.gui.config.SyntaxHighlightingMode; import me.shedaniel.rei.api.client.gui.screen.DisplayScreen; import me.shedaniel.rei.api.client.gui.widgets.Button; -import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; @@ -53,14 +52,13 @@ import java.util.Collection; import java.util.List; import java.util.UUID; -import java.util.function.Consumer; import java.util.function.UnaryOperator; public class ConfigButtonWidgetProvider implements OverlayWidgetProvider { private static final UUID CONFIG_MENU_UUID = UUID.fromString("4357bc36-0a4e-47d2-8e07-ddc220df4a0f"); @Override - public List provide(ScreenOverlay overlay, MenuAccess access, Consumer textFieldSink, UnaryOperator lateRenderable) { + public List provide(ScreenOverlay overlay, MenuAccess access, TextFieldSink textFieldSink, UnaryOperator lateRenderable) { return List.of(create(overlay, access, lateRenderable)); } diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java index f5fbc42a0..b470678b0 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java @@ -30,40 +30,34 @@ import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; -import me.shedaniel.rei.api.client.gui.widgets.*; +import me.shedaniel.rei.api.client.gui.widgets.Button; +import me.shedaniel.rei.api.client.gui.widgets.Widget; +import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.overlay.OverlayListWidget; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; -import me.shedaniel.rei.api.client.search.method.InputMethod; -import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; +import me.shedaniel.rei.impl.client.gui.overlay.menu.entries.SeparatorMenuEntry; import me.shedaniel.rei.impl.client.gui.overlay.menu.entries.SubMenuEntry; import me.shedaniel.rei.impl.client.gui.overlay.menu.entries.ToggleMenuEntry; -import me.shedaniel.rei.impl.client.gui.screen.ConfigReloadingScreen; -import me.shedaniel.rei.impl.common.InternalLogger; +import me.shedaniel.rei.impl.client.gui.overlay.menu.provider.OverlayMenuEntryProvider; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Blocks; import java.util.*; -import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.function.Consumer; import java.util.function.UnaryOperator; public class CraftableFilterButtonWidgetProvider implements OverlayWidgetProvider { public static final UUID FILTER_MENU_UUID = UUID.fromString("2839e998-1679-4f9e-a257-37411d16f1e6"); @Override - public List provide(ScreenOverlay overlay, MenuAccess access, Consumer textFieldSink, UnaryOperator lateRenderable) { + public List provide(ScreenOverlay overlay, MenuAccess access, TextFieldSink textFieldSink, UnaryOperator lateRenderable) { if (ConfigObject.getInstance().isCraftableFilterEnabled()) { return List.of(create(overlay, access, lateRenderable)); } else { @@ -111,60 +105,33 @@ private static Collection menuEntries() { .toList()) )); - List>> applicableInputMethods = getApplicableInputMethods(); - if (applicableInputMethods.size() > 1) { - entries.add(new SubMenuEntry(new TranslatableComponent("text.rei.config.menu.search_field.input_method"), createInputMethodEntries(applicableInputMethods))); + List> additionalEntries = new ArrayList<>(); + + for (OverlayMenuEntryProvider provider : OverlayMenuEntryProvider.PROVIDERS) { + List provided = provider.provide(OverlayMenuEntryProvider.Type.CRAFTABLE_FILTER); + + if (provided != null && !provided.isEmpty()) { + additionalEntries.add(provided); + } + } + + for (List additionalEntryList : additionalEntries) { + if (additionalEntryList.size() > 1) { + entries.add(new SeparatorMenuEntry()); + entries.addAll(additionalEntryList); + } + } + + List singleEntries = CollectionUtils.flatMap(CollectionUtils.filterToList(additionalEntries, list -> list.size() == 1), list -> list); + + if (!singleEntries.isEmpty()) { + entries.add(new SeparatorMenuEntry()); + entries.addAll(singleEntries); } return entries; } - public static List>> getApplicableInputMethods() { - String languageCode = Minecraft.getInstance().options.languageCode; - return InputMethodRegistry.getInstance().getAll().entrySet().stream() - .filter(entry -> CollectionUtils.anyMatch(entry.getValue().getMatchingLocales(), locale -> locale.code().equals(languageCode))) - .toList(); - } - - public static List createInputMethodEntries(List>> applicableInputMethods) { - ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); - ConfigObject config = ConfigObject.getInstance(); - return applicableInputMethods.stream() - .map(pair -> ToggleMenuEntry.of(pair.getValue().getName(), - () -> Objects.equals(config.getInputMethodId(), pair.getKey()), - bool -> { - ExecutorService service = Executors.newSingleThreadExecutor(); - InputMethod active = InputMethod.active(); - active.dispose(service).whenComplete((unused, throwable) -> { - if (throwable != null) { - InternalLogger.getInstance().error("Failed to dispose input method", throwable); - } - - manager.set("functionality.inputMethod", new ResourceLocation("rei:default")); - }).join(); - CompletableFuture future = pair.getValue().prepare(service).whenComplete((unused, throwable) -> { - if (throwable != null) { - InternalLogger.getInstance().error("Failed to prepare input method", throwable); - manager.set("functionality.inputMethod", new ResourceLocation("rei:default")); - } else { - manager.set("functionality.inputMethod", pair.getKey()); - } - }); - Screen screen = Minecraft.getInstance().screen; - Minecraft.getInstance().setScreen(new ConfigReloadingScreen(new TranslatableComponent("text.rei.input.methods.initializing"), - () -> !future.isDone(), () -> { - Minecraft.getInstance().setScreen(screen); - })); - future.whenComplete((unused, throwable) -> { - service.shutdown(); - }); - }) - .withActive(() -> !Objects.equals(config.getInputMethodId(), pair.getKey())) - .withTooltip(() -> Tooltip.create(TooltipContext.ofMouse(), pair.getValue().getDescription())) - ) - .toList(); - } - private static Rectangle getCraftableFilterBounds() { Rectangle area = REIRuntime.getInstance().getSearchTextField().asWidget().getBounds().clone(); area.setLocation(area.x + area.width + 4, area.y - 1); diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java index 7fb67cf34..85d305568 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java @@ -1,25 +1,56 @@ package me.shedaniel.rei.impl.client.gui.overlay.widgets; -import me.shedaniel.rei.api.client.gui.widgets.TextField; +import com.mojang.blaze3d.platform.Window; +import me.shedaniel.math.Rectangle; +import me.shedaniel.rei.api.client.REIRuntime; +import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.client.gui.overlay.widgets.search.OverlaySearchField; +import net.minecraft.client.Minecraft; import java.util.List; -import java.util.function.Consumer; import java.util.function.UnaryOperator; public class SearchFieldWidgetProvider implements OverlayWidgetProvider { private OverlaySearchField searchField; @Override - public List provide(ScreenOverlay overlay, MenuAccess access, Consumer textFieldSink, UnaryOperator lateRenderable) { + public List provide(ScreenOverlay overlay, MenuAccess access, TextFieldSink textFieldSink, UnaryOperator lateRenderable) { if (searchField == null) { searchField = new OverlaySearchField(access); } - textFieldSink.accept(searchField); + searchField.getBounds().setBounds(getSearchFieldArea(overlay)); + textFieldSink.accept(searchField, searchField::isHighlighting); return List.of(lateRenderable.apply(searchField)); } + + private Rectangle getSearchFieldArea(ScreenOverlay overlay) { + int widthRemoved = 1; + if (ConfigObject.getInstance().isCraftableFilterEnabled()) widthRemoved += 22; + if (ConfigObject.getInstance().isLowerConfigButton()) widthRemoved += 22; + return switch (REIRuntime.getInstance().getContextualSearchFieldLocation()) { + case TOP_SIDE -> getTopSideSearchFieldArea(overlay, widthRemoved); + case BOTTOM_SIDE -> getBottomSideSearchFieldArea(overlay, widthRemoved); + case CENTER -> getCenterSearchFieldArea(overlay, widthRemoved); + }; + } + + private Rectangle getTopSideSearchFieldArea(ScreenOverlay overlay, int widthRemoved) { + return new Rectangle(overlay.getBounds().x + 2, 4, overlay.getBounds().width - 6 - widthRemoved, 18); + } + + private Rectangle getBottomSideSearchFieldArea(ScreenOverlay overlay, int widthRemoved) { + Window window = Minecraft.getInstance().getWindow(); + return new Rectangle(overlay.getBounds().x + 2, window.getGuiScaledHeight() - 22, overlay.getBounds().width - 6 - widthRemoved, 18); + } + + private Rectangle getCenterSearchFieldArea(ScreenOverlay overlay, int widthRemoved) { + Window window = Minecraft.getInstance().getWindow(); + Rectangle screenBounds = ScreenRegistry.getInstance().getScreenBounds(Minecraft.getInstance().screen); + return new Rectangle(screenBounds.x, window.getGuiScaledHeight() - 22, screenBounds.width - widthRemoved, 18); + } } diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchField.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchField.java index 6484f82e2..8428270d6 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchField.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/search/OverlaySearchField.java @@ -73,10 +73,10 @@ @SuppressWarnings("UnstableApiUsage") @ApiStatus.Internal public class OverlaySearchField extends DelegateWidget implements DelegateTextField, TextField.TextFormatter, TextField.SuggestionRenderer, TextField.BorderColorProvider { - public static boolean isHighlighting = false; private static final Style SPLITTER_STYLE = Style.EMPTY.withColor(ChatFormatting.GRAY); private static final Style QUOTES_STYLE = Style.EMPTY.withColor(ChatFormatting.GOLD); private static final Style ERROR_STYLE = Style.EMPTY.withColor(TextColor.fromRgb(0xff5555)); + private boolean isHighlighting = false; private final TextField textField; private final MenuAccess access; private boolean previouslyClicking = false; @@ -383,7 +383,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { super.render(matrices, mouseX, mouseY, delta); RenderSystem.enableDepthTest(); if (isMain && isHighlighting) { - this.renderEntryHighlighting(matrices); + renderEntryHighlighting(matrices); } } @@ -427,4 +427,8 @@ public static void renderEntryHighlighting(PoseStack matrices) { RenderSystem.colorMask(true, true, true, true); RenderSystem.enableDepthTest(); } + + public boolean isHighlighting() { + return isHighlighting; + } } diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java index ba55096b4..f4d8a1875 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java @@ -24,56 +24,36 @@ package me.shedaniel.rei.impl.client.gui.overlay; import com.mojang.blaze3d.platform.InputConstants; -import com.mojang.blaze3d.platform.Window; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; -import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; import me.shedaniel.rei.api.client.gui.widgets.DelegateWidget; import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.overlay.OverlayListWidget; -import me.shedaniel.rei.api.client.overlay.ScreenOverlay; -import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.client.search.SearchFilter; -import me.shedaniel.rei.impl.client.ClientInternals; +import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.impl.client.gui.overlay.entries.EntryListProvider; import me.shedaniel.rei.impl.client.gui.overlay.entries.EntryListWidget; import me.shedaniel.rei.impl.client.gui.overlay.entries.FavoritesListProvider; import me.shedaniel.rei.impl.client.gui.overlay.entries.FavoritesListWidget; import me.shedaniel.rei.impl.client.gui.overlay.widgets.OverlayWidgetProvider; import me.shedaniel.rei.impl.common.InternalLogger; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.events.GuiEventListener; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; -import java.util.List; import java.util.Objects; import java.util.Optional; +import java.util.function.BooleanSupplier; @ApiStatus.Internal public final class ScreenOverlayImpl extends AbstractScreenOverlay { - private static final List ENTRY_LIST_PROVIDERS = ClientInternals.resolveServices(EntryListProvider.class); - private static final List FAVORITES_LIST_PROVIDERS = ClientInternals.resolveServices(FavoritesListProvider.class); - private static final List OVERLAY_WIDGET_PROVIDERS = ClientInternals.resolveServices(OverlayWidgetProvider.class); private EntryListWidget entryListWidget = null; private FavoritesListWidget favoritesListWidget = null; private TextField searchField = null; - - public static EntryListWidget getEntryListWidget() { - return getInstanceInternal().getEntryList(); - } - - @Nullable - public static FavoritesListWidget getFavoritesListWidget() { - return getInstanceInternal().getFavoritesListNullable(); - } - - private static ScreenOverlayImpl getInstanceInternal() { - return (ScreenOverlayImpl) ScreenOverlay.getInstance().orElseThrow(); - } + private BooleanSupplier isHighlighted = null; public ScreenOverlayImpl() { this.init(); @@ -84,27 +64,29 @@ public void init() { super.init(); this.searchField = null; + this.isHighlighted = null; - FavoritesListWidget favoritesListWidget = getFavoritesListWidget(); + FavoritesListWidget favoritesListWidget = getFavoritesListNullable(); if (favoritesListWidget != null) { this.children().add(favoritesListWidget.asWidget()); } - EntryListWidget entryListWidget = getEntryListWidget(); + EntryListWidget entryListWidget = getEntryList(); entryListWidget.initBounds(this.getBounds()); entryListWidget.initSearch(searchField.getText(), true); this.children().add(entryListWidget.asWidget()); searchField.setResponder(s -> entryListWidget.initSearch(s, false)); entryListWidget.init(this); - for (OverlayWidgetProvider provider : OVERLAY_WIDGET_PROVIDERS) { - provider.provide(this, menuAccess(), textField -> this.searchField = textField, - LateRenderableWidget::new); + for (OverlayWidgetProvider provider : OverlayWidgetProvider.PROVIDERS) { + provider.provide(this, menuAccess(), (textField, isHighlighted) -> { + this.searchField = textField; + this.isHighlighted = isHighlighted; + }, LateRenderableWidget::new); } if (this.searchField != null) { - this.searchField.asWidget().getBounds().setBounds(getSearchFieldArea()); this.children().add(this.searchField.asWidget()); } else { InternalLogger.getInstance().warn("Search Field is not found! This might cause problems!"); @@ -117,36 +99,9 @@ private LateRenderableWidget(Widget widget) { } } - private Rectangle getSearchFieldArea() { - int widthRemoved = 1; - if (ConfigObject.getInstance().isCraftableFilterEnabled()) widthRemoved += 22; - if (ConfigObject.getInstance().isLowerConfigButton()) widthRemoved += 22; - SearchFieldLocation searchFieldLocation = REIRuntime.getInstance().getContextualSearchFieldLocation(); - return switch (searchFieldLocation) { - case TOP_SIDE -> getTopSideSearchFieldArea(widthRemoved); - case BOTTOM_SIDE -> getBottomSideSearchFieldArea(widthRemoved); - case CENTER -> getCenterSearchFieldArea(widthRemoved); - }; - } - - private Rectangle getTopSideSearchFieldArea(int widthRemoved) { - return new Rectangle(getBounds().x + 2, 4, getBounds().width - 6 - widthRemoved, 18); - } - - private Rectangle getBottomSideSearchFieldArea(int widthRemoved) { - Window window = Minecraft.getInstance().getWindow(); - return new Rectangle(getBounds().x + 2, window.getGuiScaledHeight() - 22, getBounds().width - 6 - widthRemoved, 18); - } - - private Rectangle getCenterSearchFieldArea(int widthRemoved) { - Window window = Minecraft.getInstance().getWindow(); - Rectangle screenBounds = ScreenRegistry.getInstance().getScreenBounds(minecraft.screen); - return new Rectangle(screenBounds.x, window.getGuiScaledHeight() - 22, screenBounds.width - widthRemoved, 18); - } - @Override protected void updateSearch() { - getEntryListWidget().initSearch(getSearchField().getText(), true); + getEntryList().initSearch(getSearchField().getText(), true); } @Override @@ -184,7 +139,7 @@ public void setFocused(@Nullable GuiEventListener focused) { @Override public EntryListWidget getEntryList() { EntryListWidget current = null; - for (EntryListProvider provider : ENTRY_LIST_PROVIDERS) { + for (EntryListProvider provider : EntryListProvider.PROVIDERS) { current = provider.getEntryList(); if (current != null) break; } @@ -205,7 +160,7 @@ public Optional getFavoritesList() { private FavoritesListWidget getFavoritesListNullable() { if (ConfigObject.getInstance().isFavoritesEnabled()) { FavoritesListWidget current = null; - for (FavoritesListProvider provider : FAVORITES_LIST_PROVIDERS) { + for (FavoritesListProvider provider : FavoritesListProvider.PROVIDERS) { current = provider.getFavoritesList(); if (current != null) break; } @@ -230,4 +185,21 @@ public TextField getSearchField() { public SearchFilter getCurrentSearchFilter() { return getEntryList().getSearchFilter(); } + + @Override + public boolean isHighlighting() { + return this.isHighlighted != null && this.isHighlighted.getAsBoolean(); + } + + @Override + public boolean submitDisplayHistory(Display display, @Nullable Rectangle fromBounds) { + FavoritesListWidget favoritesListWidget = getFavoritesListNullable(); + + if (favoritesListWidget != null) { + favoritesListWidget.submitDisplayHistory(display, fromBounds); + return true; + } else { + return false; + } + } } diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListProvider.java index 0e736a595..7e47f29e7 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListProvider.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListProvider.java @@ -23,11 +23,16 @@ package me.shedaniel.rei.impl.client.gui.overlay.entries; +import me.shedaniel.rei.impl.client.ClientInternals; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +import java.util.List; + @ApiStatus.Internal public interface EntryListProvider { + List PROVIDERS = ClientInternals.resolveServices(EntryListProvider.class); + @Nullable EntryListWidget getEntryList(); } diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListProvider.java index ca88d3934..66b43975b 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListProvider.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListProvider.java @@ -23,12 +23,16 @@ package me.shedaniel.rei.impl.client.gui.overlay.entries; -import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import me.shedaniel.rei.impl.client.ClientInternals; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +import java.util.List; + @ApiStatus.Internal public interface FavoritesListProvider { + List PROVIDERS = ClientInternals.resolveServices(FavoritesListProvider.class); + @Nullable FavoritesListWidget getFavoritesList(); } diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListWidget.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListWidget.java index ee75003eb..f81c751fa 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListWidget.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/FavoritesListWidget.java @@ -26,6 +26,9 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import me.shedaniel.rei.api.common.display.Display; + +import javax.annotation.Nullable; public interface FavoritesListWidget extends OverlayListWidget { void initBounds(); @@ -33,4 +36,6 @@ public interface FavoritesListWidget extends OverlayListWidget { Widget asWidget(); Rectangle getFavoritesBounds(); + + void submitDisplayHistory(Display display, @Nullable Rectangle fromBounds); } diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/hints/InputMethodWatcher.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/hints/InputMethodWatcher.java new file mode 100644 index 000000000..005d367ef --- /dev/null +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/hints/InputMethodWatcher.java @@ -0,0 +1,172 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.overlay.hints; + +import me.shedaniel.math.Color; +import me.shedaniel.math.Point; +import me.shedaniel.rei.api.client.config.ConfigObject; +import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; +import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.api.client.search.method.InputMethod; +import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; +import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.api.common.util.CollectionUtils; +import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; +import me.shedaniel.rei.impl.client.gui.hints.HintProvider; +import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; +import me.shedaniel.rei.impl.client.gui.overlay.menu.entries.SubMenuEntry; +import me.shedaniel.rei.impl.client.gui.overlay.menu.entries.ToggleMenuEntry; +import me.shedaniel.rei.impl.client.gui.overlay.menu.provider.OverlayMenuEntryProvider; +import me.shedaniel.rei.impl.client.gui.screen.ConfigReloadingScreen; +import me.shedaniel.rei.impl.common.InternalLogger; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.MutableComponent; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import org.jetbrains.annotations.Nullable; + +import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class InputMethodWatcher implements HintProvider, OverlayMenuEntryProvider { + public static final UUID MENU_UUID = UUID.fromString("b93cc166-d06f-4c5f-9bf0-334d18b4adaf"); + + @Override + public List provide() { + if (PluginManager.areAnyReloading() || ScreenOverlay.getInstance().orElseThrow().isHighlighting()) return Collections.emptyList(); + ResourceLocation id = ConfigObject.getInstance().getInputMethodId(); + if (id == null) { + String languageCode = Minecraft.getInstance().options.languageCode; + MutableComponent component = new TextComponent(""); + int match = 0; + for (Map.Entry> entry : InputMethodRegistry.getInstance().getAll().entrySet()) { + InputMethod method = entry.getValue(); + if (entry.getKey().equals(new ResourceLocation("rei:default"))) continue; + if (CollectionUtils.anyMatch(method.getMatchingLocales(), locale -> locale.code().equals(languageCode))) { + if (!component.getString().isEmpty()) { + component.append(", "); + } + + component.append(method.getName()); + match++; + } + } + if (match > 0) { + return List.of(new TranslatableComponent("text.rei.input.methods.hint"), + new TextComponent(" "), component); + } + } + + return Collections.emptyList(); + } + + @Override + @Nullable + public Tooltip provideTooltip(Point mouse) { + return null; + } + + @Override + public Color getColor() { + return Color.ofTransparent(0x50ffadca); + } + + @Override + public List getButtons(MenuAccess access) { + return List.of( + new HintButton(new TranslatableComponent("text.rei.input.methods.hint.configure"), bounds -> { + access.openOrClose(MENU_UUID, bounds.clone(), + () -> createInputMethodEntries(getApplicableInputMethods())); + }), + new HintButton(new TranslatableComponent("text.rei.input.methods.hint.ignore"), bounds -> { + ConfigManagerInternal.getInstance().set("functionality.inputMethod", new ResourceLocation("rei:default")); + }) + ); + } + + @Override + public List provide(Type type) { + if (type != Type.CRAFTABLE_FILTER) return List.of(); + + List>> applicableInputMethods = getApplicableInputMethods(); + if (applicableInputMethods.size() > 1) { + return List.of(new SubMenuEntry(new TranslatableComponent("text.rei.config.menu.search_field.input_method"), createInputMethodEntries(applicableInputMethods))); + } + + return List.of(); + } + + public static List>> getApplicableInputMethods() { + String languageCode = Minecraft.getInstance().options.languageCode; + return InputMethodRegistry.getInstance().getAll().entrySet().stream() + .filter(entry -> CollectionUtils.anyMatch(entry.getValue().getMatchingLocales(), locale -> locale.code().equals(languageCode))) + .toList(); + } + + public static List createInputMethodEntries(List>> applicableInputMethods) { + ConfigManagerInternal manager = ConfigManagerInternal.getInstance(); + ConfigObject config = ConfigObject.getInstance(); + return applicableInputMethods.stream() + .map(pair -> ToggleMenuEntry.of(pair.getValue().getName(), + () -> Objects.equals(config.getInputMethodId(), pair.getKey()), + bool -> { + ExecutorService service = Executors.newSingleThreadExecutor(); + InputMethod active = InputMethod.active(); + active.dispose(service).whenComplete((unused, throwable) -> { + if (throwable != null) { + InternalLogger.getInstance().error("Failed to dispose input method", throwable); + } + + manager.set("functionality.inputMethod", new ResourceLocation("rei:default")); + }).join(); + CompletableFuture future = pair.getValue().prepare(service).whenComplete((unused, throwable) -> { + if (throwable != null) { + InternalLogger.getInstance().error("Failed to prepare input method", throwable); + manager.set("functionality.inputMethod", new ResourceLocation("rei:default")); + } else { + manager.set("functionality.inputMethod", pair.getKey()); + } + }); + Screen screen = Minecraft.getInstance().screen; + Minecraft.getInstance().setScreen(new ConfigReloadingScreen(new TranslatableComponent("text.rei.input.methods.initializing"), + () -> !future.isDone(), () -> { + Minecraft.getInstance().setScreen(screen); + })); + future.whenComplete((unused, throwable) -> { + service.shutdown(); + }); + }) + .withActive(() -> !Objects.equals(config.getInputMethodId(), pair.getKey())) + .withTooltip(() -> Tooltip.create(TooltipContext.ofMouse(), pair.getValue().getDescription())) + ) + .toList(); + } +} diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java index 401659300..367f16c46 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java @@ -2,9 +2,11 @@ import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; import me.shedaniel.rei.impl.client.ClientInternals; +import org.jetbrains.annotations.ApiStatus; import java.util.List; +@ApiStatus.Internal public interface OverlayMenuEntryProvider { List PROVIDERS = ClientInternals.resolveServices(OverlayMenuEntryProvider.class); diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java index e89e4e98f..3c19aa6b7 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java @@ -26,12 +26,19 @@ import me.shedaniel.rei.api.client.gui.widgets.TextField; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import java.util.List; -import java.util.function.Consumer; +import java.util.function.BooleanSupplier; import java.util.function.UnaryOperator; public interface OverlayWidgetProvider { - List provide(ScreenOverlay overlay, MenuAccess access, Consumer textFieldSink, UnaryOperator lateRenderable); + List PROVIDERS = ClientInternals.resolveServices(OverlayWidgetProvider.class); + + List provide(ScreenOverlay overlay, MenuAccess access, TextFieldSink textFieldSink, UnaryOperator lateRenderable); + + interface TextFieldSink { + void accept(TextField textField, BooleanSupplier isHighlighted); + } } diff --git a/runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider b/runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider new file mode 100644 index 000000000..cde887e18 --- /dev/null +++ b/runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.gui.overlay.hints.InputMethodWatcher \ No newline at end of file diff --git a/runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.menu.provider.OverlayMenuEntryProvider b/runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.menu.provider.OverlayMenuEntryProvider new file mode 100644 index 000000000..cde887e18 --- /dev/null +++ b/runtime-frontend/overlay/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.overlay.menu.provider.OverlayMenuEntryProvider @@ -0,0 +1 @@ +me.shedaniel.rei.impl.client.gui.overlay.hints.InputMethodWatcher \ No newline at end of file diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java index 9526129fe..50877066c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java @@ -104,11 +104,11 @@ public static void attachClientInternals() { ClientInternals.attachInstance((BiFunction<@Nullable Point, Collection, Tooltip>) TooltipImpl::impl, "tooltipProvider"); ClientInternals.attachInstance((TriFunction) TooltipContextImpl::new, "tooltipContextProvider"); ClientInternals.attachInstance((Function) TooltipImpl.TooltipEntryImpl::new, "tooltipEntryProvider"); - ClientInternals.attachInstance((Function<@Nullable Boolean, ClickArea.Result>) successful -> new ClickArea.Result() { + ClientInternals.attachInstance((Function) successful -> new ClickArea.Result() { private final List> categories = Lists.newArrayList(); private BooleanSupplier execute = () -> false; private Supplier tooltip = () -> { - if (categories != null && !categories.isEmpty()) { + if (!categories.isEmpty()) { Component collect = CollectionUtils.mapAndJoinToComponent(categories, identifier -> CategoryRegistry.getInstance().tryGet(identifier) .map(config -> config.getCategory().getTitle()) diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java index f05c24317..9dc8675c7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java @@ -29,12 +29,11 @@ import me.shedaniel.math.impl.PointHelper; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.client.gui.widgets.*; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.impl.client.ClientInternals; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.toast.CopyRecipeIdentifierToast; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; import me.shedaniel.rei.impl.client.provider.AutoCraftingEvaluator; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.resources.language.I18n; @@ -105,10 +104,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { return true; } else if (ConfigObject.getInstance().isFavoritesEnabled() && containsMouse(PointHelper.ofMouse())) { if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - - if (favoritesListWidget != null) { - favoritesListWidget.displayHistory.addDisplay(displayBounds.clone(), displaySupplier.get()); + if (ScreenOverlay.getInstance().get().submitDisplayHistory(displaySupplier.get(), displayBounds.clone())) { return true; } } @@ -127,10 +123,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { return true; } else if (ConfigObject.getInstance().isFavoritesEnabled() && containsMouse(PointHelper.ofMouse())) { if (ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - - if (favoritesListWidget != null) { - favoritesListWidget.displayHistory.addDisplay(displayBounds.clone(), displaySupplier.get()); + if (ScreenOverlay.getInstance().get().submitDisplayHistory(displaySupplier.get(), displayBounds.clone())) { return true; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayCompositeWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayCompositeWidget.java index d35ae8d32..829217f6e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayCompositeWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/DisplayCompositeWidget.java @@ -34,9 +34,8 @@ import me.shedaniel.rei.api.client.gui.widgets.DelegateWidgetWithBounds; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; import me.shedaniel.rei.impl.display.DisplaySpec; import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.Nullable; @@ -77,10 +76,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (ConfigObject.getInstance().isFavoritesEnabled() && containsMouse(mouse())) { if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - - if (favoritesListWidget != null) { - favoritesListWidget.displayHistory.addDisplay(getBounds().clone(), display.provideInternalDisplay()); + if (ScreenOverlay.getInstance().get().submitDisplayHistory(display.provideInternalDisplay(), getBounds().clone())) { return true; } } @@ -97,10 +93,7 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { if (ConfigObject.getInstance().isFavoritesEnabled() && containsMouse(mouseX, mouseY)) { if (ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { - FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); - - if (favoritesListWidget != null) { - favoritesListWidget.displayHistory.addDisplay(getBounds().clone(), display.provideInternalDisplay()); + if (ScreenOverlay.getInstance().get().submitDisplayHistory(display.provideInternalDisplay(), getBounds().clone())) { return true; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java deleted file mode 100644 index 94d1514f9..000000000 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/InputMethodWatcher.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.plugin.client.runtime; - -import me.shedaniel.math.Color; -import me.shedaniel.math.Point; -import me.shedaniel.rei.api.client.config.ConfigObject; -import me.shedaniel.rei.api.client.gui.widgets.Tooltip; -import me.shedaniel.rei.api.client.search.method.InputMethod; -import me.shedaniel.rei.api.client.search.method.InputMethodRegistry; -import me.shedaniel.rei.api.common.plugins.PluginManager; -import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; -import me.shedaniel.rei.impl.client.gui.hints.HintProvider; -import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; -import me.shedaniel.rei.impl.client.gui.widget.CraftableFilterButtonWidget; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; -import net.minecraft.client.Minecraft; -import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.TextComponent; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import org.jetbrains.annotations.Nullable; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.UUID; - -public class InputMethodWatcher implements HintProvider { - public static final UUID MENU_UUID = UUID.fromString("b93cc166-d06f-4c5f-9bf0-334d18b4adaf"); - - @Override - public List provide() { - if (PluginManager.areAnyReloading() || OverlaySearchField.isHighlighting) return Collections.emptyList(); - ResourceLocation id = ConfigObject.getInstance().getInputMethodId(); - if (id == null) { - String languageCode = Minecraft.getInstance().options.languageCode; - MutableComponent component = new TextComponent(""); - int match = 0; - for (Map.Entry> entry : InputMethodRegistry.getInstance().getAll().entrySet()) { - InputMethod method = entry.getValue(); - if (entry.getKey().equals(new ResourceLocation("rei:default"))) continue; - if (CollectionUtils.anyMatch(method.getMatchingLocales(), locale -> locale.code().equals(languageCode))) { - if (!component.getString().isEmpty()) { - component.append(", "); - } - - component.append(method.getName()); - match++; - } - } - if (match > 0) { - return List.of(new TranslatableComponent("text.rei.input.methods.hint"), - new TextComponent(" "), component); - } - } - - return Collections.emptyList(); - } - - @Override - @Nullable - public Tooltip provideTooltip(Point mouse) { - return null; - } - - @Override - public Color getColor() { - return Color.ofTransparent(0x50ffadca); - } - - @Override - public List getButtons(MenuAccess access) { - return List.of( - new HintButton(new TranslatableComponent("text.rei.input.methods.hint.configure"), bounds -> { - access.openOrClose(MENU_UUID, bounds.clone(), - () -> CraftableFilterButtonWidget.createInputMethodEntries(CraftableFilterButtonWidget.getApplicableInputMethods())); - }), - new HintButton(new TranslatableComponent("text.rei.input.methods.hint.ignore"), bounds -> { - ConfigManagerInternal.getInstance().set("functionality.inputMethod", new ResourceLocation("rei:default")); - }) - ); - } -} diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchBarHighlightWatcher.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchBarHighlightWatcher.java index 157c0b098..0d711ee4c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchBarHighlightWatcher.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/SearchBarHighlightWatcher.java @@ -26,9 +26,9 @@ import me.shedaniel.math.Color; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.gui.widgets.Tooltip; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.impl.client.gui.hints.HintProvider; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; -import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.TranslatableComponent; import org.jetbrains.annotations.Nullable; @@ -39,7 +39,7 @@ public class SearchBarHighlightWatcher implements HintProvider { @Override public List provide() { - return OverlaySearchField.isHighlighting ? Collections.singletonList(new TranslatableComponent("text.rei.inventory.highlighting.enabled")) : + return ScreenOverlay.getInstance().get().isHighlighting() ? Collections.singletonList(new TranslatableComponent("text.rei.inventory.highlighting.enabled")) : Collections.emptyList(); } diff --git a/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider index 5e8ecf8d2..a63183fb2 100644 --- a/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider +++ b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.client.gui.hints.HintProvider @@ -1,3 +1,2 @@ me.shedaniel.rei.plugin.client.runtime.PluginStageExecutionWatcher -me.shedaniel.rei.plugin.client.runtime.SearchBarHighlightWatcher -me.shedaniel.rei.plugin.client.runtime.InputMethodWatcher \ No newline at end of file +me.shedaniel.rei.plugin.client.runtime.SearchBarHighlightWatcher \ No newline at end of file From d70b8353a6db5fc5d835af5d662372952703d2fd Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 12 Sep 2022 23:05:35 +0800 Subject: [PATCH 17/20] Obfuscate REI Internals --- .../rei/api/client/overlay/ScreenOverlay.java | 17 ++ .../rei/impl/client/ClientInternals.java | 15 +- .../impl/client/provider/OverlayProvider.java | 23 +++ build.gradle | 160 ++++++++++++++++++ .../favorites/EntryStackFavoriteEntry.java | 23 +++ .../crafting/DefaultCraftingDisplay.java | 3 +- .../gui/credits/fabric/CreditsScreenImpl.java | 2 + .../fabric/DefaultCraftingDisplayImpl.java | 3 + fabric/src/main/resources/fabric.mod.json | 3 +- forge/build.gradle | 10 -- .../rei/forge/PluginDetectorImpl.java | 34 ++-- .../gui/credits/forge/CreditsScreenImpl.java | 2 + .../forge/DefaultCraftingDisplayImpl.java | 2 + gradle.properties | 2 +- .../client/gui/credits/CreditsScreen.java | 4 +- .../common/plugins/PluginManagerImpl.java | 4 +- .../common/plugins/PluginReloaderImpl.java | 18 +- .../favorites/FavoritesListWidgetImpl.java | 2 +- .../history/DisplayHistoryWidget.java | 59 ++++++- .../plugin/FavoritesEntriesBuiltinPlugin.java | 52 ++++++ .../entries/cache/CachedEntryListRender.java | 21 +++ .../entries/cache/CachingEntryRenderer.java | 1 - .../widgets/SearchFieldWidgetProvider.java | 23 +++ .../overlay/ScreenOverlayProviderImpl.java | 23 +++ .../provider/OverlayMenuEntryProvider.java | 23 +++ .../rei/RoughlyEnoughItemsCoreClient.java | 3 +- .../rei/impl/client/REIRuntimeImpl.java | 8 - .../runtime/DefaultClientRuntimePlugin.java | 12 -- ...l.rei.impl.ClientInternals$WidgetsProvider | 1 - settings.gradle | 3 - .../impl/client/util/InternalEntryBounds.java | 23 +++ 31 files changed, 507 insertions(+), 72 deletions(-) create mode 100644 runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/plugin/FavoritesEntriesBuiltinPlugin.java delete mode 100644 runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$WidgetsProvider diff --git a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java index 496fb72d9..55f63b1b7 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/overlay/ScreenOverlay.java @@ -143,6 +143,23 @@ public boolean isNotInExclusionZones(Rectangle bounds) { */ public abstract boolean isHighlighting(); + /** + * Submits a display to the overlay history. + * + * @param display the display to submit + * @param fromBounds the bounds of the display + * @return whether the display was submitted + */ @ApiStatus.Experimental public abstract boolean submitDisplayHistory(Display display, @Nullable Rectangle fromBounds); + + /** + * Renders the late widgets. + * + * @param matrices the matrices transform + * @param mouseX the x-coordinate of the mouse + * @param mouseY the y-coordinate of the mouse + * @param delta the tick delta + */ + public abstract void lateRender(PoseStack matrices, int mouseX, int mouseY, float delta); } diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java b/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java index 22c64a606..c2b2ad0ea 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/ClientInternals.java @@ -23,7 +23,6 @@ package me.shedaniel.rei.impl.client; -import com.google.common.base.Suppliers; import com.mojang.serialization.DataResult; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.ClientHelper; @@ -50,6 +49,7 @@ import org.jetbrains.annotations.Nullable; import java.lang.reflect.Field; +import java.lang.reflect.ParameterizedType; import java.util.Collection; import java.util.List; import java.util.function.*; @@ -94,7 +94,18 @@ private static T throwNotSetup() { @ApiStatus.Internal public static void attachInstance(T instance, Class clazz) { - attachInstanceSupplier(instance, clazz.getSimpleName()); + try { + for (Field field : ClientInternals.class.getDeclaredFields()) { + if (field.getGenericType() instanceof ParameterizedType && ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0] == clazz) { + field.setAccessible(true); + field.set(null, (Supplier) () -> instance); + return; + } + } + throw new RuntimeException("Failed to attach " + instance + " with field type: " + clazz); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } } @ApiStatus.Internal diff --git a/api/src/main/java/me/shedaniel/rei/impl/client/provider/OverlayProvider.java b/api/src/main/java/me/shedaniel/rei/impl/client/provider/OverlayProvider.java index c3688626a..4d06bd4bd 100644 --- a/api/src/main/java/me/shedaniel/rei/impl/client/provider/OverlayProvider.java +++ b/api/src/main/java/me/shedaniel/rei/impl/client/provider/OverlayProvider.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.provider; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; diff --git a/build.gradle b/build.gradle index 8dbc6a359..cf405fcd5 100755 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,16 @@ +//file:noinspection UnnecessaryQualifiedReference +buildscript { + repositories { + maven { url "https://maven.architectury.dev/" } + mavenCentral() + } + + dependencies { + classpath "com.guardsquare:proguard-gradle:7.2.1" + classpath "dev.architectury:architectury-transformer:5.2.68" + } +} + plugins { id("architectury-plugin") version("3.4-SNAPSHOT") id("dev.architectury.loom") version("0.12.0-SNAPSHOT") apply false @@ -198,6 +211,10 @@ subprojects { } } } + + sourcesJar { + duplicatesStrategy DuplicatesStrategy.WARN + } } depProjects.forEach { @@ -264,3 +281,146 @@ task releaseOnCf { dependsOn project("fabric").tasks.getByName("publishUnified") } } + +def randomString(len) { + def AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + def rnd = new java.security.SecureRandom() + return (0..len).toList().collect { AB.charAt(rnd.nextInt(AB.length())) }.join("") +} + +rootProject.file(".gradle/proguard-dictionary.txt").delete() +rootProject.file(".gradle/proguard-dictionary.txt").write((0..1000).toList().collect { randomString(10) }.join("\n")) + +["fabric", "forge"].each { loader -> + project(":$loader") { + afterEvaluate { + def proguardJarOut = file(tasks.getByName("shadowJar").archiveFile.get().getAsFile().absolutePath.replace(".jar", "-min.jar")) + + task proguardJar(type: proguard.gradle.ProGuardTask, dependsOn: ["shadowJar"]) { + doFirst { + if (proguardJarOut.exists()) { + proguardJarOut.delete() + } + } + + verbose() + injars tasks.getByName("shadowJar").archiveFile.get().getAsFile() + outjars proguardJarOut + libraryjars files(configurations.compileClasspath) + libraryjars "${System.getProperty('java.home')}/jmods/java.base.jmod", jarfilter: '!**.jar', filter: '!module-info.class' + dontshrink() + keep "class me.shedaniel.rei.api.** { *; }" + keep "class me.shedaniel.rei.plugin.** { *; }" + keepclassmembers "class * { void onInitialize(); void onInitializeClient(); }" + keepclassmembers "class * { @net.minecraft.obfuscate.DontObfuscate ; @net.minecraft.obfuscate.DontObfuscate ; }" + keepclassmembers "class me.shedaniel.rei.impl.*Internals { ; }" + keepclassmembers "class me.shedaniel.rei.impl.client.config.ConfigObjectImpl* { ; }" + dontwarn "me.shedaniel.rei.impl.init.RoughlyEnoughItemsInitializer" + dontwarn "me.shedaniel.rei.plugin.client.DefaultClientPlugin" + obfuscationdictionary rootProject.file(".gradle/proguard-dictionary.txt") + classobfuscationdictionary rootProject.file(".gradle/proguard-dictionary.txt") + repackageclasses "me.shedaniel.rei.impl.${randomString(10)}" + keep "class me.shedaniel.rei.mixin.$loader.** { *; }" + keepattributes "Signature,SourceFile,LineNumberTable,Exceptions,InnerClasses,*Annotation*" + printmapping file(".gradle/proguard-mapping.txt") + optimizationpasses 5 + optimizations "**" + allowaccessmodification() + + doLast { + try (def access = dev.architectury.transformer.input.OpenedFileAccess.ofJar(proguardJarOut.toPath())) { + dev.architectury.transformer.Transform.runTransformers( + new dev.architectury.transformer.transformers.base.edit.SimpleTransformerContext(args -> { throw new IllegalStateException(); }, + true, false, true), + dev.architectury.transformer.transformers.ClasspathProvider.of(files(configurations.compileClasspath).collect { it.toPath() }), + proguardJarOut.name, + access, transformers(loader)) + } + } + } + + tasks.prepareRemapJar { + inputFile.set proguardJarOut + dependsOn proguardJar + } + + tasks.remapJar { + input.set proguardJarOut + dependsOn proguardJar + } + } + } +} + +def transformers(loader) { + def map = new HashMap(); + file(".gradle/proguard-mapping.txt").eachLine { + if (!it.startsWith(" ")) { + map[it.split(" -> ")[0]] = it.split(" -> ")[1].split(":")[0] + } + } + return [new dev.architectury.transformer.transformers.base.ClassEditTransformer() { + @Override + dev.architectury.transformer.shadowed.impl.org.objectweb.asm.tree.ClassNode doEdit(String name, dev.architectury.transformer.shadowed.impl.org.objectweb.asm.tree.ClassNode node) { + if (dev.architectury.transformer.Transform.trimSlashes(name).startsWith("me/shedaniel/rei/impl")) { + if (node.invisibleAnnotations == null || !node.invisibleAnnotations.any { it.desc == "Lorg/jetbrains/annotations/ApiStatus\$Internal;" }) { + if (node.invisibleAnnotations == null) node.invisibleAnnotations = new ArrayList<>() + node.invisibleAnnotations.add(new dev.architectury.transformer.shadowed.impl.org.objectweb.asm.tree.AnnotationNode("Lorg/jetbrains/annotations/ApiStatus\$Internal;")) + } + } + + node.methods.forEach { method -> + method.instructions.forEach { insn -> + if (insn.opcode == dev.architectury.transformer.shadowed.impl.org.objectweb.asm.Opcodes.LDC + && insn instanceof dev.architectury.transformer.shadowed.impl.org.objectweb.asm.tree.LdcInsnNode + && insn.cst instanceof String) { + if (insn.cst.contains("%s")) { + def replaced = insn.cst.replace("%s", loader) + + if (map.containsKey(replaced)) { + insn.cst = map[replaced] + } + } else { + insn.cst = map.getOrDefault(insn.cst, insn.cst) + } + } + } + } + + return node + } + }, new dev.architectury.transformer.transformers.base.AssetEditTransformer() { + @Override + void doEdit(dev.architectury.transformer.transformers.base.edit.TransformerContext context, dev.architectury.transformer.input.FileAccess output) throws Exception { + def renames = [] + output.handle((java.util.function.Consumer) { String name -> + def trimmed = dev.architectury.transformer.Transform.trimSlashes(name) + if (trimmed.startsWith("META-INF/services/")) { + output.modifyFile(trimmed) { bytes -> + new String(bytes).split("\n").collect { map[it] ?: it }.join("\n").bytes + } + + def remapped = map[trimmed.substring("META-INF/services/".length())] + if (remapped != null) { + renames << [trimmed, "META-INF/services/$remapped"] + } + } + }) + renames.each { + output.addFile(it[1], output.getFile(it[0])) + output.deleteFile(it[0]) + } + + output.modifyFile("fabric.mod.json") { bytes -> + new String(bytes).split("\n").collect { + map.forEach { k, v -> + it = it.replace("\"$k\"", "\"$v\"") + it = it.replace("\"$k::onInitialize\"", "\"$v::onInitialize\"") + it = it.replace("\"$k::onInitializeClient\"", "\"$v::onInitializeClient\"") + } + it + }.join("\n").bytes + } + } + }] +} diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/EntryStackFavoriteEntry.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/EntryStackFavoriteEntry.java index ecd9e673e..885b1e18a 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/EntryStackFavoriteEntry.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/client/favorites/EntryStackFavoriteEntry.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.plugin.client.favorites; import com.mojang.serialization.DataResult; diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java index 84f4b50e1..8e897ef48 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/DefaultCraftingDisplay.java @@ -68,7 +68,8 @@ public DefaultCraftingDisplay(List inputs, List>> translators) { FabricLoader.getInstance().getModContainer("roughlyenoughitems").ifPresent(rei -> { try { diff --git a/fabric/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/fabric/DefaultCraftingDisplayImpl.java b/fabric/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/fabric/DefaultCraftingDisplayImpl.java index 60dff699b..06faa9f47 100644 --- a/fabric/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/fabric/DefaultCraftingDisplayImpl.java +++ b/fabric/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/fabric/DefaultCraftingDisplayImpl.java @@ -23,7 +23,10 @@ package me.shedaniel.rei.plugin.common.displays.crafting.fabric; +import net.minecraft.obfuscate.DontObfuscate; + public class DefaultCraftingDisplayImpl { + @DontObfuscate public static void registerPlatformSizeProvider() { } } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 251e4def4..f0a7e00e9 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -30,7 +30,8 @@ "me.shedaniel.rei.plugin.client.DefaultClientPlugin", "me.shedaniel.rei.plugin.client.runtime.DefaultClientRuntimePlugin", "me.shedaniel.rei.plugin.client.runtime.DefaultRuntimeInputMethodPlugin", - "me.shedaniel.rei.plugin.autocrafting.DefaultClientTransferCategoryPlugin" + "me.shedaniel.rei.plugin.autocrafting.DefaultClientTransferCategoryPlugin", + "me.shedaniel.rei.impl.client.gui.widget.plugin.FavoritesEntriesBuiltinPlugin" ] }, "accessWidener": "roughlyenoughitems.accessWidener", diff --git a/forge/build.gradle b/forge/build.gradle index b31fbb684..52e011454 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -56,12 +56,6 @@ loom { } forge { - localMods { - jeiInternalsWorkaround { - add(project(":jei-internals-workaround").sourceSets.main) - } - } - mixinConfig "rei.mixins.json" } } @@ -71,10 +65,6 @@ dependencies { modApi("me.shedaniel.cloth:cloth-config-forge:${cloth_config_version}") modApi("dev.architectury:architectury-forge:${architectury_version}") - common(project(path: ":jei-compatibility-layer", configuration: "namedElements")) { transitive false } - shadowCommon(project(path: ":jei-compatibility-layer", configuration: "namedElements")) { transitive false } - runtimeClasspath(project(path: ":jei-internals-workaround", configuration: "namedElements")) { transitive false } - depProjects.forEach { common(project(path: it, configuration: "namedElements")) { transitive false } shadowCommon(project(path: it, configuration: "transformProductionForge")) { transitive false } diff --git a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java index 7d026998d..21397c373 100644 --- a/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java +++ b/forge/src/main/java/me/shedaniel/rei/forge/PluginDetectorImpl.java @@ -29,11 +29,8 @@ import me.shedaniel.rei.api.common.plugins.PluginView; import me.shedaniel.rei.api.common.plugins.REIPluginProvider; import me.shedaniel.rei.api.common.plugins.REIServerPlugin; -import me.shedaniel.rei.impl.client.ClientInternals; +import me.shedaniel.rei.impl.client.gui.widget.plugin.FavoritesEntriesBuiltinPlugin; import me.shedaniel.rei.impl.init.PluginDetector; -import me.shedaniel.rei.jeicompat.JEIExtraClientPlugin; -import me.shedaniel.rei.jeicompat.JEIExtraPlugin; -import me.shedaniel.rei.jeicompat.JEIPluginDetector; import me.shedaniel.rei.plugin.autocrafting.DefaultClientTransferCategoryPlugin; import me.shedaniel.rei.plugin.client.forge.DefaultClientPluginImpl; import me.shedaniel.rei.plugin.client.runtime.DefaultClientRuntimePlugin; @@ -43,9 +40,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import org.apache.logging.log4j.util.TriConsumer; -import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -77,7 +72,7 @@ public String getPluginProviderName() { public void detectServerPlugins() { PluginView.getServerInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultPluginImpl())); PluginView.getServerInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultRuntimePlugin())); - PluginView.getServerInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new JEIExtraPlugin())); + // PluginView.getServerInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new JEIExtraPlugin())); AnnotationUtils.scanAnnotation(REIPlugin.class, REIServerPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { ((PluginView) PluginManager.getServerInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); }); @@ -99,21 +94,22 @@ public Supplier detectClientPlugins() { PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultClientRuntimePlugin())); PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultRuntimeInputMethodPlugin())); PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new DefaultClientTransferCategoryPlugin())); - PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new JEIExtraClientPlugin())); + PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new FavoritesEntriesBuiltinPlugin())); + // PluginView.getClientInstance().registerPlugin(wrapPlugin(Collections.singletonList("roughlyenoughitems"), new JEIExtraClientPlugin())); AnnotationUtils.scanAnnotation(REIPlugin.class, REIClientPlugin.class::isAssignableFrom, (modId, plugin, clazz) -> { ((PluginView) PluginManager.getClientInstance()).registerPlugin(wrapPlugin(modId, plugin.get())); }); - ClientInternals.attachInstance((Supplier>) () -> { - List modIds = new ArrayList<>(); - for (REIPluginProvider plugin : PluginManager.getClientInstance().getPluginProviders()) { - if (plugin instanceof JEIPluginDetector.JEIPluginProvider) { - modIds.addAll(((JEIPluginDetector.JEIPluginProvider) plugin).modIds); - } - } - return modIds; - }, "jeiCompatMods"); - JEIPluginDetector.detect((aClass, consumer) -> AnnotationUtils.scanAnnotation((Class) aClass, c -> true, - (TriConsumer, Supplier, Class>) (TriConsumer) consumer), PluginView.getClientInstance()::registerPlugin); +// ClientInternals.attachInstance((Supplier>) () -> { +// List modIds = new ArrayList<>(); +// for (REIPluginProvider plugin : PluginManager.getClientInstance().getPluginProviders()) { +// if (plugin instanceof JEIPluginDetector.JEIPluginProvider) { +// modIds.addAll(((JEIPluginDetector.JEIPluginProvider) plugin).modIds); +// } +// } +// return modIds; +// }, "jeiCompatMods"); +// JEIPluginDetector.detect((aClass, consumer) -> AnnotationUtils.scanAnnotation((Class) aClass, c -> true, +// (TriConsumer, Supplier, Class>) (TriConsumer) consumer), PluginView.getClientInstance()::registerPlugin); }; } } diff --git a/forge/src/main/java/me/shedaniel/rei/impl/client/gui/credits/forge/CreditsScreenImpl.java b/forge/src/main/java/me/shedaniel/rei/impl/client/gui/credits/forge/CreditsScreenImpl.java index ef53fe3b1..bbbb37bc1 100644 --- a/forge/src/main/java/me/shedaniel/rei/impl/client/gui/credits/forge/CreditsScreenImpl.java +++ b/forge/src/main/java/me/shedaniel/rei/impl/client/gui/credits/forge/CreditsScreenImpl.java @@ -24,11 +24,13 @@ package me.shedaniel.rei.impl.client.gui.credits.forge; import me.shedaniel.rei.impl.client.gui.credits.CreditsScreen; +import net.minecraft.obfuscate.DontObfuscate; import net.minecraft.util.Tuple; import java.util.List; public class CreditsScreenImpl { + @DontObfuscate public static void fillTranslators(Exception[] exception, List>> translators) { } } diff --git a/forge/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/forge/DefaultCraftingDisplayImpl.java b/forge/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/forge/DefaultCraftingDisplayImpl.java index 9f5faa713..b2debc199 100644 --- a/forge/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/forge/DefaultCraftingDisplayImpl.java +++ b/forge/src/main/java/me/shedaniel/rei/plugin/common/displays/crafting/forge/DefaultCraftingDisplayImpl.java @@ -25,9 +25,11 @@ import me.shedaniel.rei.plugin.common.displays.crafting.CraftingRecipeSizeProvider; import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCraftingDisplay; +import net.minecraft.obfuscate.DontObfuscate; import net.minecraftforge.common.crafting.IShapedRecipe; public class DefaultCraftingDisplayImpl { + @DontObfuscate public static void registerPlatformSizeProvider() { DefaultCraftingDisplay.registerSizeProvider(recipe -> { if (recipe instanceof IShapedRecipe) { diff --git a/gradle.properties b/gradle.properties index 92c5ff156..bae4eecc8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ org.gradle.java.home=C:\\Program Files\\OpenJDK\\jdk-17.0.2 -org.gradle.jvmargs=-Xmx10G +org.gradle.jvmargs=-Xmx14G base_version=8.4 unstable=false supported_version=1.18.2 diff --git a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java index 70834e457..379e6edc2 100644 --- a/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java +++ b/runtime-engine/configs/src/main/java/me/shedaniel/rei/impl/client/gui/credits/CreditsScreen.java @@ -36,7 +36,6 @@ import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.resources.language.I18n; -import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; @@ -135,7 +134,8 @@ public void init() { private static void fillTranslators(Exception[] exception, List>> translators) { try { - Class.forName("me.shedaniel.rei.impl.client.gui.credits.%s.CreditsScreenImpl".formatted(Platform.isForge() ? "forge" : "fabric")) + String s = "me.shedaniel.rei.impl.client.gui.credits.%s.CreditsScreenImpl"; + Class.forName(s.contains("%s") ? s.formatted(Platform.isForge() ? "forge" : "fabric") : s) .getDeclaredMethod("fillTranslators", Exception[].class, List.class) .invoke(null, exception, translators); } catch (IllegalAccessException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException e) { diff --git a/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java index 7544bdffd..cca94c79e 100644 --- a/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java +++ b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java @@ -41,6 +41,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.UnaryOperator; +import static me.shedaniel.rei.impl.common.plugins.PluginReloaderImpl.name; + @ApiStatus.Internal public class PluginManagerImpl

> implements PluginManager

, PluginView

{ private final List> reloadables = new ArrayList<>(); @@ -97,7 +99,7 @@ public PluginView

view() { @Override public void registerPlugin(REIPluginProvider plugin) { plugins.add((REIPluginProvider

) plugin); - InternalLogger.getInstance().info("Registered plugin provider %s for %s", plugin.getPluginProviderName(), PluginReloaderImpl.name(pluginClass)); + InternalLogger.getInstance().info("Registered plugin provider %s for %s", plugin.getPluginProviderName(), name(pluginClass)); } @Override diff --git a/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java index 312d4e7e4..693969a9e 100644 --- a/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java +++ b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginReloaderImpl.java @@ -283,9 +283,21 @@ public void startReload(PluginManager

manager, Class

pluginClass, List clazz) { - String simpleName = clazz.getSimpleName(); - if (simpleName.isEmpty()) return clazz.getName(); - return simpleName; + for (Class anInterface : clazz.getInterfaces()) { + if (!anInterface.getName().startsWith("me.shedaniel.rei.impl")) { + return _name(anInterface); + } + } + + return _name(clazz); + } + + static String _name(Class clazz) { + String name = clazz.getName(); + if (name.contains(".")) { + name = name.substring(name.lastIndexOf(".") + 1); + } + return name.replace('$', '.'); } public List getObservedStages() { diff --git a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java index 8a3dace66..ecc652dd1 100644 --- a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/FavoritesListWidgetImpl.java @@ -66,7 +66,7 @@ public class FavoritesListWidgetImpl extends WidgetWithBounds implements Favorit public Rectangle fullBounds; public Rectangle excludedBounds; public Rectangle favoritesBounds; - private EntryStacksRegionWidget region = new EntryStacksRegionWidget<>(new FavoritesRegionListener(this)); + private final EntryStacksRegionWidget region = new EntryStacksRegionWidget<>(new FavoritesRegionListener(this)); public final FavoritesPanel favoritePanel = new FavoritesPanel(this, region); public final TrashWidget trash = new TrashWidget(this); diff --git a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java index d67235f18..14523a20d 100644 --- a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/favorites/history/DisplayHistoryWidget.java @@ -40,10 +40,10 @@ import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponent; import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentProviderWidget; import me.shedaniel.rei.api.client.gui.drag.component.DraggableComponentVisitorWidget; +import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.WidgetWithBounds; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.impl.client.gui.widget.DisplayCompositeWidget; import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidgetImpl; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; @@ -297,7 +297,7 @@ public boolean mouseReleased(double mouseX, double mouseY, int button) { DisplayHistoryManager.INSTANCE.removeEntry(entry); scroll.setAs(scroll.target() - getBounds().getWidth()); scroll.setTo(scroll.target() + getBounds().getWidth(), 800); - DisplayCompositeWidget.DisplayDraggableComponent component = new DisplayCompositeWidget.DisplayDraggableComponent(Widgets.concat(entry.getWidgets()), entry.getDisplay(), + DisplayDraggableComponent component = new DisplayDraggableComponent(Widgets.concat(entry.getWidgets()), entry.getDisplay(), entry.getBounds().clone(), new Rectangle(0, 0, entry.getSize().width, entry.getSize().height)); DraggingContext.getInstance().renderToVoid(component); @@ -330,7 +330,7 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { DisplayHistoryManager.INSTANCE.removeEntry(entry); scroll.setAs(scroll.target() - getBounds().getWidth()); scroll.setTo(scroll.target() + getBounds().getWidth(), 800); - DisplayCompositeWidget.DisplayDraggableComponent component = new DisplayCompositeWidget.DisplayDraggableComponent(Widgets.concat(entry.getWidgets()), entry.getDisplay(), + DisplayDraggableComponent component = new DisplayDraggableComponent(Widgets.concat(entry.getWidgets()), entry.getDisplay(), entry.getBounds().clone(), new Rectangle(0, 0, entry.getSize().width, entry.getSize().height)); DraggingContext.getInstance().renderToVoid(component); @@ -380,7 +380,7 @@ public DraggableComponent getHovered(DraggingContext context, do } } - return (DraggableComponent) (DraggableComponent) new DisplayCompositeWidget.DisplayDraggableComponent(Widgets.concat(entry.getWidgets()), entry.getDisplay(), + return (DraggableComponent) (DraggableComponent) new DisplayDraggableComponent(Widgets.concat(entry.getWidgets()), entry.getDisplay(), entry.getBounds().clone(), new Rectangle(0, 0, entry.getSize().width, entry.getSize().height)) { @Override @@ -404,4 +404,55 @@ public void release(DraggedAcceptorResult result) { return null; } + + public static class DisplayDraggableComponent implements DraggableComponent { + private final Widget widget; + private final Display display; + private final Rectangle originBounds; + private final Rectangle bounds; + + public DisplayDraggableComponent(Widget widget, Display display, Rectangle originBounds, Rectangle bounds) { + this.widget = widget; + this.display = display; + this.originBounds = originBounds; + this.bounds = bounds; + } + + @Override + public int getWidth() { + return bounds.width; + } + + @Override + public int getHeight() { + return bounds.height; + } + + @Override + public Display get() { + return display; + } + + @Override + public void render(PoseStack matrices, Rectangle bounds, int mouseX, int mouseY, float delta) { + matrices.pushPose(); + matrices.translate(bounds.getX(), bounds.getY(), 0); + matrices.scale(bounds.width / (float) this.bounds.getWidth(), bounds.height / (float) this.bounds.getHeight(), 1); + matrices.translate(-this.bounds.getX(), -this.bounds.getY(), 0); + widget.render(matrices, -1000, -1000, delta); + matrices.popPose(); + } + + @Override + public void release(DraggedAcceptorResult result) { + if (result == DraggedAcceptorResult.PASS) { + DraggingContext.getInstance().renderBack(this, DraggingContext.getInstance().getCurrentBounds(), () -> originBounds); + } + } + + @Override + public Rectangle getOriginBounds(Point mouse) { + return originBounds.clone(); + } + } } diff --git a/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/plugin/FavoritesEntriesBuiltinPlugin.java b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/plugin/FavoritesEntriesBuiltinPlugin.java new file mode 100644 index 000000000..418d45d93 --- /dev/null +++ b/runtime-frontend/favorites-entries/src/main/java/me/shedaniel/rei/impl/client/gui/widget/plugin/FavoritesEntriesBuiltinPlugin.java @@ -0,0 +1,52 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.widget.plugin; + +import me.shedaniel.rei.api.client.overlay.OverlayListWidget; +import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.api.client.plugins.REIClientPlugin; +import me.shedaniel.rei.api.client.registry.screen.ExclusionZones; +import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; +import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidgetImpl; +import net.minecraft.client.gui.screens.Screen; + +import java.util.Collections; +import java.util.List; + +public class FavoritesEntriesBuiltinPlugin implements REIClientPlugin { + @Override + public void registerScreens(ScreenRegistry registry) { + ExclusionZones zones = registry.exclusionZones(); + zones.register(Screen.class, screen -> { + if (ScreenOverlay.getInstance().isEmpty()) return List.of(); + OverlayListWidget widget = ScreenOverlay.getInstance().get().getFavoritesList().orElse(null); + if (widget instanceof FavoritesListWidgetImpl impl) { + if (impl.togglePanelButton.isVisible()) { + return Collections.singletonList(impl.togglePanelButton.bounds); + } + } + return Collections.emptyList(); + }); + } +} diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachedEntryListRender.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachedEntryListRender.java index 6de0aa09e..a10a7c70e 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachedEntryListRender.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachedEntryListRender.java @@ -41,6 +41,9 @@ import me.shedaniel.rei.api.client.registry.entry.EntryRegistry; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; +import me.shedaniel.rei.api.common.plugins.PluginManager; +import me.shedaniel.rei.api.common.registry.ReloadStage; +import me.shedaniel.rei.api.common.registry.Reloadable; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.common.InternalLogger; import net.minecraft.client.Minecraft; @@ -66,6 +69,24 @@ public class CachedEntryListRender { .setShaderState(new RenderStateShard.ShaderStateShard(GameRenderer::getPositionTexShader)) .createCompositeState(false))); + static { + PluginManager.getInstance().registerReloadable(new Reloadable<>() { + @Override + public void startReload() { + startReload(null); + } + + @Override + public void startReload(ReloadStage stage) { + if (!RenderSystem.isOnRenderThread()) { + RenderSystem.recordRenderCall(CachedEntryListRender::refresh); + } else { + CachedEntryListRender.refresh(); + } + } + }); + } + public static class Sprite { public final float u0; public final float u1; diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachingEntryRenderer.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachingEntryRenderer.java index 76e299632..f29d78bdc 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachingEntryRenderer.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/cache/CachingEntryRenderer.java @@ -32,7 +32,6 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.gui.widgets.TooltipContext; import me.shedaniel.rei.api.common.entry.EntryStack; -import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; import net.minecraft.client.gui.GuiComponent; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.MultiBufferSource; diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java index 85d305568..2e0f1b848 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.overlay.widgets; import com.mojang.blaze3d.platform.Window; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayProviderImpl.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayProviderImpl.java index 0f7adad5e..e844ebafc 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayProviderImpl.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayProviderImpl.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.overlay; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java index 367f16c46..ae21ca415 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/menu/provider/OverlayMenuEntryProvider.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.gui.overlay.menu.provider; import me.shedaniel.rei.api.client.favorites.FavoriteMenuEntry; diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java index 50877066c..e0e68828a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java @@ -51,7 +51,6 @@ import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.client.REIRuntimeImpl; import me.shedaniel.rei.impl.client.gui.InternalCursorState; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.widget.CatchingExceptionUtils; import me.shedaniel.rei.impl.client.gui.widget.TooltipContextImpl; import me.shedaniel.rei.impl.client.gui.widget.TooltipImpl; @@ -292,7 +291,7 @@ && resetFocused(screen)) if (!(screen instanceof DisplayScreen)) { getOverlay().render(matrices, mouseX, mouseY, delta); } - ((ScreenOverlayImpl) getOverlay()).lateRender(matrices, mouseX, mouseY, delta); + getOverlay().lateRender(matrices, mouseX, mouseY, delta); resetFocused(screen); }); ClientScreenInputEvent.MOUSE_DRAGGED_PRE.register((minecraftClient, screen, mouseX1, mouseY1, button, mouseX2, mouseY2) -> { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java index d14d6a72b..7173da20c 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java @@ -24,7 +24,6 @@ package me.shedaniel.rei.impl.client; import com.mojang.blaze3d.platform.Window; -import com.mojang.blaze3d.systems.RenderSystem; import dev.architectury.event.EventResult; import dev.architectury.event.events.client.ClientGuiEvent; import dev.architectury.event.events.client.ClientTickEvent; @@ -39,8 +38,6 @@ import me.shedaniel.rei.api.common.registry.ReloadStage; import me.shedaniel.rei.impl.client.gui.DisplayScreenStack; import me.shedaniel.rei.impl.client.gui.InternalTextures; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; -import me.shedaniel.rei.impl.client.gui.widget.CachedEntryListRender; import me.shedaniel.rei.impl.client.provider.OverlayTicker; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; @@ -166,11 +163,6 @@ public void startReload(ReloadStage stage) { SearchProvider.getInstance().clearCache(); getOverlay().ifPresent(ScreenOverlay::queueReloadOverlay); DisplayScreenStack.clear(); - if (!RenderSystem.isOnRenderThread()) { - RenderSystem.recordRenderCall(CachedEntryListRender::refresh); - } else { - CachedEntryListRender.refresh(); - } } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java index b06294a6a..3a38adf77 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/runtime/DefaultClientRuntimePlugin.java @@ -27,12 +27,9 @@ import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.screen.ExclusionZones; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; -import me.shedaniel.rei.impl.client.gui.ScreenOverlayImpl; import me.shedaniel.rei.impl.client.gui.screen.DefaultDisplayViewingScreen; -import me.shedaniel.rei.impl.client.gui.widget.favorites.FavoritesListWidget; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.screens.Screen; import org.jetbrains.annotations.ApiStatus; import java.util.Collections; @@ -49,14 +46,5 @@ public void registerScreens(ScreenRegistry registry) { return Collections.emptyList(); return Collections.singletonList(widget.getBounds().clone()); }); - zones.register(Screen.class, screen -> { - FavoritesListWidget widget = ScreenOverlayImpl.getFavoritesListWidget(); - if (widget != null) { - if (widget.togglePanelButton.isVisible()) { - return Collections.singletonList(widget.togglePanelButton.bounds); - } - } - return Collections.emptyList(); - }); } } diff --git a/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$WidgetsProvider b/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$WidgetsProvider deleted file mode 100644 index 014b4a2f5..000000000 --- a/runtime/src/main/resources/META-INF/services/me.shedaniel.rei.impl.ClientInternals$WidgetsProvider +++ /dev/null @@ -1 +0,0 @@ -me.shedaniel.rei.impl.client.gui.widget.basewidgets.WidgetsProvider \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 415a48d16..6b4c06a65 100755 --- a/settings.gradle +++ b/settings.gradle @@ -41,6 +41,3 @@ include "runtime-frontend:favorites-entries" include "runtime" include "fabric" include "forge" - -include "jei-compatibility-layer" -include "jei-internals-workaround" diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/InternalEntryBounds.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/InternalEntryBounds.java index 30569d0a0..ca5d88e28 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/InternalEntryBounds.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/util/InternalEntryBounds.java @@ -1,3 +1,26 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.util; import me.shedaniel.rei.api.client.config.ConfigObject; From bb7920e447d599d23abfac3b67d8823cf24f8150 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Fri, 21 Oct 2022 23:53:12 +0800 Subject: [PATCH 18/20] Fix merge conflicts --- .../screen/AbstractDisplayViewingScreen.java | 8 +++----- .../gui/widget/AutoCraftingButtonWidget.java | 20 ++++++++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java index 66d297f1b..36b450751 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/AbstractDisplayViewingScreen.java @@ -49,9 +49,7 @@ import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.impl.client.ClientHelperImpl; -import me.shedaniel.rei.impl.client.REIRuntimeImpl; -import me.shedaniel.rei.impl.client.gui.widget.EntryWidget; -import me.shedaniel.rei.impl.client.gui.widget.entrylist.EntryListWidget; +import me.shedaniel.rei.impl.client.gui.DisplayScreenStack; import me.shedaniel.rei.impl.display.DisplaySpec; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -386,8 +384,8 @@ public boolean keyPressed(int keyCode, int scanCode, int modifiers) { if (super.keyPressed(keyCode, scanCode, modifiers) || (getOverlay().keyPressed(keyCode, scanCode, modifiers) && handleFocuses())) return true; if (ConfigObject.getInstance().getPreviousScreenKeybind().matchesKey(keyCode, scanCode)) { - if (REIRuntimeImpl.getInstance().hasLastDisplayScreen()) { - minecraft.setScreen(REIRuntimeImpl.getInstance().getLastDisplayScreen()); + if (DisplayScreenStack.hasLastDisplayScreen()) { + minecraft.setScreen(DisplayScreenStack.getLastDisplayScreen()); } else { minecraft.setScreen(REIRuntime.getInstance().getPreviousScreen()); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java index 9dc8675c7..cad46cbef 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/AutoCraftingButtonWidget.java @@ -23,6 +23,7 @@ package me.shedaniel.rei.impl.client.gui.widget; +import com.google.common.base.Suppliers; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; @@ -43,7 +44,9 @@ import java.util.Collection; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.function.Supplier; +import java.util.stream.Stream; public class AutoCraftingButtonWidget { public static Widget create(Rectangle displayBounds, Rectangle rectangle, Component text, @@ -57,13 +60,20 @@ public static Widget create(Rectangle displayBounds, Rectangle rectangle, Compon .get(); }); return new DelegateWidget(autoCraftingButton) { + final Supplier[] result = Stream.of(true, false).map( + bool -> Suppliers.memoizeWithExpiration( + () -> ClientInternals.getAutoCraftingEvaluator(displaySupplier.get()) + .buildRenderer() + .buildTooltipRenderer(bool) + .ids(idsSupplier == null ? null : idsSupplier.get()) + .get(), + 1000, TimeUnit.MILLISECONDS + ) + ).toArray(Supplier[]::new); + @Override public void render(PoseStack poses, int mouseX, int mouseY, float delta) { - AutoCraftingEvaluator.Result result = ClientInternals.getAutoCraftingEvaluator(displaySupplier.get()) - .buildRenderer() - .buildTooltipRenderer(autoCraftingButton.isFocused() || containsMouse(mouseX, mouseY)) - .ids(idsSupplier == null ? null : idsSupplier.get()) - .get(); + AutoCraftingEvaluator.Result result = this.result[(autoCraftingButton.isFocused() || containsMouse(mouseX, mouseY)) ? 1 : 0].get(); autoCraftingButton.setEnabled(result.isSuccessful()); autoCraftingButton.setTint(result.getTint()); From 0ef0f8b21df4b9a603aaa2ab4a35d395ef6437c1 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 22 Oct 2022 01:11:04 +0800 Subject: [PATCH 19/20] Make it not crash --- .../rei/api/client/ClientHelper.java | 4 +- .../api/common/networking/NetworkModule.java | 54 ++++++++ .../common/networking/NetworkModuleKey.java | 20 +-- .../common/networking/NetworkingHelper.java | 39 +++--- build.gradle | 1 + .../recipebook/DefaultRecipeBookHandler.java | 6 +- .../impl/common/init/CoreInitialization.java | 2 + ...etwork.java => TransferNetworkModule.java} | 27 +++- .../autocrafting/DefaultCategoryHandler.java | 19 +-- ...el.rei.api.common.networking.NetworkModule | 1 + .../modules/CheatItemStatusNetworkModule.java | 78 +++++++++++ .../modules/NotEnoughItemsNetworkModule.java | 111 ++++++++++++++++ .../networking/NetworkingHelperImpl.java | 89 +++++++++++++ .../modules/CheatItemGiveNetworkModule.java | 78 +++++++++++ .../modules/CheatItemGrabNetworkModule.java | 86 ++++++++++++ .../modules/CheatItemHotbarNetworkModule.java | 85 ++++++++++++ .../modules/DeleteItemNetworkModule.java | 76 +++++++++++ ...el.rei.api.common.networking.NetworkModule | 6 + ...rei.api.common.networking.NetworkingHelper | 1 + .../overlay/entries/EntryListWidgetImpl.java | 5 +- .../paginated/PaginatedEntryListWidget.java | 2 +- .../widgets/ConfigButtonWidgetProvider.java | 14 +- .../CraftableFilterButtonWidgetProvider.java | 11 +- .../widgets/SearchFieldWidgetProvider.java | 9 +- .../client/gui/overlay/ScreenOverlayImpl.java | 34 +++-- .../widgets/OverlayWidgetProvider.java | 11 +- .../shedaniel/rei/RoughlyEnoughItemsCore.java | 1 - .../rei/RoughlyEnoughItemsCoreClient.java | 49 ------- .../rei/RoughlyEnoughItemsNetwork.java | 124 ------------------ .../impl/client/ClientNetworkHelperImpl.java | 59 +++------ .../rei/impl/client/REIRuntimeImpl.java | 6 + .../gui/toast/CopyRecipeIdentifierToast.java | 6 +- .../toast/ExportRecipeIdentifierToast.java | 10 +- settings.gradle | 1 + .../rei/impl/client/gui/InternalTextures.java | 1 + 35 files changed, 801 insertions(+), 325 deletions(-) create mode 100644 api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkModule.java rename shared-internals/src/main/java/me/shedaniel/rei/impl/common/networking/NetworkModule.java => api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkModuleKey.java (71%) rename runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/{REITransferNetwork.java => TransferNetworkModule.java} (77%) create mode 100644 runtime-engine/menu-info/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.networking.NetworkModule create mode 100644 runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/client/networking/modules/CheatItemStatusNetworkModule.java create mode 100644 runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/client/networking/modules/NotEnoughItemsNetworkModule.java create mode 100644 runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/NetworkingHelperImpl.java create mode 100644 runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/CheatItemGiveNetworkModule.java create mode 100644 runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/CheatItemGrabNetworkModule.java create mode 100644 runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/CheatItemHotbarNetworkModule.java create mode 100644 runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/DeleteItemNetworkModule.java create mode 100644 runtime-engine/networking/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.networking.NetworkModule create mode 100644 runtime-engine/networking/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.networking.NetworkingHelper delete mode 100644 runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java diff --git a/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java b/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java index c044b583c..5eb95053b 100644 --- a/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java +++ b/api/src/main/java/me/shedaniel/rei/api/client/ClientHelper.java @@ -28,6 +28,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Tooltip; import me.shedaniel.rei.api.client.view.ViewSearchBuilder; import me.shedaniel.rei.api.common.entry.EntryStack; +import me.shedaniel.rei.api.common.networking.NetworkModule; import me.shedaniel.rei.api.common.networking.NetworkingHelper; import me.shedaniel.rei.api.common.util.FormattingUtils; import me.shedaniel.rei.impl.client.ClientInternals; @@ -207,7 +208,8 @@ default String getModFromIdentifier(ResourceLocation identifier) { * * @return whether the client can use move items packets */ + @Deprecated(forRemoval = true) default boolean canUseMovePackets() { - return NetworkingHelper.getInstance().client().canUseMovePackets(); + return NetworkingHelper.getInstance().canUse(NetworkModule.TRANSFER); } } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkModule.java b/api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkModule.java new file mode 100644 index 000000000..fd8e644d1 --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkModule.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 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.api.common.networking; + +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.util.Unit; +import net.minecraft.world.item.ItemStack; +import org.jetbrains.annotations.ApiStatus; + +import java.util.List; +import java.util.Map; + +@ApiStatus.Experimental +public interface NetworkModule { + NetworkModuleKey DELETE_ITEM = new NetworkModuleKey<>() {}; + NetworkModuleKey CHEAT_GIVE = new NetworkModuleKey<>() {}; + NetworkModuleKey> CHEAT_HOTBAR = new NetworkModuleKey<>() {}; + NetworkModuleKey CHEAT_GRAB = new NetworkModuleKey<>() {}; + NetworkModuleKey> CHEAT_STATUS_REPLY = new NetworkModuleKey<>() {}; + NetworkModuleKey>> NOT_ENOUGH_ITEMS = new NetworkModuleKey<>() {}; + NetworkModuleKey TRANSFER = new NetworkModuleKey<>() {}; + + NetworkModuleKey getKey(); + + boolean canUse(Object target); + + void onInitialize(); + + void send(Object target, T data); + + record TransferData(CategoryIdentifier categoryIdentifier, boolean stacked, CompoundTag displayTag) {} +} diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/common/networking/NetworkModule.java b/api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkModuleKey.java similarity index 71% rename from shared-internals/src/main/java/me/shedaniel/rei/impl/common/networking/NetworkModule.java rename to api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkModuleKey.java index 72ab29c8c..155aff65a 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/common/networking/NetworkModule.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkModuleKey.java @@ -21,23 +21,7 @@ * SOFTWARE. */ -package me.shedaniel.rei.impl.common.networking; +package me.shedaniel.rei.api.common.networking; -import org.jetbrains.annotations.ApiStatus; - -@ApiStatus.Internal -public interface NetworkModule { - Object DELETE = new Object(); - Object CREATE = new Object(); - Object CREATE_HOTBAR = new Object(); - Object CREATE_GRAB = new Object(); - Object CREATE_MSG = new Object(); - Object NOT_ENOUGH_ITEMS = new Object(); - Object TRANSFER = new Object(); - - Object getKey(); - - boolean canUse(); - - void onInitialize(); +public interface NetworkModuleKey { } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkingHelper.java b/api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkingHelper.java index ca1e2ad41..5c1b7e9b9 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkingHelper.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/networking/NetworkingHelper.java @@ -26,31 +26,38 @@ import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.plugins.REIServerPlugin; import me.shedaniel.rei.api.common.registry.Reloadable; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.server.level.ServerPlayer; + +import java.util.Objects; public interface NetworkingHelper extends Reloadable { static NetworkingHelper getInstance() { return PluginManager.getServerInstance().get(NetworkingHelper.class); } + boolean has(NetworkModuleKey moduleKey); + + boolean canUse(NetworkModuleKey moduleKey); + + boolean canPlayerUse(ServerPlayer player, NetworkModuleKey moduleKey); + + void send(Object target, NetworkModuleKey moduleKey, T data); + + default void sendToServer(NetworkModuleKey moduleKey, T data) { + send(null, moduleKey, data); + } + + default void sendToPlayer(ServerPlayer player, NetworkModuleKey moduleKey, T data) { + send(Objects.requireNonNull(player, "player"), moduleKey, data); + } + + @Environment(EnvType.CLIENT) Client client(); + @Environment(EnvType.CLIENT) interface Client { - boolean hasPermissionToUsePackets(); - boolean hasOperatorPermission(); - - /** - * Returns whether the client can use delete items packets. - * - * @return whether the client can use delete items packets - */ - boolean canUseDeletePackets(); - - /** - * Returns whether the client can use move items packets. - * - * @return whether the client can use move items packets - */ - boolean canUseMovePackets(); } } diff --git a/build.gradle b/build.gradle index cf405fcd5..501dcb541 100755 --- a/build.gradle +++ b/build.gradle @@ -47,6 +47,7 @@ allprojects { ":runtime-engine:views", ":runtime-engine:default-runtime-plugin", ":runtime-engine:initialization", + ":runtime-engine:networking", ":runtime-frontend:widgets", ":runtime-frontend:filtering", ":runtime-frontend:display", diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/recipebook/DefaultRecipeBookHandler.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/recipebook/DefaultRecipeBookHandler.java index f6d23677c..d4790e4b4 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/recipebook/DefaultRecipeBookHandler.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/autocrafting/recipebook/DefaultRecipeBookHandler.java @@ -23,15 +23,15 @@ package me.shedaniel.rei.plugin.autocrafting.recipebook; -import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.registry.transfer.TransferHandler; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay; +import me.shedaniel.rei.api.common.networking.NetworkModule; +import me.shedaniel.rei.api.common.networking.NetworkingHelper; import me.shedaniel.rei.plugin.common.displays.cooking.DefaultCookingDisplay; import me.shedaniel.rei.plugin.common.displays.crafting.DefaultCraftingDisplay; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.inventory.CraftingMenu; @@ -43,7 +43,7 @@ public class DefaultRecipeBookHandler implements TransferHandler { @Override public Result handle(Context context) { - if (context.getDisplay() instanceof SimpleGridMenuDisplay && ClientHelper.getInstance().canUseMovePackets()) + if (context.getDisplay() instanceof SimpleGridMenuDisplay && NetworkingHelper.getInstance().canUse(NetworkModule.TRANSFER)) return Result.createNotApplicable(); Display display = context.getDisplay(); if (!(context.getMenu() instanceof RecipeBookMenu container)) diff --git a/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java index 13a392e59..fc6304272 100644 --- a/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java +++ b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java @@ -32,6 +32,7 @@ import me.shedaniel.rei.api.common.entry.settings.EntrySettingsAdapterRegistry; import me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry; import me.shedaniel.rei.api.common.fluid.FluidSupportProvider; +import me.shedaniel.rei.api.common.networking.NetworkingHelper; import me.shedaniel.rei.api.common.plugins.PluginManager; import me.shedaniel.rei.api.common.plugins.REIPlugin; import me.shedaniel.rei.api.common.plugins.REIServerPlugin; @@ -70,6 +71,7 @@ public static void attachCommonInternals() { manager.registerReloadable(DisplaySerializerRegistry.class); manager.registerReloadable(FluidSupportProvider.class); PluginManager serverManager = PluginManager.getServerInstance(); + serverManager.registerReloadable(NetworkingHelper.class); serverManager.registerReloadable(MenuInfoRegistry.class); Internals.attachInstance((Runnable) () -> reloadPlugins(null, null), "reloadREI"); } diff --git a/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/REITransferNetwork.java b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/TransferNetworkModule.java similarity index 77% rename from runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/REITransferNetwork.java rename to runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/TransferNetworkModule.java index 357bddfa9..fe7cde2f7 100644 --- a/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/REITransferNetwork.java +++ b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/impl/common/transfer/TransferNetworkModule.java @@ -25,11 +25,14 @@ import dev.architectury.networking.NetworkManager; import dev.architectury.networking.transformers.SplitPacketTransformer; +import io.netty.buffer.Unpooled; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; -import me.shedaniel.rei.impl.common.networking.NetworkModule; +import me.shedaniel.rei.api.common.networking.NetworkModule; +import me.shedaniel.rei.api.common.networking.NetworkModuleKey; import net.minecraft.ChatFormatting; import net.minecraft.Util; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -39,22 +42,22 @@ import java.util.Collections; -public class REITransferNetwork implements NetworkModule { - public static final ResourceLocation MOVE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "move_items"); +public class TransferNetworkModule implements NetworkModule { + public static final ResourceLocation ID = new ResourceLocation("roughlyenoughitems", "move_items"); @Override - public Object getKey() { + public NetworkModuleKey getKey() { return NetworkModule.TRANSFER; } @Override - public boolean canUse() { - return NetworkManager.canServerReceive(REITransferNetwork.MOVE_ITEMS_PACKET); + public boolean canUse(Object target) { + return NetworkManager.canServerReceive(TransferNetworkModule.ID); } @Override public void onInitialize() { - NetworkManager.registerReceiver(NetworkManager.c2s(), MOVE_ITEMS_PACKET, Collections.singletonList(new SplitPacketTransformer()), (packetByteBuf, context) -> { + NetworkManager.registerReceiver(NetworkManager.c2s(), ID, Collections.singletonList(new SplitPacketTransformer()), (packetByteBuf, context) -> { ServerPlayer player = (ServerPlayer) context.getPlayer(); CategoryIdentifier category = CategoryIdentifier.of(packetByteBuf.readResourceLocation()); AbstractContainerMenu container = player.containerMenu; @@ -88,4 +91,14 @@ public void onInitialize() { } }); } + + @Override + public void send(Object target, TransferData data) { + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeResourceLocation(data.categoryIdentifier().getIdentifier()); + buf.writeBoolean(data.stacked()); + + buf.writeNbt(data.displayTag()); + NetworkManager.sendToServer(TransferNetworkModule.ID, buf); + } } diff --git a/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java index 096b36879..14f685906 100644 --- a/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java +++ b/runtime-engine/menu-info/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java @@ -23,17 +23,16 @@ package me.shedaniel.rei.plugin.autocrafting; -import dev.architectury.networking.NetworkManager; -import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntLinkedOpenHashSet; import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.ints.IntSet; -import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.registry.transfer.TransferHandler; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.entry.InputIngredient; +import me.shedaniel.rei.api.common.networking.NetworkModule; +import me.shedaniel.rei.api.common.networking.NetworkingHelper; import me.shedaniel.rei.api.common.transfer.RecipeFinder; import me.shedaniel.rei.api.common.transfer.info.MenuInfo; import me.shedaniel.rei.api.common.transfer.info.MenuInfoContext; @@ -41,13 +40,11 @@ import me.shedaniel.rei.api.common.transfer.info.MenuTransferException; import me.shedaniel.rei.api.common.util.CollectionUtils; import me.shedaniel.rei.api.common.util.EntryIngredients; -import me.shedaniel.rei.impl.common.transfer.REITransferNetwork; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -96,7 +93,7 @@ public Result handle(Context context) { }) .tooltipMissing(CollectionUtils.map(missing, ingredient -> EntryIngredients.ofItemStacks(ingredient.get()))); } - if (!ClientHelper.getInstance().canUseMovePackets()) { + if (!NetworkingHelper.getInstance().canUse(NetworkModule.TRANSFER)) { return Result.createFailed(new TranslatableComponent("error.rei.not.on.server")); } if (!context.isActuallyCrafting()) { @@ -107,12 +104,10 @@ public Result handle(Context context) { if (containerScreen instanceof RecipeUpdateListener listener) { listener.getRecipeBookComponent().ghostRecipe.clear(); } - FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); - buf.writeResourceLocation(display.getCategoryIdentifier().getIdentifier()); - buf.writeBoolean(context.isStackedCrafting()); - - buf.writeNbt(menuInfo.save(menuInfoContext, display)); - NetworkManager.sendToServer(REITransferNetwork.MOVE_ITEMS_PACKET, buf); + NetworkingHelper.getInstance().sendToServer(NetworkModule.TRANSFER, + new NetworkModule.TransferData(display.getCategoryIdentifier(), + context.isStackedCrafting(), + menuInfo.save(menuInfoContext, display))); return Result.createSuccessful(); } diff --git a/runtime-engine/menu-info/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.networking.NetworkModule b/runtime-engine/menu-info/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.networking.NetworkModule new file mode 100644 index 000000000..86049f550 --- /dev/null +++ b/runtime-engine/menu-info/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.networking.NetworkModule @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.transfer.TransferNetworkModule \ No newline at end of file diff --git a/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/client/networking/modules/CheatItemStatusNetworkModule.java b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/client/networking/modules/CheatItemStatusNetworkModule.java new file mode 100644 index 000000000..45c687cdf --- /dev/null +++ b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/client/networking/modules/CheatItemStatusNetworkModule.java @@ -0,0 +1,78 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.networking.modules; + +import dev.architectury.networking.NetworkManager; +import dev.architectury.networking.transformers.SplitPacketTransformer; +import dev.architectury.utils.Env; +import dev.architectury.utils.EnvExecutor; +import io.netty.buffer.Unpooled; +import me.shedaniel.rei.api.common.networking.NetworkModule; +import me.shedaniel.rei.api.common.networking.NetworkModuleKey; +import me.shedaniel.rei.api.common.util.EntryStacks; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.language.I18n; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; + +import java.util.Collections; +import java.util.Map; + +public class CheatItemStatusNetworkModule implements NetworkModule> { + public static final ResourceLocation ID = new ResourceLocation("roughlyenoughitems", "ci_msg"); + + @Override + public NetworkModuleKey> getKey() { + return NetworkModule.CHEAT_STATUS_REPLY; + } + + @Override + public boolean canUse(Object target) { + return NetworkManager.canPlayerReceive((ServerPlayer) target, CheatItemStatusNetworkModule.ID); + } + + @Override + public void onInitialize() { + EnvExecutor.runInEnv(Env.CLIENT, () -> () -> { + NetworkManager.registerReceiver(NetworkManager.c2s(), ID, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { + ItemStack stack = buf.readItem(); + String player = buf.readUtf(32767); + if (Minecraft.getInstance().player != null) { + Minecraft.getInstance().player.displayClientMessage(new TextComponent(I18n.get("text.rei.cheat_items").replaceAll("\\{item_name}", EntryStacks.of(stack.copy()).asFormattedText().getString()).replaceAll("\\{item_count}", stack.copy().getCount() + "").replaceAll("\\{player_name}", player)), false); + } + }); + }); + } + + @Override + public void send(Object target, Map.Entry data) { + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeItem(data.getKey().copy()); + buf.writeUtf(data.getValue(), 32767); + NetworkManager.sendToServer(CheatItemStatusNetworkModule.ID, buf); + } +} diff --git a/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/client/networking/modules/NotEnoughItemsNetworkModule.java b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/client/networking/modules/NotEnoughItemsNetworkModule.java new file mode 100644 index 000000000..c135eb921 --- /dev/null +++ b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/client/networking/modules/NotEnoughItemsNetworkModule.java @@ -0,0 +1,111 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.networking.modules; + +import com.google.common.collect.Lists; +import dev.architectury.networking.NetworkManager; +import dev.architectury.networking.transformers.SplitPacketTransformer; +import dev.architectury.utils.Env; +import dev.architectury.utils.EnvExecutor; +import io.netty.buffer.Unpooled; +import me.shedaniel.rei.api.common.networking.NetworkModule; +import me.shedaniel.rei.api.common.networking.NetworkModuleKey; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.screens.inventory.CraftingScreen; +import net.minecraft.client.gui.screens.recipebook.GhostRecipe; +import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.inventory.CraftingMenu; +import net.minecraft.world.inventory.Slot; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; +import net.minecraft.world.item.crafting.Ingredient; + +import java.util.Collections; +import java.util.List; + +public class NotEnoughItemsNetworkModule implements NetworkModule>> { + public static final ResourceLocation ID = new ResourceLocation("roughlyenoughitems", "og_not_enough"); + + @Override + public NetworkModuleKey>> getKey() { + return NetworkModule.NOT_ENOUGH_ITEMS; + } + + @Override + public boolean canUse(Object target) { + return NetworkManager.canPlayerReceive((ServerPlayer) target, NotEnoughItemsNetworkModule.ID); + } + + @Override + public void onInitialize() { + EnvExecutor.runInEnv(Env.CLIENT, () -> () -> { + NetworkManager.registerReceiver(NetworkManager.c2s(), ID, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { + Screen currentScreen = Minecraft.getInstance().screen; + if (currentScreen instanceof CraftingScreen craftingScreen) { + RecipeBookComponent recipeBookGui = craftingScreen.getRecipeBookComponent(); + GhostRecipe ghostSlots = recipeBookGui.ghostRecipe; + ghostSlots.clear(); + + List> input = Lists.newArrayList(); + int mapSize = buf.readInt(); + for (int i = 0; i < mapSize; i++) { + List list = Lists.newArrayList(); + int count = buf.readInt(); + for (int j = 0; j < count; j++) { + list.add(buf.readItem()); + } + input.add(list); + } + + ghostSlots.addIngredient(Ingredient.of(Items.STONE), 381203812, 12738291); + CraftingMenu container = craftingScreen.getMenu(); + for (int i = 0; i < input.size(); i++) { + List stacks = input.get(i); + if (!stacks.isEmpty()) { + Slot slot = container.getSlot(i + container.getResultSlotIndex() + 1); + ghostSlots.addIngredient(Ingredient.of(stacks.toArray(new ItemStack[0])), slot.x, slot.y); + } + } + } + }); + }); + } + + @Override + public void send(Object target, List> data) { + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeInt(data.size()); + for (List stacks : data) { + buf.writeInt(stacks.size()); + for (ItemStack stack : stacks) { + buf.writeItem(stack); + } + } + NetworkManager.sendToServer(NotEnoughItemsNetworkModule.ID, buf); + } +} diff --git a/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/NetworkingHelperImpl.java b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/NetworkingHelperImpl.java new file mode 100644 index 000000000..bb3e7a6fa --- /dev/null +++ b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/NetworkingHelperImpl.java @@ -0,0 +1,89 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.networking; + +import me.shedaniel.rei.api.common.networking.NetworkModule; +import me.shedaniel.rei.api.common.networking.NetworkModuleKey; +import me.shedaniel.rei.api.common.networking.NetworkingHelper; +import me.shedaniel.rei.impl.common.Internals; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.client.Minecraft; +import net.minecraft.server.level.ServerPlayer; + +import java.util.HashMap; +import java.util.Map; + +public class NetworkingHelperImpl implements NetworkingHelper { + private static final Map, NetworkModule> MODULES = new HashMap<>(); + + static { + for (NetworkModule module : Internals.resolveServices(NetworkModule.class)) { + MODULES.put(module.getKey(), module); + } + } + + @Override + public boolean has(NetworkModuleKey moduleKey) { + return MODULES.containsKey(moduleKey); + } + + @Override + public boolean canUse(NetworkModuleKey moduleKey) { + return has(moduleKey) && MODULES.get(moduleKey).canUse(null); + } + + @Override + public boolean canPlayerUse(ServerPlayer player, NetworkModuleKey moduleKey) { + return has(moduleKey) && MODULES.get(moduleKey).canUse(player); + } + + @Override + public void send(Object target, NetworkModuleKey moduleKey, T data) { + if (canUse(moduleKey)) { + ((NetworkModule) MODULES.get(moduleKey)).send(target, data); + } + } + + @SuppressWarnings("Convert2Lambda") + @Override + @Environment(EnvType.CLIENT) + public Client client() { + return new Client() { + @Environment(EnvType.CLIENT) + @Override + public boolean hasOperatorPermission() { + try { + return Minecraft.getInstance().getConnection().getSuggestionsProvider().hasPermission(1); + } catch (NullPointerException e) { + return true; + } + } + }; + } + + @Override + public void startReload() { + } +} diff --git a/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/CheatItemGiveNetworkModule.java b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/CheatItemGiveNetworkModule.java new file mode 100644 index 000000000..b503e7811 --- /dev/null +++ b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/CheatItemGiveNetworkModule.java @@ -0,0 +1,78 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.networking.modules; + +import dev.architectury.networking.NetworkManager; +import dev.architectury.networking.transformers.SplitPacketTransformer; +import io.netty.buffer.Unpooled; +import me.shedaniel.rei.api.common.networking.NetworkModule; +import me.shedaniel.rei.api.common.networking.NetworkModuleKey; +import me.shedaniel.rei.api.common.networking.NetworkingHelper; +import net.minecraft.ChatFormatting; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.item.ItemStack; + +import java.util.AbstractMap; +import java.util.Collections; + +public class CheatItemGiveNetworkModule implements NetworkModule { + public static final ResourceLocation ID = new ResourceLocation("roughlyenoughitems", "create_item"); + + @Override + public NetworkModuleKey getKey() { + return NetworkModule.CHEAT_GIVE; + } + + @Override + public boolean canUse(Object target) { + return NetworkManager.canServerReceive(CheatItemGiveNetworkModule.ID); + } + + @Override + public void onInitialize() { + NetworkManager.registerReceiver(NetworkManager.c2s(), ID, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { + player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); + return; + } + ItemStack stack = buf.readItem(); + if (player.getInventory().add(stack.copy())) { + NetworkingHelper.getInstance().sendToPlayer(player, NetworkModule.CHEAT_STATUS_REPLY, new AbstractMap.SimpleEntry<>(stack.copy(), player.getScoreboardName())); + } else { + player.displayClientMessage(new TranslatableComponent("text.rei.failed_cheat_items"), false); + } + }); + } + + @Override + public void send(Object target, ItemStack data) { + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeItem(data.copy()); + NetworkManager.sendToServer(CheatItemGiveNetworkModule.ID, buf); + } +} diff --git a/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/CheatItemGrabNetworkModule.java b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/CheatItemGrabNetworkModule.java new file mode 100644 index 000000000..0c76f1e14 --- /dev/null +++ b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/CheatItemGrabNetworkModule.java @@ -0,0 +1,86 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.networking.modules; + +import dev.architectury.networking.NetworkManager; +import dev.architectury.networking.transformers.SplitPacketTransformer; +import io.netty.buffer.Unpooled; +import me.shedaniel.rei.api.common.networking.NetworkModule; +import me.shedaniel.rei.api.common.networking.NetworkModuleKey; +import me.shedaniel.rei.api.common.networking.NetworkingHelper; +import net.minecraft.ChatFormatting; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Mth; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; + +import java.util.AbstractMap; +import java.util.Collections; + +public class CheatItemGrabNetworkModule implements NetworkModule { + public static final ResourceLocation ID = new ResourceLocation("roughlyenoughitems", "create_item_grab"); + + @Override + public NetworkModuleKey getKey() { + return NetworkModule.CHEAT_GRAB; + } + + @Override + public boolean canUse(Object target) { + return NetworkManager.canServerReceive(CheatItemGrabNetworkModule.ID); + } + + @Override + public void onInitialize() { + NetworkManager.registerReceiver(NetworkManager.c2s(), ID, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { + player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); + return; + } + + AbstractContainerMenu menu = player.containerMenu; + ItemStack itemStack = buf.readItem(); + ItemStack stack = itemStack.copy(); + if (!menu.getCarried().isEmpty() && ItemStack.isSameIgnoreDurability(menu.getCarried(), stack) && ItemStack.tagMatches(menu.getCarried(), stack)) { + stack.setCount(Mth.clamp(stack.getCount() + menu.getCarried().getCount(), 1, stack.getMaxStackSize())); + } else if (!menu.getCarried().isEmpty()) { + return; + } + menu.setCarried(stack.copy()); + menu.broadcastChanges(); + NetworkingHelper.getInstance().sendToPlayer(player, NetworkModule.CHEAT_STATUS_REPLY, new AbstractMap.SimpleEntry<>(stack.copy(), player.getScoreboardName())); + }); + } + + @Override + public void send(Object target, ItemStack data) { + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeItem(data.copy()); + NetworkManager.sendToServer(CheatItemGrabNetworkModule.ID, buf); + } +} diff --git a/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/CheatItemHotbarNetworkModule.java b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/CheatItemHotbarNetworkModule.java new file mode 100644 index 000000000..01c406901 --- /dev/null +++ b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/CheatItemHotbarNetworkModule.java @@ -0,0 +1,85 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.networking.modules; + +import dev.architectury.networking.NetworkManager; +import dev.architectury.networking.transformers.SplitPacketTransformer; +import io.netty.buffer.Unpooled; +import me.shedaniel.rei.api.common.networking.NetworkModule; +import me.shedaniel.rei.api.common.networking.NetworkModuleKey; +import me.shedaniel.rei.api.common.networking.NetworkingHelper; +import net.minecraft.ChatFormatting; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; + +import java.util.AbstractMap; +import java.util.Collections; +import java.util.Map; + +public class CheatItemHotbarNetworkModule implements NetworkModule> { + public static final ResourceLocation ID = new ResourceLocation("roughlyenoughitems", "create_item_hotbar"); + + @Override + public NetworkModuleKey> getKey() { + return NetworkModule.CHEAT_HOTBAR; + } + + @Override + public boolean canUse(Object target) { + return NetworkManager.canServerReceive(CheatItemHotbarNetworkModule.ID); + } + + @Override + public void onInitialize() { + NetworkManager.registerReceiver(NetworkManager.c2s(), ID, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { + player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); + return; + } + ItemStack stack = buf.readItem(); + int hotbarSlotId = buf.readVarInt(); + if (hotbarSlotId >= 0 && hotbarSlotId < 9) { + AbstractContainerMenu menu = player.containerMenu; + player.getInventory().items.set(hotbarSlotId, stack.copy()); + menu.broadcastChanges(); + NetworkingHelper.getInstance().sendToPlayer(player, NetworkModule.CHEAT_STATUS_REPLY, new AbstractMap.SimpleEntry<>(stack.copy(), player.getScoreboardName())); + } else { + player.displayClientMessage(new TranslatableComponent("text.rei.failed_cheat_items"), false); + } + }); + } + + @Override + public void send(Object target, Map.Entry data) { + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeItem(data.getKey().copy()); + buf.writeVarInt(data.getValue()); + NetworkManager.sendToServer(CheatItemHotbarNetworkModule.ID, buf); + } +} diff --git a/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/DeleteItemNetworkModule.java b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/DeleteItemNetworkModule.java new file mode 100644 index 000000000..af5c40889 --- /dev/null +++ b/runtime-engine/networking/src/main/java/me/shedaniel/rei/impl/common/networking/modules/DeleteItemNetworkModule.java @@ -0,0 +1,76 @@ +/* + * This file is licensed under the MIT License, part of Roughly Enough Items. + * Copyright (c) 2018, 2019, 2020, 2021, 2022 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.common.networking.modules; + +import dev.architectury.networking.NetworkManager; +import dev.architectury.networking.transformers.SplitPacketTransformer; +import io.netty.buffer.Unpooled; +import me.shedaniel.rei.api.common.networking.NetworkModule; +import me.shedaniel.rei.api.common.networking.NetworkModuleKey; +import net.minecraft.ChatFormatting; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.util.Unit; +import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.item.ItemStack; + +import java.util.Collections; + +public class DeleteItemNetworkModule implements NetworkModule { + public static final ResourceLocation ID = new ResourceLocation("roughlyenoughitems", "delete_item"); + + @Override + public NetworkModuleKey getKey() { + return NetworkModule.DELETE_ITEM; + } + + @Override + public boolean canUse(Object target) { + return NetworkManager.canServerReceive(DeleteItemNetworkModule.ID); + } + + @Override + public void onInitialize() { + NetworkManager.registerReceiver(NetworkManager.c2s(), ID, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { + player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); + return; + } + AbstractContainerMenu menu = player.containerMenu; + if (!menu.getCarried().isEmpty()) { + menu.setCarried(ItemStack.EMPTY); + menu.broadcastChanges(); + } + }); + } + + @Override + public void send(Object target, Unit data) { + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + NetworkManager.sendToServer(DeleteItemNetworkModule.ID, buf); + } +} diff --git a/runtime-engine/networking/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.networking.NetworkModule b/runtime-engine/networking/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.networking.NetworkModule new file mode 100644 index 000000000..df413c4d9 --- /dev/null +++ b/runtime-engine/networking/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.networking.NetworkModule @@ -0,0 +1,6 @@ +me.shedaniel.rei.impl.client.networking.modules.CheatItemStatusNetworkModule +me.shedaniel.rei.impl.client.networking.modules.NotEnoughItemsNetworkModule +me.shedaniel.rei.impl.common.networking.modules.CheatItemGiveNetworkModule +me.shedaniel.rei.impl.common.networking.modules.CheatItemGrabNetworkModule +me.shedaniel.rei.impl.common.networking.modules.CheatItemHotbarNetworkModule +me.shedaniel.rei.impl.common.networking.modules.DeleteItemNetworkModule \ No newline at end of file diff --git a/runtime-engine/networking/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.networking.NetworkingHelper b/runtime-engine/networking/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.networking.NetworkingHelper new file mode 100644 index 000000000..1020dd0a4 --- /dev/null +++ b/runtime-engine/networking/src/main/resources/META-INF/services/me.shedaniel.rei.api.common.networking.NetworkingHelper @@ -0,0 +1 @@ +me.shedaniel.rei.impl.common.networking.NetworkingHelperImpl \ No newline at end of file diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidgetImpl.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidgetImpl.java index c9c4b3d85..66b47ffdb 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidgetImpl.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/EntryListWidgetImpl.java @@ -44,6 +44,7 @@ import me.shedaniel.rei.api.client.search.SearchFilter; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; +import me.shedaniel.rei.api.common.networking.NetworkModule; import me.shedaniel.rei.api.common.networking.NetworkingHelper; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; @@ -165,7 +166,7 @@ public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { debugger.render(matrices, bounds.x, bounds.y, delta); - if (containsChecked(mouseX, mouseY, false) && ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && !minecraft.player.containerMenu.getCarried().isEmpty() && NetworkingHelper.getInstance().client().canUseDeletePackets()) { + if (containsChecked(mouseX, mouseY, false) && ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && !minecraft.player.containerMenu.getCarried().isEmpty() && (NetworkingHelper.getInstance().has(NetworkModule.DELETE_ITEM) || Minecraft.getInstance().gameMode.hasInfiniteItems())) { EntryStack stack = EntryStacks.of(minecraft.player.containerMenu.getCarried().copy()); if (stack.getType() != VanillaEntryTypes.ITEM) { EntryStack cheatsAs = stack.cheatsAs(); @@ -245,7 +246,7 @@ public boolean mouseClicked(double mouseX, double mouseY, int button) { public boolean mouseReleased(double mouseX, double mouseY, int button) { if (containsChecked(mouseX, mouseY, false)) { LocalPlayer player = minecraft.player; - if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && player != null && player.containerMenu != null && !player.containerMenu.getCarried().isEmpty() && NetworkingHelper.getInstance().client().canUseDeletePackets()) { + if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && player != null && player.containerMenu != null && !player.containerMenu.getCarried().isEmpty() && (NetworkingHelper.getInstance().has(NetworkModule.DELETE_ITEM) || Minecraft.getInstance().gameMode.hasInfiniteItems())) { EntryStack stack = EntryStacks.of(minecraft.player.containerMenu.getCarried().copy()); if (stack.getType() != VanillaEntryTypes.ITEM) { EntryStack cheatsAs = stack.cheatsAs(); diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/paginated/PaginatedEntryListWidget.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/paginated/PaginatedEntryListWidget.java index c00ed0d62..12516999d 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/paginated/PaginatedEntryListWidget.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/entries/paginated/PaginatedEntryListWidget.java @@ -240,7 +240,7 @@ public void init(ScreenOverlay overlay) { .containsMousePredicate((button, point) -> button.getBounds().contains(point) && overlay.isNotInExclusionZones(point.x, point.y)) .tooltipLine(new TranslatableComponent("text.rei.changelog.title")) .focusable(false);*/ - this.additionalWidgets.add(changelogButton); + // this.additionalWidgets.add(changelogButton); /*this.additionalWidgets.add(Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { helper.setBlitOffset(helper.getBlitOffset() + 1); RenderSystem.setShaderTexture(0, InternalTextures.CHEST_GUI_TEXTURE); diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java index eef3e2686..032b76d46 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/ConfigButtonWidgetProvider.java @@ -39,6 +39,7 @@ import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; +import me.shedaniel.rei.api.common.networking.NetworkModule; import me.shedaniel.rei.api.common.networking.NetworkingHelper; import me.shedaniel.rei.impl.client.config.ConfigManagerInternal; import me.shedaniel.rei.impl.client.gui.InternalTextures; @@ -52,17 +53,16 @@ import java.util.Collection; import java.util.List; import java.util.UUID; -import java.util.function.UnaryOperator; public class ConfigButtonWidgetProvider implements OverlayWidgetProvider { private static final UUID CONFIG_MENU_UUID = UUID.fromString("4357bc36-0a4e-47d2-8e07-ddc220df4a0f"); @Override - public List provide(ScreenOverlay overlay, MenuAccess access, TextFieldSink textFieldSink, UnaryOperator lateRenderable) { - return List.of(create(overlay, access, lateRenderable)); + public void provide(ScreenOverlay overlay, MenuAccess access, WidgetSink sink) { + sink.acceptLateRendered(create(overlay, access)); } - public static Widget create(ScreenOverlay overlay, MenuAccess access, UnaryOperator lateRenderable) { + public static Widget create(ScreenOverlay overlay, MenuAccess access) { Rectangle bounds = getConfigButtonBounds(); Button configButton = Widgets.createButton(bounds, NarratorChatListener.NO_TITLE) .onClick(button -> { @@ -74,7 +74,7 @@ public static Widget create(ScreenOverlay overlay, MenuAccess access, UnaryOpera }) .onRender((matrices, button) -> { if (ClientHelper.getInstance().isCheating() && !(Minecraft.getInstance().screen instanceof DisplayScreen) && NetworkingHelper.getInstance().client().hasOperatorPermission()) { - button.setTint(NetworkingHelper.getInstance().client().hasPermissionToUsePackets() ? 721354752 : 1476440063); + button.setTint(NetworkingHelper.getInstance().canUse(NetworkModule.CHEAT_GIVE) ? 721354752 : 1476440063); } else { button.removeTint(); } @@ -89,7 +89,7 @@ public static Widget create(ScreenOverlay overlay, MenuAccess access, UnaryOpera helper.blit(matrices, bounds.x + 3, bounds.y + 3, 0, 0, 14, 14); helper.setBlitOffset(helper.getBlitOffset() - 1); }); - return lateRenderable.apply(Widgets.concat(configButton, overlayWidget)); + return Widgets.concat(configButton, overlayWidget); } private static Collection menuEntries() { @@ -108,7 +108,7 @@ else if (!NetworkingHelper.getInstance().client().hasOperatorPermission()) { if (Minecraft.getInstance().gameMode.hasInfiniteItems()) return new TranslatableComponent("text.rei.cheating_limited_creative_enabled"); else return new TranslatableComponent("text.rei.cheating_enabled_no_perms"); - } else if (NetworkingHelper.getInstance().client().hasPermissionToUsePackets()) + } else if (NetworkingHelper.getInstance().canUse(NetworkModule.CHEAT_GIVE)) return new TranslatableComponent("text.rei.cheating_enabled"); else return new TranslatableComponent("text.rei.cheating_limited_enabled"); diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java index b470678b0..121c0e964 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/CraftableFilterButtonWidgetProvider.java @@ -51,21 +51,18 @@ import net.minecraft.world.level.block.Blocks; import java.util.*; -import java.util.function.UnaryOperator; public class CraftableFilterButtonWidgetProvider implements OverlayWidgetProvider { public static final UUID FILTER_MENU_UUID = UUID.fromString("2839e998-1679-4f9e-a257-37411d16f1e6"); @Override - public List provide(ScreenOverlay overlay, MenuAccess access, TextFieldSink textFieldSink, UnaryOperator lateRenderable) { + public void provide(ScreenOverlay overlay, MenuAccess access, WidgetSink sink) { if (ConfigObject.getInstance().isCraftableFilterEnabled()) { - return List.of(create(overlay, access, lateRenderable)); - } else { - return List.of(); + sink.acceptLateRendered(create(overlay, access)); } } - private static Widget create(ScreenOverlay overlay, MenuAccess access, UnaryOperator lateRenderable) { + private static Widget create(ScreenOverlay overlay, MenuAccess access) { Rectangle bounds = getCraftableFilterBounds(); ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); ItemStack icon = new ItemStack(Blocks.CRAFTING_TABLE); @@ -89,7 +86,7 @@ private static Widget create(ScreenOverlay overlay, MenuAccess access, UnaryOper itemRenderer.renderGuiItem(icon, (int) vector.x(), (int) vector.y()); itemRenderer.blitOffset = 0.0F; }); - return lateRenderable.apply(Widgets.concat(filterButton, overlayWidget)); + return Widgets.concat(filterButton, overlayWidget); } private static Collection menuEntries() { diff --git a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java index 2e0f1b848..c1197074e 100644 --- a/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java +++ b/runtime-frontend/overlay-entries/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/SearchFieldWidgetProvider.java @@ -27,28 +27,23 @@ import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.REIRuntime; import me.shedaniel.rei.api.client.config.ConfigObject; -import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.overlay.ScreenOverlay; import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.impl.client.gui.menu.MenuAccess; import me.shedaniel.rei.impl.client.gui.overlay.widgets.search.OverlaySearchField; import net.minecraft.client.Minecraft; -import java.util.List; -import java.util.function.UnaryOperator; - public class SearchFieldWidgetProvider implements OverlayWidgetProvider { private OverlaySearchField searchField; @Override - public List provide(ScreenOverlay overlay, MenuAccess access, TextFieldSink textFieldSink, UnaryOperator lateRenderable) { + public void provide(ScreenOverlay overlay, MenuAccess access, WidgetSink sink) { if (searchField == null) { searchField = new OverlaySearchField(access); } searchField.getBounds().setBounds(getSearchFieldArea(overlay)); - textFieldSink.accept(searchField, searchField::isHighlighting); - return List.of(lateRenderable.apply(searchField)); + sink.acceptTextField(searchField, searchField::isHighlighting); } private Rectangle getSearchFieldArea(ScreenOverlay overlay) { diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java index f4d8a1875..6245a1730 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/ScreenOverlayImpl.java @@ -55,10 +55,6 @@ public final class ScreenOverlayImpl extends AbstractScreenOverlay { private TextField searchField = null; private BooleanSupplier isHighlighted = null; - public ScreenOverlayImpl() { - this.init(); - } - @Override public void init() { super.init(); @@ -74,22 +70,36 @@ public void init() { EntryListWidget entryListWidget = getEntryList(); entryListWidget.initBounds(this.getBounds()); - entryListWidget.initSearch(searchField.getText(), true); this.children().add(entryListWidget.asWidget()); - searchField.setResponder(s -> entryListWidget.initSearch(s, false)); entryListWidget.init(this); for (OverlayWidgetProvider provider : OverlayWidgetProvider.PROVIDERS) { - provider.provide(this, menuAccess(), (textField, isHighlighted) -> { - this.searchField = textField; - this.isHighlighted = isHighlighted; - }, LateRenderableWidget::new); + provider.provide(this, menuAccess(), new OverlayWidgetProvider.WidgetSink() { + @Override + public void accept(Widget widget) { + ScreenOverlayImpl.this.children().add(widget); + } + + @Override + public void acceptLateRendered(Widget widget) { + accept(new LateRenderableWidget(widget)); + } + + @Override + public void acceptTextField(TextField textField, BooleanSupplier isHighlighted) { + ScreenOverlayImpl.this.searchField = textField; + ScreenOverlayImpl.this.isHighlighted = isHighlighted; + } + }); } if (this.searchField != null) { - this.children().add(this.searchField.asWidget()); + this.children().add(new LateRenderableWidget(this.searchField.asWidget())); + this.searchField.setResponder(s -> entryListWidget.initSearch(s, false)); + entryListWidget.initSearch(searchField.getText(), true); } else { InternalLogger.getInstance().warn("Search Field is not found! This might cause problems!"); + entryListWidget.initSearch("", true); } } @@ -143,7 +153,7 @@ public EntryListWidget getEntryList() { current = provider.getEntryList(); if (current != null) break; } - if (current != null) throw new IllegalStateException("No Entry List available!"); + if (current == null) throw new IllegalStateException("No Entry List available!"); if (current != entryListWidget) { entryListWidget = current; current.initBounds(Objects.requireNonNullElse(getBounds(), new Rectangle())); diff --git a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java index 3c19aa6b7..0c159ebb3 100644 --- a/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java +++ b/runtime-frontend/overlay/src/main/java/me/shedaniel/rei/impl/client/gui/overlay/widgets/OverlayWidgetProvider.java @@ -31,14 +31,17 @@ import java.util.List; import java.util.function.BooleanSupplier; -import java.util.function.UnaryOperator; public interface OverlayWidgetProvider { List PROVIDERS = ClientInternals.resolveServices(OverlayWidgetProvider.class); - List provide(ScreenOverlay overlay, MenuAccess access, TextFieldSink textFieldSink, UnaryOperator lateRenderable); + void provide(ScreenOverlay overlay, MenuAccess access, WidgetSink sink); - interface TextFieldSink { - void accept(TextField textField, BooleanSupplier isHighlighted); + interface WidgetSink { + void accept(Widget widget); + + void acceptLateRendered(Widget widget); + + void acceptTextField(TextField textField, BooleanSupplier isHighlighted); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index 018cd2eeb..4010edd6a 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -47,6 +47,5 @@ public void onInitialize() { detector.detectCommonPlugins(); detector.detectServerPlugins(); } - RoughlyEnoughItemsNetwork.onInitialize(); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java index e0e68828a..140b28eb6 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCoreClient.java @@ -28,7 +28,6 @@ import dev.architectury.event.EventResult; import dev.architectury.event.events.client.ClientGuiEvent; import dev.architectury.event.events.client.ClientScreenInputEvent; -import dev.architectury.networking.NetworkManager; import dev.architectury.platform.Platform; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.REIRuntime; @@ -46,7 +45,6 @@ import me.shedaniel.rei.api.client.registry.screen.ScreenRegistry; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.util.CollectionUtils; -import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.api.common.util.ImmutableTextComponent; import me.shedaniel.rei.impl.client.ClientInternals; import me.shedaniel.rei.impl.client.REIRuntimeImpl; @@ -63,21 +61,12 @@ 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.recipebook.GhostRecipe; import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; -import net.minecraft.client.resources.language.I18n; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.inventory.CraftingMenu; -import net.minecraft.world.inventory.Slot; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; import net.minecraft.world.item.TooltipFlag; -import net.minecraft.world.item.crafting.Ingredient; import org.apache.commons.lang3.function.TriFunction; import org.jetbrains.annotations.Nullable; @@ -165,44 +154,6 @@ public void onInitializeClient() { detector.detectClientPlugins().get().run(); } - Minecraft client = Minecraft.getInstance(); - NetworkManager.registerReceiver(NetworkManager.s2c(), RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, (buf, context) -> { - ItemStack stack = buf.readItem(); - String player = buf.readUtf(32767); - if (client.player != null) { - client.player.displayClientMessage(new TextComponent(I18n.get("text.rei.cheat_items").replaceAll("\\{item_name}", EntryStacks.of(stack.copy()).asFormattedText().getString()).replaceAll("\\{item_count}", stack.copy().getCount() + "").replaceAll("\\{player_name}", player)), false); - } - }); - NetworkManager.registerReceiver(NetworkManager.s2c(), RoughlyEnoughItemsNetwork.NOT_ENOUGH_ITEMS_PACKET, (buf, context) -> { - Screen currentScreen = Minecraft.getInstance().screen; - if (currentScreen instanceof CraftingScreen craftingScreen) { - RecipeBookComponent recipeBookGui = craftingScreen.getRecipeBookComponent(); - GhostRecipe ghostSlots = recipeBookGui.ghostRecipe; - ghostSlots.clear(); - - List> input = Lists.newArrayList(); - int mapSize = buf.readInt(); - for (int i = 0; i < mapSize; i++) { - List list = Lists.newArrayList(); - int count = buf.readInt(); - for (int j = 0; j < count; j++) { - list.add(buf.readItem()); - } - input.add(list); - } - - ghostSlots.addIngredient(Ingredient.of(Items.STONE), 381203812, 12738291); - CraftingMenu container = craftingScreen.getMenu(); - for (int i = 0; i < input.size(); i++) { - List stacks = input.get(i); - if (!stacks.isEmpty()) { - Slot slot = container.getSlot(i + container.getResultSlotIndex() + 1); - ghostSlots.addIngredient(Ingredient.of(stacks.toArray(new ItemStack[0])), slot.x, slot.y); - } - } - } - }); - Platform.getMod("roughlyenoughitems").registerConfigurationScreen(ConfigManager.getInstance()::getConfigScreen); } diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java deleted file mode 100644 index 037fa0fc9..000000000 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsNetwork.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * This file is licensed under the MIT License, part of Roughly Enough Items. - * Copyright (c) 2018, 2019, 2020, 2021, 2022 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; - -import dev.architectury.networking.NetworkManager; -import dev.architectury.networking.transformers.SplitPacketTransformer; -import io.netty.buffer.Unpooled; -import me.shedaniel.rei.impl.common.Internals; -import me.shedaniel.rei.impl.common.networking.NetworkModule; -import net.minecraft.ChatFormatting; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.network.chat.TranslatableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerPlayer; -import net.minecraft.util.Mth; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.item.ItemStack; - -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; - -public class RoughlyEnoughItemsNetwork { - private static final Map MODULES = new HashMap<>(); - public static final ResourceLocation DELETE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "delete_item"); - public static final ResourceLocation CREATE_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "create_item"); - public static final ResourceLocation CREATE_ITEMS_HOTBAR_PACKET = new ResourceLocation("roughlyenoughitems", "create_item_hotbar"); - public static final ResourceLocation CREATE_ITEMS_GRAB_PACKET = new ResourceLocation("roughlyenoughitems", "create_item_grab"); - public static final ResourceLocation CREATE_ITEMS_MESSAGE_PACKET = new ResourceLocation("roughlyenoughitems", "ci_msg"); - public static final ResourceLocation NOT_ENOUGH_ITEMS_PACKET = new ResourceLocation("roughlyenoughitems", "og_not_enough"); - - public static boolean canUse(Object key) { - return MODULES.containsKey(key) && MODULES.get(key).canUse(); - } - - public static void onInitialize() { - for (NetworkModule module : Internals.resolveServices(NetworkModule.class)) { - MODULES.put(module.getKey(), module); - } - - NetworkManager.registerReceiver(NetworkManager.c2s(), DELETE_ITEMS_PACKET, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { - player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); - return; - } - AbstractContainerMenu menu = player.containerMenu; - if (!menu.getCarried().isEmpty()) { - menu.setCarried(ItemStack.EMPTY); - menu.broadcastChanges(); - } - }); - NetworkManager.registerReceiver(NetworkManager.c2s(), CREATE_ITEMS_PACKET, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { - player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); - return; - } - ItemStack stack = buf.readItem(); - if (player.getInventory().add(stack.copy())) { - NetworkManager.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.copy()).writeUtf(player.getScoreboardName(), 32767)); - } else { - player.displayClientMessage(new TranslatableComponent("text.rei.failed_cheat_items"), false); - } - }); - NetworkManager.registerReceiver(NetworkManager.c2s(), CREATE_ITEMS_GRAB_PACKET, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { - player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); - return; - } - - AbstractContainerMenu menu = player.containerMenu; - ItemStack itemStack = buf.readItem(); - ItemStack stack = itemStack.copy(); - if (!menu.getCarried().isEmpty() && ItemStack.isSameIgnoreDurability(menu.getCarried(), stack) && ItemStack.tagMatches(menu.getCarried(), stack)) { - stack.setCount(Mth.clamp(stack.getCount() + menu.getCarried().getCount(), 1, stack.getMaxStackSize())); - } else if (!menu.getCarried().isEmpty()) { - return; - } - menu.setCarried(stack.copy()); - menu.broadcastChanges(); - NetworkManager.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(itemStack.copy()).writeUtf(player.getScoreboardName(), 32767)); - }); - NetworkManager.registerReceiver(NetworkManager.c2s(), CREATE_ITEMS_HOTBAR_PACKET, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> { - ServerPlayer player = (ServerPlayer) context.getPlayer(); - if (player.getServer().getProfilePermissions(player.getGameProfile()) < player.getServer().getOperatorUserPermissionLevel()) { - player.displayClientMessage(new TranslatableComponent("text.rei.no_permission_cheat").withStyle(ChatFormatting.RED), false); - return; - } - ItemStack stack = buf.readItem(); - int hotbarSlotId = buf.readVarInt(); - if (hotbarSlotId >= 0 && hotbarSlotId < 9) { - AbstractContainerMenu menu = player.containerMenu; - player.getInventory().items.set(hotbarSlotId, stack.copy()); - menu.broadcastChanges(); - NetworkManager.sendToPlayer(player, RoughlyEnoughItemsNetwork.CREATE_ITEMS_MESSAGE_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.copy()).writeUtf(player.getScoreboardName(), 32767)); - } else { - player.displayClientMessage(new TranslatableComponent("text.rei.failed_cheat_items"), false); - } - }); - } -} diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientNetworkHelperImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientNetworkHelperImpl.java index 746c29a06..e2a9e0cf3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientNetworkHelperImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/ClientNetworkHelperImpl.java @@ -23,55 +23,27 @@ package me.shedaniel.rei.impl.client; -import dev.architectury.networking.NetworkManager; -import io.netty.buffer.Unpooled; -import me.shedaniel.rei.RoughlyEnoughItemsNetwork; import me.shedaniel.rei.api.client.ClientHelper; import me.shedaniel.rei.api.client.config.ConfigObject; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; +import me.shedaniel.rei.api.common.networking.NetworkModule; +import me.shedaniel.rei.api.common.networking.NetworkModuleKey; +import me.shedaniel.rei.api.common.networking.NetworkingHelper; import me.shedaniel.rei.api.common.util.EntryStacks; -import me.shedaniel.rei.impl.common.networking.NetworkModule; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; import net.minecraft.client.gui.screens.inventory.CreativeModeInventoryScreen; -import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import net.minecraft.util.Unit; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; +import java.util.AbstractMap; + public abstract class ClientNetworkHelperImpl implements ClientHelper { - public boolean hasPermissionToUsePackets() { - try { - Minecraft.getInstance().getConnection().getSuggestionsProvider().hasPermission(0); - return hasOperatorPermission() && canUsePackets(); - } catch (NullPointerException e) { - return true; - } - } - - public boolean hasOperatorPermission() { - try { - return Minecraft.getInstance().getConnection().getSuggestionsProvider().hasPermission(1); - } catch (NullPointerException e) { - return true; - } - } - - public boolean canUsePackets() { - return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET) && NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET); - } - - public boolean canUseHotbarPackets() { - return NetworkManager.canServerReceive(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET); - } - - public boolean canUseDeletePackets() { - return hasPermissionToUsePackets() || Minecraft.getInstance().gameMode.hasInfiniteItems(); - } - @Override public void sendDeletePacket() { if (Minecraft.getInstance().screen instanceof CreativeModeInventoryScreen inventoryScreen) { @@ -79,7 +51,7 @@ public void sendDeletePacket() { inventoryScreen.isQuickCrafting = false; return; } - NetworkManager.sendToServer(RoughlyEnoughItemsNetwork.DELETE_ITEMS_PACKET, new FriendlyByteBuf(Unpooled.buffer())); + NetworkingHelper.getInstance().sendToServer(NetworkModule.DELETE_ITEM, Unit.INSTANCE); if (Minecraft.getInstance().screen instanceof AbstractContainerScreen containerScreen) { containerScreen.isQuickCrafting = false; } @@ -103,14 +75,18 @@ public boolean tryCheatingEntry(EntryStack e) { } menu.setCarried(stack.getValue().copy()); return true; - } else if (ClientHelperImpl.getInstance().canUsePackets()) { + } else if (NetworkingHelper.getInstance().canUse(NetworkModule.CHEAT_GIVE) + || NetworkingHelper.getInstance().canUse(NetworkModule.CHEAT_GRAB)) { AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; EntryStack stack = entry.copy(); if (!menu.getCarried().isEmpty() && !EntryStacks.equalsExact(EntryStacks.of(menu.getCarried()), stack)) { return false; } try { - NetworkManager.sendToServer(ConfigObject.getInstance().isGrabbingItems() ? RoughlyEnoughItemsNetwork.CREATE_ITEMS_GRAB_PACKET : RoughlyEnoughItemsNetwork.CREATE_ITEMS_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(cheatedStack)); + NetworkModuleKey key = ConfigObject.getInstance().isGrabbingItems() + && NetworkingHelper.getInstance().canUse(NetworkModule.CHEAT_GRAB) + ? NetworkModule.CHEAT_GRAB : NetworkModule.CHEAT_GIVE; + NetworkingHelper.getInstance().sendToServer(key, cheatedStack); return true; } catch (Exception exception) { return false; @@ -148,23 +124,18 @@ public boolean tryCheatingEntryTo(EntryStack e, int hotbarSlotId) { return true; } } - if (ClientHelperImpl.getInstance().canUseHotbarPackets()) { + if (NetworkingHelper.getInstance().canUse(NetworkModule.CHEAT_HOTBAR)) { AbstractContainerMenu menu = Minecraft.getInstance().player.containerMenu; EntryStack stack = entry.copy(); if (!menu.getCarried().isEmpty()) { return false; } try { - NetworkManager.sendToServer(RoughlyEnoughItemsNetwork.CREATE_ITEMS_HOTBAR_PACKET, new FriendlyByteBuf(Unpooled.buffer()).writeItem(stack.getValue().copy()).writeVarInt(hotbarSlotId)); + NetworkingHelper.getInstance().sendToServer(NetworkModule.CHEAT_HOTBAR, new AbstractMap.SimpleEntry<>(stack.getValue().copy(), hotbarSlotId)); return true; } catch (Exception exception) { return false; } } else return false; } - - @Override - public boolean canUseMovePackets() { - return RoughlyEnoughItemsNetwork.canUse(NetworkModule.TRANSFER); - } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java index 7173da20c..d577df670 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/REIRuntimeImpl.java @@ -48,6 +48,7 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; +import java.lang.reflect.InvocationTargetException; import java.util.Optional; import static me.shedaniel.rei.impl.client.util.InternalEntryBounds.entrySize; @@ -72,6 +73,11 @@ public static REIRuntimeImpl getInstance() { public Optional getOverlay(boolean reset, boolean init) { if ((overlay == null && init) || reset) { overlay = ClientInternals.getNewOverlay(); + try { + overlay.getClass().getMethod("init").invoke(overlay); + } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) { + throw new RuntimeException(e); + } overlay.getSearchField().setFocused(false); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/CopyRecipeIdentifierToast.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/CopyRecipeIdentifierToast.java index 4a8891696..8a7ab2163 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/CopyRecipeIdentifierToast.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/CopyRecipeIdentifierToast.java @@ -25,17 +25,15 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.rei.impl.client.gui.InternalTextures; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.toasts.Toast; import net.minecraft.client.gui.components.toasts.ToastComponent; -import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @ApiStatus.Internal public class CopyRecipeIdentifierToast implements Toast { - - protected static final ResourceLocation TEXTURE = new ResourceLocation("roughlyenoughitems", "textures/gui/toasts.png"); private String title; private String subtitle; private long startTime; @@ -51,7 +49,7 @@ public static void addToast(String title, @Nullable String subtitleNullable) { @Override public Visibility render(PoseStack matrices, ToastComponent toastManager, long var2) { - RenderSystem.setShaderTexture(0, TEXTURE); + RenderSystem.setShaderTexture(0, InternalTextures.TOASTS); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); toastManager.blit(matrices, 0, 0, 0, 0, 160, 32); if (this.subtitle == null) { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/ExportRecipeIdentifierToast.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/ExportRecipeIdentifierToast.java index cd763c1f3..ac622e849 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/ExportRecipeIdentifierToast.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/toast/ExportRecipeIdentifierToast.java @@ -25,19 +25,17 @@ import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; +import me.shedaniel.rei.impl.client.gui.InternalTextures; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.components.toasts.Toast; import net.minecraft.client.gui.components.toasts.ToastComponent; -import net.minecraft.resources.ResourceLocation; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @ApiStatus.Internal public class ExportRecipeIdentifierToast implements Toast { - - protected static final ResourceLocation TEXTURE = new ResourceLocation("roughlyenoughitems", "textures/gui/toasts.png"); - private String title; - private String subtitle; + private final String title; + private final String subtitle; private long startTime; public ExportRecipeIdentifierToast(String title, @Nullable String subtitleNullable) { @@ -51,7 +49,7 @@ public static void addToast(String title, @Nullable String subtitleNullable) { @Override public Visibility render(PoseStack matrices, ToastComponent toastManager, long var2) { - RenderSystem.setShaderTexture(0, TEXTURE); + RenderSystem.setShaderTexture(0, InternalTextures.TOASTS); RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, 1.0F); toastManager.blit(matrices, 0, 0, 0, 0, 160, 32); if (this.subtitle == null) { diff --git a/settings.gradle b/settings.gradle index 6b4c06a65..ddcbff822 100755 --- a/settings.gradle +++ b/settings.gradle @@ -31,6 +31,7 @@ include "runtime-engine:plugins" include "runtime-engine:views" include "runtime-engine:default-runtime-plugin" include "runtime-engine:initialization" +include "runtime-engine:networking" include "runtime-frontend" include "runtime-frontend:widgets" include "runtime-frontend:filtering" diff --git a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java index 24740427d..4ab5c6961 100644 --- a/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java +++ b/shared-internals/src/main/java/me/shedaniel/rei/impl/client/gui/InternalTextures.java @@ -34,4 +34,5 @@ public class InternalTextures { public static final ResourceLocation CHEST_GUI_TEXTURE_DARK = new ResourceLocation("roughlyenoughitems", "textures/gui/recipecontainer_dark.png"); public static final ResourceLocation DISPLAY_TEXTURE = new ResourceLocation("roughlyenoughitems", "textures/gui/display.png"); public static final ResourceLocation DISPLAY_TEXTURE_DARK = new ResourceLocation("roughlyenoughitems", "textures/gui/display_dark.png"); + public static final ResourceLocation TOASTS = new ResourceLocation("roughlyenoughitems", "textures/gui/toasts.png"); } From 9a6370e1cda521f1a4506727794546727a809bdf Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 7 Nov 2022 21:45:53 +0800 Subject: [PATCH 20/20] Merge commit '46d2c64c4303bc007055268075ea9be4e9852e5e' into modularity --- .../rei/impl/common/init/CoreInitialization.java | 2 ++ .../rei/impl/common/plugins/PluginManagerImpl.java | 12 +++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java index fc6304272..22cad60d2 100644 --- a/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java +++ b/runtime-engine/initialization/src/main/java/me/shedaniel/rei/impl/common/init/CoreInitialization.java @@ -42,6 +42,7 @@ import me.shedaniel.rei.impl.client.init.CoreClientInitialization; import me.shedaniel.rei.impl.common.InternalLogger; import me.shedaniel.rei.impl.common.Internals; +import net.minecraft.client.Minecraft; import net.minecraft.server.packs.PackType; import net.minecraft.util.Unit; import org.apache.commons.lang3.mutable.MutableLong; @@ -99,6 +100,7 @@ public static void _reloadPlugins(@Nullable ReloadStage stage) { } public static void reloadPlugins(MutableLong lastReload, @Nullable ReloadStage start) { + if (Minecraft.getInstance().level == null) return; if (lastReload != null) { if (lastReload.getValue() > 0 && System.currentTimeMillis() - lastReload.getValue() <= 5000) { InternalLogger.getInstance().warn("Suppressing Reload Plugins of stage " + start); diff --git a/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java index cca94c79e..39b1e5a10 100644 --- a/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java +++ b/runtime-engine/plugins/src/main/java/me/shedaniel/rei/impl/common/plugins/PluginManagerImpl.java @@ -149,7 +149,17 @@ public double getPriority() { } public String getPluginProviderName() { - return provider.getPluginProviderName(); + String providerName = provider.getPluginProviderName(); + + if (provider.provide().size() >= 1) { + String pluginName = plugin.getPluginProviderName(); + + if (!providerName.equals(pluginName)) { + providerName = pluginName + " of " + providerName; + } + } + + return providerName; } } }