From 4752737bb00cd296a52c7fbdd6abe8f8eb5236c3 Mon Sep 17 00:00:00 2001 From: boholder Date: Sat, 3 Aug 2024 15:13:11 +0800 Subject: [PATCH] fix: #311 can't speak music discs name in inventory screen --- .../features/SpeakHeldItem.java | 5 ++++ .../inventory_controls/InventoryControls.java | 27 ++++++++++++++----- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/com/github/khanshoaib3/minecraft_access/features/SpeakHeldItem.java b/common/src/main/java/com/github/khanshoaib3/minecraft_access/features/SpeakHeldItem.java index 61045573..49d6c9de 100644 --- a/common/src/main/java/com/github/khanshoaib3/minecraft_access/features/SpeakHeldItem.java +++ b/common/src/main/java/com/github/khanshoaib3/minecraft_access/features/SpeakHeldItem.java @@ -2,11 +2,16 @@ import com.github.khanshoaib3.minecraft_access.MainClass; import com.github.khanshoaib3.minecraft_access.config.config_maps.OtherConfigsMap; +import com.github.khanshoaib3.minecraft_access.features.inventory_controls.InventoryControls; import net.minecraft.client.resource.language.I18n; import net.minecraft.item.ItemStack; import java.util.function.Function; +/** + * This class is responsible for speaking hotbar when no inventory screen is opened. + * For speaking hotbar when any inventory screen is opened, see {@link InventoryControls#getCurrentSlotNarrationText()} + */ public class SpeakHeldItem { private String previousItemName = ""; private int previousItemCount = 0; diff --git a/common/src/main/java/com/github/khanshoaib3/minecraft_access/features/inventory_controls/InventoryControls.java b/common/src/main/java/com/github/khanshoaib3/minecraft_access/features/inventory_controls/InventoryControls.java index 2d974ecc..4dd7299b 100644 --- a/common/src/main/java/com/github/khanshoaib3/minecraft_access/features/inventory_controls/InventoryControls.java +++ b/common/src/main/java/com/github/khanshoaib3/minecraft_access/features/inventory_controls/InventoryControls.java @@ -15,10 +15,13 @@ import net.minecraft.client.gui.widget.TextFieldWidget; import net.minecraft.client.gui.widget.ToggleButtonWidget; import net.minecraft.client.resource.language.I18n; +import net.minecraft.component.DataComponentTypes; import net.minecraft.item.Item.TooltipContext; import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroups; +import net.minecraft.item.ItemStack; import net.minecraft.item.tooltip.TooltipType; +import net.minecraft.screen.slot.Slot; import net.minecraft.text.Text; import net.minecraft.util.math.MathHelper; import org.jetbrains.annotations.NotNull; @@ -27,6 +30,7 @@ import java.util.List; import java.util.ListIterator; import java.util.Objects; +import java.util.Optional; /** * This features lets us use keyboard in inventory screens. Works with all default minecraft screens. @@ -510,21 +514,32 @@ private void moveToSlotItem(SlotItem slotItem, int delay) { private String getCurrentSlotNarrationText() { if (currentSlotItem == null) return ""; - if (currentSlotItem.slot == null) { + Slot slot = currentSlotItem.slot; + if (slot == null) { return Objects.requireNonNullElse(currentSlotItem.getNarratableText(), I18n.translate("minecraft_access.inventory_controls.Unknown")); } - - if (!currentSlotItem.slot.hasStack()) { - return I18n.translate("minecraft_access.inventory_controls.empty_slot", currentGroup.getSlotPrefix(currentSlotItem.slot)); + if (!slot.hasStack()) { + return I18n.translate("minecraft_access.inventory_controls.empty_slot", currentGroup.getSlotPrefix(slot)); } - String info = "%s %d".formatted(currentGroup.getSlotPrefix(currentSlotItem.slot), currentSlotItem.slot.getStack().getCount()); + ItemStack itemStack = slot.getStack(); + // + String info = "%s %d".formatted(currentGroup.getSlotPrefix(slot), itemStack.getCount()); + + // StringBuilder toolTipString = new StringBuilder(); - List toolTipList = currentSlotItem.slot.getStack().getTooltip(TooltipContext.DEFAULT, minecraftClient.player, TooltipType.BASIC); + List toolTipList = itemStack.getTooltip(TooltipContext.DEFAULT, minecraftClient.player, TooltipType.BASIC); for (Text line : toolTipList) { toolTipString.append(line.getString()).append(" "); } + // issue #311 after 1.21: Can't get Music Discs' name from Tooltip, use this instead + Optional.ofNullable(itemStack.get(DataComponentTypes.JUKEBOX_PLAYABLE)).ifPresent((jukeboxPlayableComponent) -> { + String discNumber = jukeboxPlayableComponent.song().key().getValue().getPath(); + toolTipString.append(" ").append(I18n.translate("jukebox_song.minecraft." + discNumber)); + }); + + // return "%s %s".formatted(info, toolTipString.toString()); }