diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-06-22 01:11:38 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-06-22 01:11:38 +0800 |
| commit | 0d1886cd3a85e7829646b666c36b35cf3321f1b0 (patch) | |
| tree | af34bc9109845fad52a25f2ec32fb4f1e1b8bb57 | |
| parent | 2cc2cfa70062efac58335d62ad8e47105c15fdd7 (diff) | |
| download | RoughlyEnoughItems-0d1886cd3a85e7829646b666c36b35cf3321f1b0.tar.gz RoughlyEnoughItems-0d1886cd3a85e7829646b666c36b35cf3321f1b0.tar.bz2 RoughlyEnoughItems-0d1886cd3a85e7829646b666c36b35cf3321f1b0.zip | |
Fix #559
8 files changed, 60 insertions, 21 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/entry/comparison/EntryComparatorRegistry.java b/api/src/main/java/me/shedaniel/rei/api/common/entry/comparison/EntryComparatorRegistry.java index ba77326e6..7c051bac1 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/entry/comparison/EntryComparatorRegistry.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/entry/comparison/EntryComparatorRegistry.java @@ -28,7 +28,9 @@ import me.shedaniel.rei.api.common.registry.Reloadable; /** * Registry for registering custom methods for identifying variants of {@link T}. - * The default comparator is {@link EntryComparator#noop()}, which does not compare the NBT of the entries. + * The default comparator is {@link EntryComparator#noop()} when fuzzy, which does not compare the NBT of the entries; + * and nbt when exact. + * * <p> * This comparator is used when the comparison context is {@link ComparisonContext#EXACT}. */ diff --git a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java index 902e51f76..807fec537 100644 --- a/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java +++ b/default-plugin/src/main/java/me/shedaniel/rei/plugin/common/DefaultPlugin.java @@ -51,10 +51,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.world.inventory.*; -import net.minecraft.world.item.BucketItem; -import net.minecraft.world.item.Item; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.Items; +import net.minecraft.world.item.*; import net.minecraft.world.level.material.Fluid; import org.jetbrains.annotations.ApiStatus; @@ -69,8 +66,13 @@ public class DefaultPlugin implements BuiltinPlugin, REIServerPlugin { Function<ItemStack, ListTag> enchantmentTag = stack -> { CompoundTag tag = stack.getTag(); if (tag == null) return null; - if (!tag.contains("Enchantments", NbtType.LIST)) return null; - return tag.getList("Enchantments", NbtType.COMPOUND); + if (!tag.contains(ItemStack.TAG_ENCH, NbtType.LIST)) { + if (tag.contains(EnchantedBookItem.TAG_STORED_ENCHANTMENTS, NbtType.LIST)) { + return tag.getList(EnchantedBookItem.TAG_STORED_ENCHANTMENTS, NbtType.COMPOUND); + } + return null; + } + return tag.getList(ItemStack.TAG_ENCH, NbtType.COMPOUND); }; registry.register((context, stack) -> nbtHasher.hash(context, enchantmentTag.apply(stack)), Items.ENCHANTED_BOOK); registry.registerNbt(Items.POTION); 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 fabe48aed..07dd71186 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 @@ -75,7 +75,6 @@ import net.minecraft.client.gui.chat.NarratorChatListener; 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.ClientTextTooltip; import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.PlayerInfo; @@ -83,10 +82,12 @@ import net.minecraft.client.renderer.entity.ItemRenderer; import net.minecraft.client.resources.language.I18n; import net.minecraft.client.resources.sounds.SimpleSoundInstance; import net.minecraft.locale.Language; -import net.minecraft.network.chat.*; +import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.Style; +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.FormattedCharSequence; import net.minecraft.world.InteractionResult; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; @@ -643,9 +644,8 @@ public class ScreenOverlayImpl extends ScreenOverlay { return ViewSearchBuilder.builder().addUsagesFor(stack).open(); } else if (ConfigObject.getInstance().getFavoriteKeyCode().matchesKey(keyCode, scanCode)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); - if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) { - ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); - } + ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); + ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); ConfigManager.getInstance().saveConfig(); FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); if (favoritesListWidget != null) @@ -704,9 +704,8 @@ public class ScreenOverlayImpl extends ScreenOverlay { return ViewSearchBuilder.builder().addUsagesFor(stack).open(); } else if (visible && ConfigObject.getInstance().getFavoriteKeyCode().matchesMouse(button)) { FavoriteEntry favoriteEntry = FavoriteEntry.fromEntryStack(stack); - if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) { - ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); - } + ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); + ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); ConfigManager.getInstance().saveConfig(); FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); if (favoritesListWidget != 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 659862c02..55bb8f98d 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 @@ -385,8 +385,10 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { FavoriteEntry favoriteEntry = asFavoriteEntry(); if (reverseFavoritesAction()) ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - else if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) + else { + ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); + } ConfigManager.getInstance().saveConfig(); FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); if (favoritesListWidget != null) @@ -432,8 +434,10 @@ public class EntryWidget extends Slot implements DraggableStackProviderWidget { FavoriteEntry favoriteEntry = asFavoriteEntry(); if (reverseFavoritesAction()) ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); - else if (!ConfigObject.getInstance().getFavoriteEntries().contains(favoriteEntry)) + else { + ConfigObject.getInstance().getFavoriteEntries().remove(favoriteEntry); ConfigObject.getInstance().getFavoriteEntries().add(favoriteEntry); + } ConfigManager.getInstance().saveConfig(); FavoritesListWidget favoritesListWidget = ScreenOverlayImpl.getFavoritesListWidget(); if (favoritesListWidget != null) 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 63ca1094e..e48af7699 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 @@ -461,7 +461,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt } double x = position.x - 8; - double y = position.y - 8; + double y = position.y + scrolling.scrollAmount - 8; return Mth.clamp(entriesPoints.stream() .filter(value -> { @@ -486,7 +486,7 @@ public class FavoritesListWidget extends WidgetWithBounds implements DraggableSt public void drop(Entry entry, DraggableStack stack, FavoriteEntry favoriteEntry) { DraggingContext<?> context = DraggingContext.getInstance(); double x = context.getCurrentPosition().x; - double y = context.getCurrentPosition().y; + double y = context.getCurrentPosition().y + scrolling.scrollAmount; entry.startedDraggingPosition = null; entry.x.setAs(x - 8); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java index b4c12be04..51d91cb14 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/EntryComparatorRegistryImpl.java @@ -53,13 +53,15 @@ public abstract class EntryComparatorRegistryImpl<T, S> implements EntryComparat public abstract S getEntry(T stack); + public abstract EntryComparator<T> defaultComparator(); + @Override public long hashOf(ComparisonContext context, T stack) { EntryComparator<T> comparator = comparators.get(getEntry(stack)); if (comparator != null) { return comparator.hash(context, stack); } - return 1; + return defaultComparator().hash(context, stack); } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/FluidComparatorRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/FluidComparatorRegistryImpl.java index fd394d04d..ab31dcbe1 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/FluidComparatorRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/FluidComparatorRegistryImpl.java @@ -24,17 +24,32 @@ package me.shedaniel.rei.impl.common.entry.comparison; import dev.architectury.fluid.FluidStack; +import me.shedaniel.rei.api.common.entry.comparison.EntryComparator; import me.shedaniel.rei.api.common.entry.comparison.FluidComparatorRegistry; import me.shedaniel.rei.api.common.plugins.REIPlugin; import net.minecraft.world.level.material.Fluid; public class FluidComparatorRegistryImpl extends EntryComparatorRegistryImpl<FluidStack, Fluid> implements FluidComparatorRegistry { + private final EntryComparator<FluidStack> fluidNbt = EntryComparator.fluidNbt(); + private final EntryComparator<FluidStack> defaultComparator = (context, stack) -> { + if (context.isExact()) { + return fluidNbt.hash(context, stack); + } else { + return 1; + } + }; + @Override public Fluid getEntry(FluidStack stack) { return stack.getFluid(); } @Override + public EntryComparator<FluidStack> defaultComparator() { + return defaultComparator; + } + + @Override public void acceptPlugin(REIPlugin<?> plugin) { plugin.registerFluidComparators(this); } diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java index e1c7b7a3b..08de7333f 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/common/entry/comparison/ItemComparatorRegistryImpl.java @@ -23,18 +23,33 @@ package me.shedaniel.rei.impl.common.entry.comparison; +import me.shedaniel.rei.api.common.entry.comparison.EntryComparator; import me.shedaniel.rei.api.common.entry.comparison.ItemComparatorRegistry; import me.shedaniel.rei.api.common.plugins.REIPlugin; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; public class ItemComparatorRegistryImpl extends EntryComparatorRegistryImpl<ItemStack, Item> implements ItemComparatorRegistry { + private final EntryComparator<ItemStack> itemNbt = EntryComparator.itemNbt(); + private final EntryComparator<ItemStack> defaultComparator = (context, stack) -> { + if (context.isExact()) { + return itemNbt.hash(context, stack); + } else { + return 1; + } + }; + @Override public Item getEntry(ItemStack stack) { return stack.getItem(); } @Override + public EntryComparator<ItemStack> defaultComparator() { + return defaultComparator; + } + + @Override public void acceptPlugin(REIPlugin<?> plugin) { plugin.registerItemComparators(this); } |
