From decaace84a6cbd518c6b9dd4597b5d4eaf98b78f Mon Sep 17 00:00:00 2001 From: LexManos Date: Thu, 1 Aug 2024 17:21:35 -0700 Subject: [PATCH] Fix custom creative tabs with search listing all items instead of just their own. --- .../CreativeModeInventoryScreen.java.patch | 2 +- .../multiplayer/SessionSearchTrees.java.patch | 26 +++++++++++-------- .../world/item/CreativeModeTab.java.patch | 4 +-- .../creativetabs/CreativeModeTabTest.java | 25 +++++++++++++++--- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch b/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch index 296d1d7be2..4a8347aeb6 100644 --- a/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch +++ b/patches/minecraft/net/minecraft/client/gui/screens/inventory/CreativeModeInventoryScreen.java.patch @@ -176,7 +176,7 @@ boolean flag = this.hoveredSlot != null && this.hoveredSlot instanceof CreativeModeInventoryScreen.CustomCreativeSlot; boolean flag1 = selectedTab.getType() == CreativeModeTab.Type.CATEGORY; - boolean flag2 = selectedTab.getType() == CreativeModeTab.Type.SEARCH; -+ boolean flag2 =selectedTab.hasSearchBar(); ++ boolean flag2 = selectedTab.hasSearchBar(); TooltipFlag.Default tooltipflag$default = this.minecraft.options.advancedItemTooltips ? TooltipFlag.Default.ADVANCED : TooltipFlag.Default.NORMAL; TooltipFlag tooltipflag = flag ? tooltipflag$default.asCreative() : tooltipflag$default; List list = p_281769_.getTooltipLines(Item.TooltipContext.of(this.minecraft.level), this.minecraft.player, tooltipflag); diff --git a/patches/minecraft/net/minecraft/client/multiplayer/SessionSearchTrees.java.patch b/patches/minecraft/net/minecraft/client/multiplayer/SessionSearchTrees.java.patch index eafd01c028..88b4befe93 100644 --- a/patches/minecraft/net/minecraft/client/multiplayer/SessionSearchTrees.java.patch +++ b/patches/minecraft/net/minecraft/client/multiplayer/SessionSearchTrees.java.patch @@ -11,21 +11,23 @@ private CompletableFuture> recipeSearch = CompletableFuture.completedFuture(SearchTree.empty()); private final Map reloaders = new IdentityHashMap<>(); -@@ -82,44 +_,50 @@ +@@ -82,44 +_,52 @@ } public void updateCreativeTags(List p_344581_) { -+ for (var name : net.minecraftforge.client.CreativeModeTabSearchRegistry.getTagSearchKeys().values()) ++ for (var entry : net.minecraftforge.client.CreativeModeTabSearchRegistry.getTagSearchKeys().entrySet()) this.register( - CREATIVE_TAGS, -+ name, ++ entry.getValue(), () -> { - CompletableFuture completablefuture = this.creativeByTagSearch; - this.creativeByTagSearch = CompletableFuture.supplyAsync( -+ CompletableFuture completablefuture = this.creativeSearch.getOrDefault(name, EMPTY); -+ this.creativeSearch.put(name, CompletableFuture.supplyAsync( - () -> new IdSearchTree<>(p_342206_ -> p_342206_.getTags().map(TagKey::location), p_344581_), Util.backgroundExecutor() +- () -> new IdSearchTree<>(p_342206_ -> p_342206_.getTags().map(TagKey::location), p_344581_), Util.backgroundExecutor() - ); ++ var items = entry.getKey() == net.minecraft.world.item.CreativeModeTabs.searchTab() ? p_344581_ : List.copyOf(entry.getKey().getDisplayItems()); ++ CompletableFuture completablefuture = this.creativeSearch.getOrDefault(entry.getValue(), EMPTY); ++ this.creativeSearch.put(entry.getValue(), CompletableFuture.supplyAsync( ++ () -> new IdSearchTree<>(p_342206_ -> p_342206_.getTags().map(TagKey::location), items), Util.backgroundExecutor() + )); completablefuture.cancel(true); } @@ -38,21 +40,23 @@ } public void updateCreativeTooltips(HolderLookup.Provider p_343364_, List p_342500_) { -+ for (var name : net.minecraftforge.client.CreativeModeTabSearchRegistry.getNameSearchKeys().values()) ++ for (var entry : net.minecraftforge.client.CreativeModeTabSearchRegistry.getNameSearchKeys().entrySet()) this.register( - CREATIVE_NAMES, -+ name, ++ entry.getValue(), () -> { ++ var items = entry.getKey() == net.minecraft.world.item.CreativeModeTabs.searchTab() ? p_342500_ : List.copyOf(entry.getKey().getDisplayItems()); Item.TooltipContext item$tooltipcontext = Item.TooltipContext.of(p_343364_); TooltipFlag tooltipflag = TooltipFlag.Default.NORMAL.asCreative(); - CompletableFuture completablefuture = this.creativeByNameSearch; - this.creativeByNameSearch = CompletableFuture.supplyAsync( -+ CompletableFuture completablefuture = this.creativeSearch.getOrDefault(name, EMPTY); -+ this.creativeSearch.put(name, CompletableFuture.supplyAsync( ++ CompletableFuture completablefuture = this.creativeSearch.getOrDefault(entry.getValue(), EMPTY); ++ this.creativeSearch.put(entry.getValue(), CompletableFuture.supplyAsync( () -> new FullTextSearchTree<>( p_345254_ -> getTooltipLines(Stream.of(p_345254_), item$tooltipcontext, tooltipflag), p_344415_ -> p_344415_.getItemHolder().unwrapKey().map(ResourceKey::location).stream(), - p_342500_ +- p_342500_ ++ items ), Util.backgroundExecutor() - ); diff --git a/patches/minecraft/net/minecraft/world/item/CreativeModeTab.java.patch b/patches/minecraft/net/minecraft/world/item/CreativeModeTab.java.patch index faab092bbc..30cc27326e 100644 --- a/patches/minecraft/net/minecraft/world/item/CreativeModeTab.java.patch +++ b/patches/minecraft/net/minecraft/world/item/CreativeModeTab.java.patch @@ -118,8 +118,8 @@ + */ + public CreativeModeTab.Builder withSearchBar() { + this.hasSearchBar = true; -+ if (this.backgroundTexture == null) -+ return this.backgroundTexture(createTextureLocation("item_seach")); ++ if (this.backgroundTexture == CreativeModeTab.DEFAULT_BACKGROUND) ++ return this.backgroundTexture(createTextureLocation("item_search")); + return this; + } + diff --git a/src/test/java/net/minecraftforge/debug/creativetabs/CreativeModeTabTest.java b/src/test/java/net/minecraftforge/debug/creativetabs/CreativeModeTabTest.java index 03d313fe78..dcd1065c17 100644 --- a/src/test/java/net/minecraftforge/debug/creativetabs/CreativeModeTabTest.java +++ b/src/test/java/net/minecraftforge/debug/creativetabs/CreativeModeTabTest.java @@ -16,6 +16,7 @@ import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.DyeColor; import net.minecraft.world.item.DyeItem; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.Items; import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; @@ -32,6 +33,8 @@ public class CreativeModeTabTest { private static final ResourceKey LOGS = ResourceKey.create(Registries.CREATIVE_MODE_TAB, ResourceLocation.fromNamespaceAndPath(MOD_ID, "logs")); private static final ResourceKey STONE = ResourceKey.create(Registries.CREATIVE_MODE_TAB, ResourceLocation.fromNamespaceAndPath(MOD_ID, "stone")); + private static final ResourceKey COLORS = ResourceKey.create(Registries.CREATIVE_MODE_TAB, ResourceLocation.fromNamespaceAndPath(MOD_ID, "colors")); + private static final ResourceKey SEARCH = ResourceKey.create(Registries.CREATIVE_MODE_TAB, ResourceLocation.fromNamespaceAndPath(MOD_ID, "search")); public CreativeModeTabTest() { if (!ENABLED) @@ -58,7 +61,8 @@ public class CreativeModeTabTest { }) .build()); - helper.register(STONE, CreativeModeTab.builder().icon(() -> new ItemStack(Blocks.STONE)) + helper.register(STONE, CreativeModeTab.builder() + .icon(() -> new ItemStack(Blocks.STONE)) .title(Component.literal("Stone")) .withLabelColor(0x0000FF) .displayItems((params, output) -> { @@ -67,16 +71,29 @@ public class CreativeModeTabTest { output.accept(new ItemStack(Blocks.DIORITE)); output.accept(new ItemStack(Blocks.ANDESITE)); }) - .withTabsAfter(CreativeModeTabs.BUILDING_BLOCKS) + .withTabsBefore(LOGS) .build()); - helper.register(ResourceLocation.fromNamespaceAndPath(MOD_ID, "colors"), CreativeModeTab.builder().title(Component.literal("Colors")) + helper.register(COLORS, CreativeModeTab.builder() + .title(Component.literal("Colors")) .displayItems((params, output) -> { for (DyeColor color : DyeColor.values()) output.accept(DyeItem.byColor(color)); }) .withTabFactory(CreativeModeColorTab::new) - .withTabsBefore(CreativeModeTabs.COLORED_BLOCKS) + .withTabsBefore(STONE) + .build() + ); + + helper.register(SEARCH, CreativeModeTab.builder() + .title(Component.literal("Search")) + .icon(() -> new ItemStack(Items.BOOKSHELF)) + .displayItems((params, output) -> { + for (DyeColor color : DyeColor.values()) + output.accept(DyeItem.byColor(color)); + }) + .withTabsBefore(COLORS) + .withSearchBar() .build() );