From c80c345c4fa3def0536bcecbc2223f202af79415 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sun, 28 Mar 2021 01:44:38 +0800 Subject: Complete custom favorites Signed-off-by: shedaniel --- .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 105 +++++------- .../rei/impl/client/ClientHelperImpl.java | 8 +- .../rei/impl/client/config/ConfigManagerImpl.java | 182 +++++++++++++++------ .../impl/client/entry/filtering/FilteringRule.java | 8 +- .../entry/filtering/rules/ManualFilteringRule.java | 2 +- .../entry/filtering/rules/SearchFilteringRule.java | 2 +- .../entry/type/types/RenderingEntryDefinition.java | 3 +- .../favorites/FavoriteEntryTypeRegistryImpl.java | 3 +- .../impl/client/gui/ContainerScreenOverlay.java | 123 +++++++------- .../impl/client/gui/screen/TransformingScreen.java | 3 +- .../rei/impl/client/gui/widget/EntryWidget.java | 3 +- .../client/gui/widget/FavoritesListWidget.java | 82 ++++++---- .../entry/type/types/BuiltinEntryDefinition.java | 2 +- .../entry/type/types/EmptyEntryDefinition.java | 3 +- .../plugin/client/DefaultClientRuntimePlugin.java | 22 +-- .../plugin/client/entry/FluidEntryDefinition.java | 3 +- .../plugin/client/entry/ItemEntryDefinition.java | 3 +- 17 files changed, 332 insertions(+), 225 deletions(-) (limited to 'runtime/src/main/java/me/shedaniel') diff --git a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index f82444644..3f7e762a7 100644 --- a/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/runtime/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -24,15 +24,12 @@ package me.shedaniel.rei; import com.google.common.collect.Lists; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; import me.shedaniel.architectury.event.events.GuiEvent; import me.shedaniel.architectury.event.events.RecipeUpdateEvent; import me.shedaniel.architectury.event.events.client.ClientScreenInputEvent; import me.shedaniel.architectury.networking.NetworkManager; import me.shedaniel.architectury.platform.Platform; import me.shedaniel.architectury.utils.Env; -import me.shedaniel.architectury.utils.EnvExecutor; import me.shedaniel.math.Point; import me.shedaniel.rei.api.client.REIHelper; import me.shedaniel.rei.api.client.REIOverlay; @@ -102,10 +99,10 @@ import net.minecraft.client.gui.screens.recipebook.GhostRecipe; import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent; import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener; 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.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; import net.minecraft.util.Unit; import net.minecraft.world.InteractionResult; import net.minecraft.world.inventory.CraftingMenu; @@ -147,18 +144,6 @@ public class RoughlyEnoughItemsCore { public static void attachCommonInternals() { CategoryIdentifierImpl.attach(); - Internals.attachInstanceSupplier(new PluginManagerImpl<>( - REIPlugin.class, - UnaryOperator.identity(), - new EntryTypeRegistryImpl(), - new RecipeManagerContextImpl<>(RecipeManagerContextImpl.supplier()), - new ItemComparatorRegistryImpl(), - new DisplaySerializerRegistryImpl(), - new FluidSupportProviderImpl()), "commonPluginManager"); - Internals.attachInstanceSupplier(new PluginManagerImpl<>( - REIServerPlugin.class, - view -> view.then(PluginView.getInstance()), - new MenuInfoRegistryImpl()), "serverPluginManager"); Internals.attachInstance((Function>) new Function>() { ResourceLocation RENDERING_ID = new ResourceLocation("rendering"); private Map> typeCache = new ConcurrentHashMap<>(); @@ -222,35 +207,33 @@ public class RoughlyEnoughItemsCore { if (Objects.equals(definition.getType().getId(), BuiltinEntryTypes.EMPTY_ID)) { return empty().cast(); } - + return new TypedEntryStack<>(definition, value); } }, Internals.EntryStackProvider.class); Internals.attachInstance(new NbtHasherProviderImpl(), Internals.NbtHasherProvider.class); Internals.attachInstance(EntryIngredientImpl.provide(), Internals.EntryIngredientProvider.class); + Internals.attachInstanceSupplier(new PluginManagerImpl<>( + REIPlugin.class, + UnaryOperator.identity(), + new EntryTypeRegistryImpl(), + new RecipeManagerContextImpl<>(RecipeManagerContextImpl.supplier()), + new ItemComparatorRegistryImpl(), + new DisplaySerializerRegistryImpl(), + new FluidSupportProviderImpl()), "commonPluginManager"); + Internals.attachInstanceSupplier(new PluginManagerImpl<>( + REIServerPlugin.class, + view -> view.then(PluginView.getInstance()), + new MenuInfoRegistryImpl()), "serverPluginManager"); } @Environment(EnvType.CLIENT) public static void attachClientInternals() { - ClientInternals.attachInstanceSupplier(new PluginManagerImpl<>( - REIClientPlugin.class, - view -> view.then(PluginView.getInstance()), - new ViewsImpl(), - new SearchProviderImpl(), - new ConfigManagerImpl(), - new CategoryRegistryImpl(), - new DisplayRegistryImpl(), - new ScreenRegistryImpl(), - new EntryRegistryImpl(), - new FavoriteEntryTypeRegistryImpl(), - new SubsetsRegistryImpl(), - new TransferHandlerRegistryImpl(), - new REIHelperImpl()), "clientPluginManager"); InternalWidgets.attach(); ClientInternals.attachInstance((Supplier>) () -> EmptyEntryDefinition.EmptyRenderer.INSTANCE, "emptyEntryRenderer"); - ClientInternals.attachInstance((BiFunction, Supplier, FavoriteEntry>) (supplier, toJson) -> new FavoriteEntry() { + ClientInternals.attachInstance((BiFunction, Supplier, FavoriteEntry>) (supplier, toJson) -> new FavoriteEntry() { FavoriteEntry value = null; - + @Override public FavoriteEntry getUnwrapped() { if (this.value == null) { @@ -258,7 +241,7 @@ public class RoughlyEnoughItemsCore { } return Objects.requireNonNull(value).getUnwrapped(); } - + @Override public UUID getUuid() { return getUnwrapped().getUuid(); @@ -302,58 +285,60 @@ public class RoughlyEnoughItemsCore { public ResourceLocation getType() { return getUnwrapped().getType(); } - + @Override - public JsonObject toJson(JsonObject to) { + public CompoundTag save(CompoundTag tag) { if (toJson == null) { - return getUnwrapped().toJson(to); - } - - JsonObject object = toJson.get(); - for (Map.Entry entry : object.entrySet()) { - to.add(entry.getKey(), entry.getValue()); + return getUnwrapped().save(tag); } - return to; - } + return tag.merge(toJson.get()); + } + @Override public boolean isSame(FavoriteEntry other) { return getUnwrapped().isSame(other.getUnwrapped()); } }, "delegateFavoriteEntry"); - ClientInternals.attachInstance((Function) (object) -> { - String type = GsonHelper.getAsString(object, FavoriteEntry.TYPE_KEY); - switch (type) { - case "stack": - case "item": - case "fluid": - case "empty": - return FavoriteEntry.fromEntryStack(EntryStack.readFromJson(object)); - default: - ResourceLocation id = new ResourceLocation(type); - return Objects.requireNonNull(Objects.requireNonNull(FavoriteEntryType.registry().get(id)).fromJson(object)); - } + ClientInternals.attachInstance((Function) (object) -> { + String type = object.getString(FavoriteEntry.TYPE_KEY); + ResourceLocation id = new ResourceLocation(type); + return Objects.requireNonNull(Objects.requireNonNull(FavoriteEntryType.registry().get(id)).read(object)); }, "favoriteEntryFromJson"); ClientInternals.attachInstance((BiFunction<@Nullable Point, Collection, Tooltip>) QueuedTooltip::create, "tooltipProvider"); ClientInternals.attachInstance((Function<@Nullable Boolean, ClickArea.Result>) successful -> new ClickArea.Result() { private List> categories = Lists.newArrayList(); - + @Override public ClickArea.Result category(CategoryIdentifier category) { this.categories.add(category); return this; } - + @Override public boolean isSuccessful() { return successful; } - + @Override public Stream> getCategories() { return categories.stream(); } }, "clickAreaHandlerResult"); + ClientInternals.attachInstanceSupplier(new PluginManagerImpl<>( + REIClientPlugin.class, + view -> view.then(PluginView.getInstance()), + new ViewsImpl(), + new SearchProviderImpl(), + new ConfigManagerImpl(), + new CategoryRegistryImpl(), + new DisplayRegistryImpl(), + new ScreenRegistryImpl(), + new EntryRegistryImpl(), + new FavoriteEntryTypeRegistryImpl(), + new SubsetsRegistryImpl(), + new TransferHandlerRegistryImpl(), + new REIHelperImpl()), "clientPluginManager"); } @ApiStatus.Internal @@ -479,7 +464,7 @@ public class RoughlyEnoughItemsCore { if (shouldReturn(screen)) return InteractionResult.PASS; resetFocused(screen); - if (REIHelper.getInstance().isOverlayVisible() && REIHelper.getInstance().getOverlay().get().mouseClicked(mouseX, mouseY, button)) { + if (REIHelper.getInstance().getOverlay().get().mouseClicked(mouseX, mouseY, button)) { if (button == 0) { screen.setDragging(true); } 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 64700c4cd..0c18217cb 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 @@ -330,7 +330,8 @@ public class ClientHelperImpl implements ClientHelper { } @Override - public @Nullable CategoryIdentifier getPreferredOpenedCategory() { + @Nullable + public CategoryIdentifier getPreferredOpenedCategory() { return this.preferredOpenedCategory; } @@ -414,9 +415,10 @@ public class ClientHelperImpl implements ClientHelper { this.preferredOpenedCategory = category; return this; } - + @Override - public @Nullable CategoryIdentifier getPreferredOpenedCategory() { + @Nullable + public CategoryIdentifier getPreferredOpenedCategory() { return this.preferredOpenedCategory; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java index 4ce4c30f6..6a9feabe9 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/ConfigManagerImpl.java @@ -26,9 +26,9 @@ 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.google.gson.JsonElement; import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.mojang.math.Matrix4f; import me.shedaniel.architectury.hooks.ScreenHooks; import me.shedaniel.architectury.platform.Platform; @@ -42,7 +42,7 @@ import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.Jankson; import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.JsonNull; import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.JsonObject; import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.JsonPrimitive; -import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.api.SyntaxError; +import me.shedaniel.cloth.clothconfig.shadowed.blue.endless.jankson.api.DeserializationException; import me.shedaniel.clothconfig2.api.ConfigEntryBuilder; import me.shedaniel.clothconfig2.api.Modifier; import me.shedaniel.clothconfig2.api.ModifierKeyCode; @@ -76,6 +76,7 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.resources.language.I18n; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.nbt.TagParser; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; @@ -99,60 +100,13 @@ import static me.shedaniel.autoconfig.util.Utils.setUnsafely; @ApiStatus.Internal @Environment(EnvType.CLIENT) public class ConfigManagerImpl implements ConfigManager { - private boolean craftableOnly; + private boolean craftableOnly = false; private final Gson gson = new GsonBuilder().create(); private ConfigObjectImpl object; public ConfigManagerImpl() { - this.craftableOnly = false; Jankson jankson = Jankson.builder().build(); - AutoConfig.register(ConfigObjectImpl.class, (definition, configClass) -> new JanksonConfigSerializer<>(definition, configClass, Jankson.builder().registerPrimitiveTypeAdapter(InputConstants.Key.class, it -> { - return it instanceof String ? InputConstants.getKey((String) it) : null; - }).registerSerializer(InputConstants.Key.class, (it, marshaller) -> new JsonPrimitive(it.getName())).registerTypeAdapter(ModifierKeyCode.class, o -> { - String code = ((JsonPrimitive) o.get("keyCode")).asString(); - if (code.endsWith(".unknown")) return ModifierKeyCode.unknown(); - InputConstants.Key keyCode = InputConstants.getKey(code); - Modifier modifier = Modifier.of(((Number) ((JsonPrimitive) o.get("modifier")).getValue()).shortValue()); - return ModifierKeyCode.of(keyCode, modifier); - }).registerSerializer(ModifierKeyCode.class, (keyCode, marshaller) -> { - JsonObject object = new JsonObject(); - object.put("keyCode", new JsonPrimitive(keyCode.getKeyCode().getName())); - object.put("modifier", new JsonPrimitive(keyCode.getModifier().getValue())); - return object; - }).registerSerializer(EntryStack.class, (stack, marshaller) -> { - try { - return jankson.load(gson.toJson(stack.toJson())); - } catch (SyntaxError syntaxError) { - syntaxError.printStackTrace(); - return JsonNull.INSTANCE; - } - }).registerPrimitiveTypeAdapter(EntryStack.class, it -> { - return it instanceof String ? EntryStack.readFromJson(gson.fromJson((String) it, JsonElement.class)) : null; - }).registerTypeAdapter(EntryStack.class, it -> { - return EntryStack.readFromJson(gson.fromJson(it.toString(), JsonElement.class)); - }).registerSerializer(FavoriteEntry.class, (favoriteEntry, marshaller) -> { - try { - return jankson.load(favoriteEntry.toJson(new com.google.gson.JsonObject()).toString()); - } catch (SyntaxError syntaxError) { - syntaxError.printStackTrace(); - return JsonNull.INSTANCE; - } - }).registerTypeAdapter(FavoriteEntry.class, it -> { - com.google.gson.JsonObject object = gson.fromJson(it.toString(), com.google.gson.JsonObject.class); - return FavoriteEntry.delegate(() -> FavoriteEntry.fromJson(object), () -> object); - }).registerPrimitiveTypeAdapter(FavoriteEntry.class, it -> { - com.google.gson.JsonObject object = gson.fromJson(it.toString(), com.google.gson.JsonObject.class); - return FavoriteEntry.delegate(() -> FavoriteEntry.fromJson(object), () -> object); - }).registerSerializer(FilteringRule.class, (rule, marshaller) -> { - return new JsonPrimitive(FilteringRule.toTag(rule, new CompoundTag()).toString()); - }).registerPrimitiveTypeAdapter(FilteringRule.class, it -> { - try { - return it instanceof String ? FilteringRule.fromTag(TagParser.parseTag((String) it)) : null; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - }).build())); + AutoConfig.register(ConfigObjectImpl.class, (definition, configClass) -> new JanksonConfigSerializer<>(definition, configClass, buildJankson(Jankson.builder()))); GuiRegistry guiRegistry = AutoConfig.getGuiRegistry(ConfigObjectImpl.class); guiRegistry.registerPredicateProvider((i13n, field, config, defaults, guiProvider) -> { if (field.isAnnotationPresent(ConfigEntry.Gui.Excluded.class)) @@ -183,6 +137,127 @@ public class ConfigManagerImpl implements ConfigManager { RoughlyEnoughItemsCore.LOGGER.info("Config loaded."); } + private static Jankson buildJankson(Jankson.Builder builder) { + // InputConstants.Key + builder.registerSerializer(InputConstants.Key.class, (value, marshaller) -> { + return new JsonPrimitive(value.getName()); + }); + builder.registerDeserializer(String.class, InputConstants.Key.class, (value, marshaller) -> { + return InputConstants.getKey(value); + }); + + // ModifierKeyCode + builder.registerSerializer(ModifierKeyCode.class, (value, marshaller) -> { + JsonObject object = new JsonObject(); + object.put("keyCode", new JsonPrimitive(value.getKeyCode().getName())); + object.put("modifier", new JsonPrimitive(value.getModifier().getValue())); + return object; + }); + builder.registerDeserializer(JsonObject.class, ModifierKeyCode.class, (value, marshaller) -> { + String code = value.get(String.class, "keyCode"); + if (code.endsWith(".unknown")) { + return ModifierKeyCode.unknown(); + } else { + InputConstants.Key keyCode = InputConstants.getKey(code); + Modifier modifier = Modifier.of(value.getShort("modifier", (short) 0)); + return ModifierKeyCode.of(keyCode, modifier); + } + }); + + // Tag + builder.registerSerializer(Tag.class, (value, marshaller) -> { + return marshaller.serialize(value.toString()); + }); + builder.registerDeserializer(String.class, Tag.class, (value, marshaller) -> { + try { + return TagParser.parseTag(value); + } catch (CommandSyntaxException e) { + throw new DeserializationException(e); + } + }); + + // EntryStack + builder.registerSerializer(EntryStack.class, (stack, marshaller) -> { + try { + return marshaller.serialize(stack.save()); + } catch (Exception e) { + e.printStackTrace(); + return JsonNull.INSTANCE; + } + }); + builder.registerDeserializer(Tag.class, EntryStack.class, (value, marshaller) -> { + try { + return EntryStack.read((CompoundTag) value); + } catch (Exception e) { + e.printStackTrace(); + return EntryStack.empty(); + } + }); + builder.registerDeserializer(String.class, EntryStack.class, (value, marshaller) -> { + try { + return EntryStack.read(TagParser.parseTag(value)); + } catch (Exception e) { + e.printStackTrace(); + return EntryStack.empty(); + } + }); + + // 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 { + return marshaller.serialize(value.save(new CompoundTag())); + } catch (Exception e) { + e.printStackTrace(); + return JsonNull.INSTANCE; + } + }); + builder.registerDeserializer(Tag.class, FavoriteEntry.class, (value, marshaller) -> { + try { + return FavoriteEntry.delegate(() -> FavoriteEntry.read((CompoundTag) value), () -> (CompoundTag) value); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + }); + builder.registerDeserializer(String.class, FavoriteEntry.class, (value, marshaller) -> { + try { + CompoundTag tag = TagParser.parseTag(value); + return FavoriteEntry.delegate(() -> FavoriteEntry.read(tag), () -> tag); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + }); + + return builder.build(); + } + @Override public void startReload() { } @@ -193,8 +268,9 @@ public class ConfigManagerImpl implements ConfigManager { @Override public void saveConfig() { - if (getConfig().getFavoriteEntries() != null) + if (getConfig().getFavoriteEntries() != null) { getConfig().getFavoriteEntries().removeIf(Objects::isNull); + } if (getConfig().getFilteredStacks() != null) { getConfig().getFilteredStacks().removeIf(EntryStack::isEmpty); List> normalizedFilteredStacks = CollectionUtils.map(getConfig().getFilteredStacks(), EntryStack::normalize); @@ -204,11 +280,11 @@ public class ConfigManagerImpl implements ConfigManager { if (getConfig().getFilteringRules().stream().noneMatch(filteringRule -> filteringRule instanceof ManualFilteringRule)) { getConfig().getFilteringRules().add(new ManualFilteringRule()); } - AutoConfig.getConfigHolder(ConfigObjectImpl.class).save(); AutoConfig.getConfigHolder(ConfigObjectImpl.class).registerLoadListener((configHolder, configObject) -> { object = configObject; return InteractionResult.PASS; }); + AutoConfig.getConfigHolder(ConfigObjectImpl.class).save(); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java index a5098779a..dd8cd6340 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/FilteringRule.java @@ -56,17 +56,17 @@ public interface FilteringRule> { return registry; } - static CompoundTag toTag(FilteringRule rule, CompoundTag tag) { + static CompoundTag save(FilteringRule rule, CompoundTag tag) { tag.putString("id", REGISTRY.getKey(rule).toString()); - tag.put("rule", rule.toTag(new CompoundTag())); + tag.put("rule", rule.save(new CompoundTag())); return tag; } - static FilteringRule fromTag(CompoundTag tag) { + static FilteringRule read(CompoundTag tag) { return REGISTRY.get(ResourceLocation.tryParse(tag.getString("id"))).createFromTag(tag.getCompound("rule")); } - CompoundTag toTag(CompoundTag tag); + CompoundTag save(CompoundTag tag); T createFromTag(CompoundTag tag); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java index 5bcd19e2c..d5a2cfde3 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/ManualFilteringRule.java @@ -41,7 +41,7 @@ import java.util.stream.Collectors; public class ManualFilteringRule extends AbstractFilteringRule { @Override - public CompoundTag toTag(CompoundTag tag) { + public CompoundTag save(CompoundTag tag) { return tag; } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java index 3113cc79c..eeb494cea 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/entry/filtering/rules/SearchFilteringRule.java @@ -65,7 +65,7 @@ public class SearchFilteringRule extends AbstractFilteringRule entry, Point mouse) { + @Nullable + public Tooltip getTooltip(EntryStack entry, Point mouse) { return entry.getValue().getTooltip(mouse); } } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java index 759ff2ab9..41c308588 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/favorites/FavoriteEntryTypeRegistryImpl.java @@ -60,7 +60,8 @@ public class FavoriteEntryTypeRegistryImpl implements FavoriteEntryType.Registry } @Override - public @Nullable ResourceLocation getId(FavoriteEntryType type) { + @Nullable + public ResourceLocation getId(FavoriteEntryType type) { return this.registry.inverse().get(type); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java index 68d9a7782..ef88474a0 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/ContainerScreenOverlay.java @@ -23,7 +23,6 @@ package me.shedaniel.rei.impl.client.gui; -import com.google.common.collect.AbstractIterator; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; @@ -44,7 +43,10 @@ import me.shedaniel.rei.api.client.gui.config.SearchFieldLocation; import me.shedaniel.rei.api.client.gui.drag.DraggableStackProvider; import me.shedaniel.rei.api.client.gui.drag.DraggableStackVisitor; import me.shedaniel.rei.api.client.gui.drag.DraggingContext; -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.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.registry.category.CategoryRegistry; import me.shedaniel.rei.api.client.registry.screen.ClickArea; import me.shedaniel.rei.api.client.registry.screen.OverlayDecider; @@ -70,7 +72,6 @@ import me.shedaniel.rei.impl.client.gui.widget.search.OverlaySearchField; import me.shedaniel.rei.impl.common.util.Weather; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.chat.NarratorChatListener; -import net.minecraft.client.gui.components.events.ContainerEventHandler; import net.minecraft.client.gui.components.events.GuiEventListener; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen; @@ -109,6 +110,7 @@ public class ContainerScreenOverlay extends REIOverlay { private Rectangle bounds; private Window window; private Button leftButton, rightButton; + private Widget configButton; private CurrentDraggingStack draggingStack = new CurrentDraggingStack(); @Nullable @@ -171,6 +173,7 @@ public class ContainerScreenOverlay extends REIOverlay { public void openMenu(UUID uuid, Menu menu) { openMenu(uuid, menu, point -> false, point -> true); } + public void openMenu(UUID uuid, Menu menu, Predicate or, Predicate and) { this.overlayMenu = new OverlayMenu(uuid, menu, Widgets.withTranslate(menu, 0, 0, 400), or, and); } @@ -255,51 +258,53 @@ public class ContainerScreenOverlay extends REIOverlay { .tooltipLine(new TranslatableComponent("text.rei.next_page")) .focusable(false)); } - + final Rectangle configButtonArea = getConfigButtonArea(); - Widget tmp; - widgets.add(tmp = InternalWidgets.wrapLateRenderable(InternalWidgets.concatWidgets( - Widgets.createButton(configButtonArea, NarratorChatListener.NO_TITLE) - .onClick(button -> { - if (Screen.hasShiftDown() || Screen.hasControlDown()) { - ClientHelper.getInstance().setCheating(!ClientHelper.getInstance().isCheating()); - return; - } - ConfigManager.getInstance().openConfigScreen(REIHelper.getInstance().getPreviousScreen()); - }) - .onRender((matrices, button) -> { - if (ClientHelper.getInstance().isCheating() && ClientHelperImpl.getInstance().hasOperatorPermission()) { - button.setTint(ClientHelperImpl.getInstance().hasPermissionToUsePackets() ? 721354752 : 1476440063); - } else { - button.removeTint(); - } - }) - .focusable(false) - .containsMousePredicate((button, point) -> button.getBounds().contains(point) && isNotInExclusionZones(point.x, point.y)) - .tooltipSupplier(button -> { - List tooltips = new ArrayList<>(); - tooltips.add(new TranslatableComponent("text.rei.config_tooltip")); - tooltips.add(new ImmutableTextComponent(" ")); - if (!ClientHelper.getInstance().isCheating()) - tooltips.add(new TranslatableComponent("text.rei.cheating_disabled")); - else if (!ClientHelperImpl.getInstance().hasOperatorPermission()) { - if (minecraft.gameMode.hasInfiniteItems()) - tooltips.add(new TranslatableComponent("text.rei.cheating_limited_creative_enabled")); - else tooltips.add(new TranslatableComponent("text.rei.cheating_enabled_no_perms")); - } else if (ClientHelperImpl.getInstance().hasPermissionToUsePackets()) - tooltips.add(new TranslatableComponent("text.rei.cheating_enabled")); - else - tooltips.add(new TranslatableComponent("text.rei.cheating_limited_enabled")); - return tooltips.toArray(new Component[0]); - }), - Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { - helper.setBlitOffset(helper.getBlitOffset() + 1); - Minecraft.getInstance().getTextureManager().bind(CHEST_GUI_TEXTURE); - helper.blit(matrices, configButtonArea.x + 3, configButtonArea.y + 3, 0, 0, 14, 14); - }) + widgets.add(configButton = InternalWidgets.wrapLateRenderable( + Widgets.withTranslate( + InternalWidgets.concatWidgets( + Widgets.createButton(configButtonArea, NarratorChatListener.NO_TITLE) + .onClick(button -> { + if (Screen.hasShiftDown() || Screen.hasControlDown()) { + ClientHelper.getInstance().setCheating(!ClientHelper.getInstance().isCheating()); + return; + } + ConfigManager.getInstance().openConfigScreen(REIHelper.getInstance().getPreviousScreen()); + }) + .onRender((matrices, button) -> { + if (ClientHelper.getInstance().isCheating() && ClientHelperImpl.getInstance().hasOperatorPermission()) { + button.setTint(ClientHelperImpl.getInstance().hasPermissionToUsePackets() ? 721354752 : 1476440063); + } else { + button.removeTint(); + } + }) + .focusable(false) + .containsMousePredicate((button, point) -> button.getBounds().contains(point) && isNotInExclusionZones(point.x, point.y)) + .tooltipSupplier(button -> { + List tooltips = new ArrayList<>(); + tooltips.add(new TranslatableComponent("text.rei.config_tooltip")); + tooltips.add(new ImmutableTextComponent(" ")); + if (!ClientHelper.getInstance().isCheating()) + tooltips.add(new TranslatableComponent("text.rei.cheating_disabled")); + else if (!ClientHelperImpl.getInstance().hasOperatorPermission()) { + if (minecraft.gameMode.hasInfiniteItems()) + tooltips.add(new TranslatableComponent("text.rei.cheating_limited_creative_enabled")); + else tooltips.add(new TranslatableComponent("text.rei.cheating_enabled_no_perms")); + } else if (ClientHelperImpl.getInstance().hasPermissionToUsePackets()) + tooltips.add(new TranslatableComponent("text.rei.cheating_enabled")); + else + tooltips.add(new TranslatableComponent("text.rei.cheating_limited_enabled")); + return tooltips.toArray(new Component[0]); + }), + Widgets.createDrawableWidget((helper, matrices, mouseX, mouseY, delta) -> { + helper.setBlitOffset(helper.getBlitOffset() + 1); + Minecraft.getInstance().getTextureManager().bind(CHEST_GUI_TEXTURE); + helper.blit(matrices, configButtonArea.x + 3, configButtonArea.y + 3, 0, 0, 14, 14); + }) + ), + 0, 0, 600 ) )); - tmp.setZ(600); if (ConfigObject.getInstance().doesShowUtilsButtons()) { widgets.add(Widgets.createButton(ConfigObject.getInstance().isLowerConfigButton() ? new Rectangle(ConfigObject.getInstance().isLeftHandSidePanel() ? window.getGuiScaledWidth() - 30 : 10, 10, 20, 20) : new Rectangle(ConfigObject.getInstance().isLeftHandSidePanel() ? window.getGuiScaledWidth() - 55 : 35, 10, 20, 20), NarratorChatListener.NO_TITLE) .onRender((matrices, button) -> { @@ -375,7 +380,7 @@ public class ContainerScreenOverlay extends REIOverlay { Rectangle area = getCraftableToggleArea(); ItemRenderer itemRenderer = Minecraft.getInstance().getItemRenderer(); ItemStack icon = new ItemStack(Blocks.CRAFTING_TABLE); - this.widgets.add(tmp = InternalWidgets.wrapLateRenderable(InternalWidgets.concatWidgets( + this.widgets.add(Widgets.withTranslate(InternalWidgets.wrapLateRenderable(InternalWidgets.concatWidgets( Widgets.createButton(area, NarratorChatListener.NO_TITLE) .focusable(false) .onClick(button -> { @@ -392,8 +397,7 @@ public class ContainerScreenOverlay extends REIOverlay { itemRenderer.renderGuiItem(icon, (int) vector.x(), (int) vector.y()); itemRenderer.blitOffset = 0.0F; })) - )); - tmp.setZ(600); + ), 0, 0, 600)); } widgets.add(draggingStack); @@ -727,9 +731,16 @@ public class ContainerScreenOverlay extends REIOverlay { @Override public boolean mouseClicked(double mouseX, double mouseY, int button) { + boolean visible = REIHelper.getInstance().isOverlayVisible(); + if (visible && configButton.mouseClicked(mouseX, mouseY, button)) { + this.setFocused(configButton); + if (button == 0) + this.setDragging(true); + return true; + } if (ConfigObject.getInstance().getHideKeybind().matchesMouse(button)) { REIHelper.getInstance().toggleOverlayVisible(); - return true; + return REIHelper.getInstance().isOverlayVisible(); } EntryStack stack = ScreenRegistry.getInstance().getFocusedStack(Minecraft.getInstance().screen, PointHelper.ofMouse()); if (stack != null && !stack.isEmpty()) { @@ -738,7 +749,7 @@ public class ContainerScreenOverlay extends REIOverlay { return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addRecipesFor(stack).setOutputNotice(stack).fillPreferredOpenedCategory()); } else if (ConfigObject.getInstance().getUsageKeybind().matchesMouse(button)) { return ClientHelper.getInstance().openView(ViewSearchBuilder.builder().addUsagesFor(stack).setInputNotice(stack).fillPreferredOpenedCategory()); - } else if (ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { + } else if (visible && ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) { ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); @@ -750,9 +761,7 @@ public class ContainerScreenOverlay extends REIOverlay { return true; } } - if (!REIHelper.getInstance().isOverlayVisible()) - return false; - if (overlayMenu != null) { + if (visible && overlayMenu != null) { if (overlayMenu.wrappedMenu.mouseClicked(mouseX, mouseY, button)) { if (overlayMenu != null) this.setFocused(overlayMenu.wrappedMenu); else this.setFocused(null); @@ -782,8 +791,11 @@ public class ContainerScreenOverlay extends REIOverlay { return true; } } - for (GuiEventListener element : widgets) - if ((overlayMenu == null || element != overlayMenu.wrappedMenu) && element.mouseClicked(mouseX, mouseY, button)) { + if (!visible) { + return false; + } + for (GuiEventListener element : widgets) { + if (element != configButton && (overlayMenu == null || element != overlayMenu.wrappedMenu) && element.mouseClicked(mouseX, mouseY, button)) { this.setFocused(element); if (button == 0) this.setDragging(true); @@ -791,6 +803,7 @@ public class ContainerScreenOverlay extends REIOverlay { REIHelperImpl.getSearchField().setFocused(false); return true; } + } if (ConfigObject.getInstance().getFocusSearchFieldKeybind().matchesMouse(button)) { REIHelperImpl.getSearchField().setFocused(true); setFocused(REIHelperImpl.getSearchField()); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/TransformingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/TransformingScreen.java index 5c9bb0863..ee37c6305 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/TransformingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/TransformingScreen.java @@ -142,7 +142,8 @@ public class TransformingScreen extends DelegateScreen implements ScissorsScreen } @Override - public @Nullable Rectangle handleScissor(@Nullable Rectangle rectangle) { + @Nullable + public Rectangle handleScissor(@Nullable Rectangle rectangle) { if (renderingLastScreen == translatingLast && rectangle != null) rectangle.translate((int) xTransformer.getAsDouble(), (int) yTransformer.getAsDouble()); return rectangle; 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 ec4cb12e1..9cd39705e 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 @@ -320,7 +320,8 @@ public class EntryWidget extends Slot implements DraggableStackProvider { } @Override - public @Nullable Tooltip getCurrentTooltip(me.shedaniel.math.Point point) { + @Nullable + public Tooltip getCurrentTooltip(me.shedaniel.math.Point point) { return getCurrentEntry().getTooltip(point); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java index 7e85ff752..93013dab2 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/FavoritesListWidget.java @@ -191,10 +191,6 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt @Override public void drag() { - entries.remove(entry.hashIgnoreAmount()); - applyNewFavorites(entries.values().stream() - .map(Entry::getEntry) - .collect(Collectors.toList())); } @Override @@ -310,7 +306,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt newFavorites.removeIf(FavoriteEntry::isEntryInvalid); int entrySize = entrySize(); - IntSet newFavoritesHash = new IntOpenHashSet(CollectionUtils.mapToInt(newFavorites, FavoriteEntry::hashIgnoreAmount)); + IntSet newFavoritesHash = new IntOpenHashSet(CollectionUtils.mapToInt(newFavorites, FavoriteEntry::hashCode)); List removedEntries = Lists.newArrayList(this.entries.values()); removedEntries.removeIf(entry -> newFavoritesHash.contains(entry.hashIgnoreAmount())); @@ -323,7 +319,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt this.entries.clear(); for (FavoriteEntry favorite : newFavorites) { - Entry entry = prevEntries.get(favorite.hashIgnoreAmount()); + Entry entry = prevEntries.get(favorite.hashCode()); if (entry == null) { entry = new Entry(favorite, entrySize); @@ -565,7 +561,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt } public int hashIgnoreAmount() { - return entry.hashIgnoreAmount(); + return entry.hashCode(); } public FavoriteEntry getEntry() { @@ -803,9 +799,11 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt private final LazyResettable> rows = new LazyResettable<>(() -> { List rows = new ArrayList<>(); for (FavoriteEntryType.Section section : FavoriteEntryType.registry().sections()) { - rows.add(new SectionRow(section.getText().copy().withStyle(style -> style.withUnderlined(true)))); + rows.add(new SectionRow(section.getText(), section.getText().copy().withStyle(style -> style.withUnderlined(true)))); rows.add(new SectionEntriesRow(CollectionUtils.map(section.getEntries(), FavoriteEntry::copy))); + rows.add(new SectionSeparatorRow()); } + if (!rows.isEmpty()) rows.remove(rows.size() - 1); return rows; }); private final ScrollingContainer scroller = new ScrollingContainer() { @@ -839,18 +837,20 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt if (expendState.floatValue() > 0.1f) { ScissorsHandler.INSTANCE.scissor(scrollBounds); - int y = scrollBounds.y - (int) scroller.scrollAmount; + matrices.pushPose(); + matrices.translate(0, scroller.scrollAmount, 0); + int y = scrollBounds.y; for (Row row : rows.get()) { row.render(matrices, scrollBounds.x, y, scrollBounds.width, row.getRowHeight(), mouseX, mouseY, delta); y += row.getRowHeight(); } - scroller.renderScrollBar(0, 1, 1f); + matrices.popPose(); ScissorsHandler.INSTANCE.removeLastScissor(); } } private Rectangle updatePanelArea(Rectangle fullArea) { - int currentWidth = 16 + Math.round(Math.min(expendState.floatValue(), 1) * (fullArea.getWidth() - 16 - 12)); + int currentWidth = 16 + Math.round(Math.min(expendState.floatValue(), 1) * (fullArea.getWidth() - 16 - 8)); int currentHeight = 16 + Math.round(expendState.floatValue() * (fullArea.getHeight() * 0.4f - 16 - 8)); return new Rectangle(fullArea.x + 4, fullArea.getMaxY() - currentHeight - 4, currentWidth, currentHeight); } @@ -858,7 +858,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt @Override public boolean mouseScrolled(double d, double e, double f) { if (scrollBounds.contains(d, e)) { - scroller.offset(ClothConfigInitializer.getScrollStep() * -f, true); + scroller.offset(ClothConfigInitializer.getScrollStep() * f, true); return true; } return super.mouseScrolled(d, e, f); @@ -879,36 +879,58 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt public abstract void render(PoseStack matrices, int x, int y, int rowWidth, int rowHeight, int mouseX, int mouseY, float delta); } - + private static class SectionRow extends Row { - private final Component text; - - public SectionRow(Component text) { - this.text = text; + private final Component sectionText; + private final Component styledText; + + public SectionRow(Component sectionText, Component styledText) { + this.sectionText = sectionText; + this.styledText = styledText; } - + @Override public int getRowHeight() { return 11; } - + @Override public void render(PoseStack matrices, int x, int y, int rowWidth, int rowHeight, int mouseX, int mouseY, float delta) { - Minecraft.getInstance().font.draw(matrices, text, x, y + 1, 0xFFFFFFFF); + if (mouseX >= x && mouseY >= y && mouseX <= x + rowWidth && mouseY <= y + rowHeight) { + Tooltip.create(sectionText).queue(); + } + Minecraft.getInstance().font.draw(matrices, styledText, x, y + 1, 0xFFFFFFFF); } - + @Override public List children() { return Collections.emptyList(); } } + + private static class SectionSeparatorRow extends Row { + @Override + public int getRowHeight() { + return 5; + } + @Override + public void render(PoseStack matrices, int x, int y, int rowWidth, int rowHeight, int mouseX, int mouseY, float delta) { + fillGradient(matrices, x, y + 2, x + rowWidth, y + 3, -571806998, -571806998); + } + + @Override + public List children() { + return Collections.emptyList(); + } + } + private class SectionEntriesRow extends Row { private final List entries; private final List widgets; private int blockedCount; private int lastY; - + public SectionEntriesRow(List entries) { this.entries = entries; int entrySize = entrySize(); @@ -925,7 +947,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt @Override public int getRowHeight() { - return Mth.ceil((entries.size() + blockedCount) / (scrollBounds.width / (float) entrySize())) * entrySize() + 5; + return Mth.ceil((entries.size() + blockedCount) / (scrollBounds.width / (float) entrySize())) * entrySize(); } @Override @@ -980,11 +1002,13 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt this.getBounds().width = this.getBounds().height = (int) Math.round(this.size.doubleValue() / 100); double offsetSize = (entrySize() - this.size.doubleValue() / 100) / 2; this.getBounds().x = (int) Math.round(x.doubleValue() + offsetSize); - this.getBounds().y = (int) Math.round(y.doubleValue() + offsetSize) - (int) scroller.scrollAmount; + this.getBounds().y = (int) Math.round(y.doubleValue() + offsetSize) + lastY; } - + @Override - public @Nullable Tooltip getCurrentTooltip(Point point) { + @Nullable + public Tooltip getCurrentTooltip(Point point) { + if (!scrollBounds.contains(point)) return null; Tooltip tooltip = super.getCurrentTooltip(point); if (tooltip != null) { tooltip.getText().add(ImmutableTextComponent.EMPTY); @@ -1005,15 +1029,15 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt for (SectionFavoriteWidget widget : this.widgets) { while (true) { int xPos = currentX * entrySize + scrollBounds.x - 1; - int yPos = currentY * entrySize + lastY + (int) scroller.scrollAmount; + int yPos = currentY * entrySize; currentX++; if (currentX >= width) { currentX = 0; currentY++; } - - if (notSteppingOnExclusionZones(xPos, yPos, entrySize, entrySize, scrollBounds)) { + + if (notSteppingOnExclusionZones(xPos, yPos + lastY + (int) scroller.scrollAmount, entrySize, entrySize, scrollBounds)) { widget.moveTo(animated.test(widget), xPos, yPos); break; } else { diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java index 84eccfc5f..4cb06a9ea 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/BuiltinEntryDefinition.java @@ -96,7 +96,7 @@ public class BuiltinEntryDefinition implements EntryDefinition, EntrySeria @Override public int hash(EntryStack entry, T value, ComparisonContext context) { - return empty ? 0 : Objects.hashCode(value); + return empty ? 0 : Objects.hash(value.getClass().getName(), value); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java index 109d0b1a0..8c82b02d5 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/type/types/EmptyEntryDefinition.java @@ -48,7 +48,8 @@ public class EmptyEntryDefinition { } @Override - public @Nullable Tooltip getTooltip(EntryStack entry, Point mouse) { + @Nullable + public Tooltip getTooltip(EntryStack entry, Point mouse) { return null; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientRuntimePlugin.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientRuntimePlugin.java index 3fd7a13e1..d4049d2e4 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientRuntimePlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/DefaultClientRuntimePlugin.java @@ -23,7 +23,6 @@ package me.shedaniel.rei.plugin.client; -import com.google.gson.JsonObject; import com.mojang.blaze3d.vertex.PoseStack; import me.shedaniel.architectury.fluid.FluidStack; import me.shedaniel.math.Point; @@ -59,9 +58,9 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.screens.Screen; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.TextComponent; import net.minecraft.resources.ResourceLocation; -import net.minecraft.util.GsonHelper; import net.minecraft.world.InteractionResult; import net.minecraft.world.InteractionResultHolder; import net.minecraft.world.item.Item; @@ -104,9 +103,10 @@ public class DefaultClientRuntimePlugin implements REIClientPlugin { Minecraft.getInstance().getTextureManager().bind(id); innerBlit(matrices.last().pose(), bounds.x, bounds.getMaxX(), bounds.y, bounds.getMaxY(), getBlitOffset(), 0, 1, 0, 1); } - + @Override - public @Nullable Tooltip getTooltip(Point point) { + @Nullable + public Tooltip getTooltip(Point point) { return Tooltip.create(new TextComponent("Kirby"), ClientHelper.getInstance().getFormattedModFromModId("Dream Land")); } })); @@ -168,21 +168,21 @@ public class DefaultClientRuntimePlugin implements REIClientPlugin { EntryStackFavoriteType(ResourceLocation id) { this.id = id; } - + @Override - public EntryStackFavoriteEntry fromJson(JsonObject object) { - return new EntryStackFavoriteEntry(EntryStack.readFromJson(GsonHelper.getAsJsonObject(object, key))); + public EntryStackFavoriteEntry read(CompoundTag object) { + return new EntryStackFavoriteEntry(EntryStack.read(object.getCompound(key))); } @Override public EntryStackFavoriteEntry fromArgs(Object... args) { return new EntryStackFavoriteEntry((EntryStack) args[0]); } - + @Override - public JsonObject toJson(EntryStackFavoriteEntry entry, JsonObject object) { - object.add(key, entry.stack.toJson()); - return object; + public CompoundTag save(EntryStackFavoriteEntry entry, CompoundTag tag) { + tag.put(key, entry.stack.save()); + return tag; } } diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java index c1c2fdf1a..750dae613 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java @@ -194,7 +194,8 @@ public class FluidEntryDefinition implements EntryDefinition, EntryS } @Override - public @Nullable Tooltip getTooltip(EntryStack entry, Point mouse) { + @Nullable + public Tooltip getTooltip(EntryStack entry, Point mouse) { if (entry.isEmpty()) return null; List toolTip = Lists.newArrayList(entry.asFormattedText()); diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java index 13b09cf88..b1c854e4e 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/ItemEntryDefinition.java @@ -244,7 +244,8 @@ public class ItemEntryDefinition implements EntryDefinition, EntrySer } @Override - public @Nullable Tooltip getTooltip(EntryStack entry, Point mouse) { + @Nullable + public Tooltip getTooltip(EntryStack entry, Point mouse) { if (entry.isEmpty()) return null; return Tooltip.create(tryGetItemStackToolTip(entry, entry.getValue(), true)); -- cgit