From daf81673772abddcf66d0b9f161f26a48e11c74d Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Wed, 29 Apr 2026 09:18:53 +0100 Subject: [PATCH 1/7] fix: don't try to show missing sidebar button tooltips and some nullability cleanup --- .../sidebar/RegisteredSidebarButton.java | 10 ++++++---- .../ftblibrary/sidebar/SidebarButtonData.java | 2 +- .../sidebar/SidebarGroupGuiButton.java | 16 ++++++++++------ 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/RegisteredSidebarButton.java b/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/RegisteredSidebarButton.java index 6bbc3c8d..159b75bb 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/RegisteredSidebarButton.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/RegisteredSidebarButton.java @@ -6,6 +6,8 @@ import dev.ftb.mods.ftblibrary.client.gui.screens.LoadingScreen; import dev.ftb.mods.ftblibrary.client.util.ClientUtils; import dev.ftb.mods.ftblibrary.platform.Platform; +import net.minecraft.ChatFormatting; +import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; import net.minecraft.util.Util; @@ -21,7 +23,7 @@ public class RegisteredSidebarButton implements SidebarButton { private final SidebarButtonData data; private final Identifier id; private final String langKey; - private final Component tooltip; + private @Nullable final Component tooltip; private final List extraRenderers; private @Nullable Supplier> tooltipOverride; private BooleanSupplier visible = () -> true; @@ -31,7 +33,7 @@ public RegisteredSidebarButton(Identifier id, SidebarButtonData data) { this.id = id; this.data = data; this.langKey = Util.makeDescriptionId("sidebar_button", id); - tooltip = Component.translatable(langKey + ".tooltip"); + tooltip = I18n.exists(langKey + ".tooltip") ? Component.translatable(langKey + ".tooltip") : null; if (data.requiresOp()) { addVisibilityCondition(ClientUtils.IS_CLIENT_OP); } @@ -65,8 +67,8 @@ public List getTooltip(boolean shift) { } else { List tooltips = new ArrayList<>(); tooltips.add(Component.translatable(langKey)); - if (shift) { - tooltips.add(tooltip); + if (tooltip != null && shift) { + tooltips.add(tooltip.copy().withStyle(ChatFormatting.GRAY)); } Optional> components = shift ? data.shiftTooltip() : data.tooltip(); components.ifPresent(tooltips::addAll); diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/SidebarButtonData.java b/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/SidebarButtonData.java index 4ba82f42..1a6fc76c 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/SidebarButtonData.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/SidebarButtonData.java @@ -39,7 +39,7 @@ public record SidebarButtonData( ).apply(builder, SidebarButtonData::new)); @Override - public int compareTo(@NonNull SidebarButtonData o) { + public int compareTo(SidebarButtonData o) { return Integer.compare(sortIndex, o.sortIndex); } } diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/SidebarGroupGuiButton.java b/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/SidebarGroupGuiButton.java index 3a30a17d..64c1fbbb 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/SidebarGroupGuiButton.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/sidebar/SidebarGroupGuiButton.java @@ -17,7 +17,7 @@ import net.minecraft.client.resources.language.I18n; import net.minecraft.network.chat.Component; import org.joml.Matrix3x2fStack; -import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.util.*; import java.util.stream.Collectors; @@ -35,9 +35,11 @@ public class SidebarGroupGuiButton extends AbstractButton { boolean gridStartRight = false; int yRenderStart; int xRenderStart; + @Nullable private SidebarGuiButton mouseOver; + @Nullable private SidebarGuiButton selectedButton; - private GridLocation selectedLocation; + private GridLocation selectedLocation = GridLocation.OUT_OF_BOUNDS; private int lastMouseClickButton = 0; private boolean isEditMode; private int currentMouseX; @@ -211,10 +213,10 @@ private void extractEditMode(GuiGraphicsExtractor graphics, int mx, int my) { graphics.pose().pushMatrix(); if (gridStartRight) { - drawHoveredGrid(graphics, addIconX, gridY, 1, disabledButtonList.size(), BUTTON_SPACING, Color4I.GRAY, Color4I.BLACK, mx, my, gridStartBottom, gridStartRight); + drawHoveredGrid(graphics, addIconX, gridY, 1, disabledButtonList.size(), BUTTON_SPACING, Color4I.GRAY, Color4I.BLACK, mx, my, gridStartBottom, true); drawGrid(graphics, addIconX - maxWidth - 6, gridY, 1, disabledButtonList.size(), maxWidth + 6, BUTTON_SPACING, Color4I.GRAY, Color4I.BLACK); } else { - drawHoveredGrid(graphics, gridX, gridY, 1, disabledButtonList.size(), BUTTON_SPACING, Color4I.GRAY, Color4I.BLACK, mx, my, gridStartBottom, gridStartRight); + drawHoveredGrid(graphics, gridX, gridY, 1, disabledButtonList.size(), BUTTON_SPACING, Color4I.GRAY, Color4I.BLACK, mx, my, gridStartBottom, false); drawGrid(graphics, gridX + BUTTON_SPACING, gridY, 1, disabledButtonList.size(), maxWidth + 6, BUTTON_SPACING, Color4I.GRAY, Color4I.BLACK); } @@ -267,6 +269,8 @@ public void onRelease(MouseButtonEvent mouseButtonEvent) { } private void updateButtonLocations(GridLocation gLocation) { + assert selectedButton != null; + // Checks if moved from the first spot, so we can move other icons over but only as the same row boolean isFrom0XTo1X = selectedLocation.y() == gLocation.y() && selectedLocation.x() == 0 && gLocation.x() == 1; @@ -340,7 +344,7 @@ private void updateWidgetSize() { } if (isEditMode && addBoxOpen) { - int disabledList = SidebarButtonManager.INSTANCE.getDisabledButtonList(isEditMode).size(); + int disabledList = SidebarButtonManager.INSTANCE.getDisabledButtonList(true).size(); girdAmountX += 4; girdAmountY = Math.max(girdAmountY, disabledList); } @@ -428,7 +432,7 @@ private GridLocation getGridLocation() { } @Override - public void onPress(@NonNull InputWithModifiers inputWithModifiers) { + public void onPress(InputWithModifiers inputWithModifiers) { if (lastMouseClickButton == 1) { isEditMode = !isEditMode; ensureGridAlignment(); From c7ecdfa70a3e385d11dd20f3d35e012d13f274e0 Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Wed, 29 Apr 2026 09:21:19 +0100 Subject: [PATCH 2/7] build: version -> 26.1.2.3, changelog updated --- CHANGELOG.md | 6 ++++++ gradle.properties | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e5dacb9..f206ef58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [26.1.2.3-beta] + +### Fixed +* Fixed item data component viewing/editing in the item selection screen +* Fixed sidebar buttons showing tooltip translation keys (when shift is held) when the button shouldn't have a tooltip + ## [26.1.2.2-beta] ### Added diff --git a/gradle.properties b/gradle.properties index 12cfce7f..5698ade5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ org.gradle.daemon=false # Mod mod_id=ftblibrary readable_name=FTB Library -mod_version=2 +mod_version=3 mod_author=FTB Team # Maven From bc225cee2368cdede6ac1e1038f1a7d51ef53681 Mon Sep 17 00:00:00 2001 From: Michael Hillcox Date: Sat, 9 May 2026 08:58:21 +0100 Subject: [PATCH 3/7] fix: key categories for Fabric --- common/build.gradle | 2 +- .../platform/client/PlatformClient.java | 2 ++ .../main/resources/ftblibrary.accesswidener | 4 ---- .../client/FabricPlatformClientImpl.java | 5 +++++ gradle.properties | 4 ++++ .../client/NeoPlatformClientImpl.java | 20 +++++++++++++++---- 6 files changed, 28 insertions(+), 9 deletions(-) diff --git a/common/build.gradle b/common/build.gradle index 19594446..b156dc6d 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -3,7 +3,7 @@ plugins { } loom { - accessWidenerPath = project(":common").file("src/main/resources/${project.mod_id}.accesswidener") + accessWidenerPath = file("src/main/resources/ftblibrary.accesswidener") mixin { useLegacyMixinAp = false diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/PlatformClient.java b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/PlatformClient.java index e971a9f2..66780add 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/PlatformClient.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/platform/client/PlatformClient.java @@ -23,5 +23,7 @@ default void addResourcePackReloadListener(String modId, Identifier id, Preparab addResourcePackReloadListeners(modId, Map.of(id, listener)); } + KeyMapping.Category registerKeyMappingCategory(Identifier id); + void registerKeyMapping(String modId, KeyMapping... keyMappings); } diff --git a/common/src/main/resources/ftblibrary.accesswidener b/common/src/main/resources/ftblibrary.accesswidener index c7a0f909..1e64c6fe 100644 --- a/common/src/main/resources/ftblibrary.accesswidener +++ b/common/src/main/resources/ftblibrary.accesswidener @@ -1,10 +1,6 @@ accessWidener v2 official accessible class net/minecraft/client/gui/components/MultilineTextField$StringView - -#transitive-extendable class net/minecraft/nbt/CompoundTag -#transitive-accessible method net/minecraft/nbt/CompoundTag (Ljava/util/Map;)V - accessible method net/minecraft/client/renderer/texture/SpriteContents getFrameCount ()I accessible field net/minecraft/client/gui/GuiGraphicsExtractor guiRenderState Lnet/minecraft/client/renderer/state/gui/GuiRenderState; diff --git a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/FabricPlatformClientImpl.java b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/FabricPlatformClientImpl.java index 9e75c4ab..8a47d39e 100644 --- a/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/FabricPlatformClientImpl.java +++ b/fabric/src/main/java/dev/ftb/mods/ftblibrary/fabric/platform/client/FabricPlatformClientImpl.java @@ -24,6 +24,11 @@ public void addResourcePackReloadListeners(String modId, Map=0.145.0+26.1.1 jei_version=29.5.0.26 json5_version=3.0.0 +amecs_key_modifiers_version=mc26.1.0:1.0.2 +amecs_key_bundle_version=mc26.1.0:1.6.5 + +modmenu_version=18.0.0-alpha.8 curseforge_id_forge=404465 curseforge_id_fabric=438495 diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/NeoPlatformClientImpl.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/NeoPlatformClientImpl.java index b95b40db..f2a14077 100644 --- a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/NeoPlatformClientImpl.java +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/platform/client/NeoPlatformClientImpl.java @@ -13,11 +13,13 @@ import net.neoforged.neoforge.client.network.ClientPacketDistributor; import org.jspecify.annotations.NonNull; -import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; public class NeoPlatformClientImpl implements PlatformClient { + private final Set registeredCategories = ConcurrentHashMap.newKeySet(); + @Override public void sendToServer(CustomPacketPayload payload) { ClientPacketDistributor.sendToServer(payload); @@ -29,15 +31,25 @@ public void addResourcePackReloadListeners(String modId, Map { - Set cats = new HashSet<>(); for (var k : keyMappings) { - cats.add(k.getCategory()); event.register(k); } - cats.forEach(event::registerCategory); + + registeredCategories.forEach(event::registerCategory); + registeredCategories.clear(); }); } From f16c35e81e53d8ba8383428318a9173907ba4f05 Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Mon, 11 May 2026 11:28:02 +0100 Subject: [PATCH 4/7] fix: server configs should be loaded sooner on Neo Use ServerAboutToStartEvent, not ServerStartingEvent. Allows configs to load before levels are load, which is important for FTB Chunks. https://github.com/FTBTeam/FTB-Mods-Issues/issues/2061 --- .../dev/ftb/mods/ftblibrary/neoforge/FTBLibraryNeoForge.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/FTBLibraryNeoForge.java b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/FTBLibraryNeoForge.java index b28bc866..1330300f 100644 --- a/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/FTBLibraryNeoForge.java +++ b/neoforge/src/main/java/dev/ftb/mods/ftblibrary/neoforge/FTBLibraryNeoForge.java @@ -17,6 +17,7 @@ import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; import net.neoforged.neoforge.event.RegisterCommandsEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; +import net.neoforged.neoforge.event.server.ServerAboutToStartEvent; import net.neoforged.neoforge.event.server.ServerStartedEvent; import net.neoforged.neoforge.event.server.ServerStartingEvent; import net.neoforged.neoforge.event.server.ServerStoppedEvent; @@ -33,7 +34,7 @@ public FTBLibraryNeoForge(IEventBus modEventBus) { IEventBus bus = NeoForge.EVENT_BUS; bus.addListener(ServerStartedEvent.class, (event) -> this.library.serverStarted(event.getServer())); - bus.addListener(ServerStartingEvent.class, (event) -> ConfigManager.getInstance().onServerStarting(event.getServer())); + bus.addListener(ServerAboutToStartEvent.class, (event) -> ConfigManager.getInstance().onServerStarting(event.getServer())); bus.addListener(ServerStoppedEvent.class, (event) -> this.library.serverStopped(event.getServer())); bus.addListener(RegisterCommandsEvent.class, (event) -> this.library.registerCommands(event.getDispatcher(), event.getBuildContext(), event.getCommandSelection())); From b99aa95817cad4ee060c5133103808d68ce8eaf2 Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Mon, 11 May 2026 11:29:23 +0100 Subject: [PATCH 5/7] chore: changelog updated --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f206ef58..5c6ab649 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed * Fixed item data component viewing/editing in the item selection screen * Fixed sidebar buttons showing tooltip translation keys (when shift is held) when the button shouldn't have a tooltip +* Server configs are now loaded earlier on NeoForge (using `ServerAboutToStartEvent`, not `ServerStartingEvent`) + * Fixes an issues with forceloading and FTB Chunks +* Fixed a tooltip issues with some GUI button types (not showing first line of tooltip) ## [26.1.2.2-beta] From 1f91e848de2ac13f6f2497bc0f8e55c00293bc86 Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Mon, 11 May 2026 11:30:48 +0100 Subject: [PATCH 6/7] fix: SimpleTextButton tooltip method losing first line of tooltip --- .../ftb/mods/ftblibrary/client/gui/widget/SimpleTextButton.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/SimpleTextButton.java b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/SimpleTextButton.java index b19fe96f..2b58eed7 100644 --- a/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/SimpleTextButton.java +++ b/common/src/main/java/dev/ftb/mods/ftblibrary/client/gui/widget/SimpleTextButton.java @@ -31,6 +31,8 @@ public void onClicked(MouseButton button) { @Override public void addMouseOverText(TooltipList list) { + super.addMouseOverText(list); + for (Component c : tooltip) { list.add(c); } From 75d4c93708a62299ba95a7ff40379423e1fc516a Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Mon, 11 May 2026 11:31:50 +0100 Subject: [PATCH 7/7] chore: changelog updated --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5c6ab649..578d122b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Server configs are now loaded earlier on NeoForge (using `ServerAboutToStartEvent`, not `ServerStartingEvent`) * Fixes an issues with forceloading and FTB Chunks * Fixed a tooltip issues with some GUI button types (not showing first line of tooltip) +* Fixed keybinding registration bug on Fabric where key categories weren't properly registered ## [26.1.2.2-beta]