diff --git a/build.gradle b/build.gradle index dda0011..b8d0e6a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,19 +1,18 @@ buildscript { repositories { maven { url = 'https://maven.minecraftforge.net' } - maven { url = 'https://maven.parchmentmc.org' } maven { url = 'https://repo.spongepowered.org/maven' } mavenCentral() } dependencies { - classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '5.1.+', changing: true - classpath 'org.parchmentmc:librarian:1.+' classpath 'org.spongepowered:mixingradle:0.7-SNAPSHOT' } } plugins { - id 'com.github.johnrengelman.shadow' version '7.1.2' + id 'net.minecraftforge.gradle' version '[6.0,6.2)' + id 'com.github.johnrengelman.shadow' version '8.1.1' + id 'org.parchmentmc.librarian.forgegradle' version '1.+' } apply plugin: 'net.minecraftforge.gradle' @@ -99,7 +98,7 @@ mixin { shadowJar { configurations = [project.configurations.shade] - classifier = '' + archiveClassifier.set('') } reobf { @@ -110,7 +109,7 @@ build.dependsOn shadowJar build.dependsOn reobfShadowJar jar { - classifier = 'slim' + archiveClassifier = 'slim' manifest { attributes([ "Specification-Title" : "love-accessibility", diff --git a/gradle.properties b/gradle.properties index 78f19c7..8dbbbab 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,7 +1,7 @@ -minecraft_version=1.18.2 -forge_version=40.1.0 +minecraft_version=1.20.1 +forge_version=47.1.0 mod_version=0.1.0 -parchment_version=2022.04.23-nightly-SNAPSHOT +parchment_version=2023.09.03 org.gradle.jvmargs=-Xmx3G org.gradle.daemon=false diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index aa991fc..fae0804 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..896d37b --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { + name = 'MinecraftForge' + url = 'https://maven.minecraftforge.net/' + } + maven { url = 'https://maven.parchmentmc.org' } // Add this line + } +} \ No newline at end of file diff --git a/src/main/java/com/lovetropics/accessibility/client/narrator/NarratorManager.java b/src/main/java/com/lovetropics/accessibility/client/narrator/NarratorManager.java index 159c803..96e4da6 100644 --- a/src/main/java/com/lovetropics/accessibility/client/narrator/NarratorManager.java +++ b/src/main/java/com/lovetropics/accessibility/client/narrator/NarratorManager.java @@ -3,16 +3,15 @@ import com.lovetropics.accessibility.LoveAccessibility; import com.lovetropics.accessibility.client.narrator.ui.ContainerNarrator; import com.lovetropics.accessibility.client.narrator.world.WorldNarrator; +import com.lovetropics.accessibility.mixin.GameNarratorAccessor; import com.mojang.text2speech.Narrator; import net.minecraft.client.Minecraft; import net.minecraft.client.NarratorStatus; -import net.minecraft.client.gui.chat.NarratorChatListener; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.util.ObfuscationReflectionHelper; import javax.annotation.Nullable; import java.util.Objects; @@ -65,11 +64,11 @@ private static NarratorOutput getNarratorOutput() { } private static Narrator getVanillaNarrator() { - return ObfuscationReflectionHelper.getPrivateValue(NarratorChatListener.class, NarratorChatListener.INSTANCE, "f_93313_"); + return ((GameNarratorAccessor) (Minecraft.getInstance().getNarrator())).getNarrator(); } private static NarratorStatus getNarratorStatus() { - return Minecraft.getInstance().options.narratorStatus; + return Minecraft.getInstance().options.narrator().get(); } private record Narrators(WorldNarrator world, ContainerNarrator container) { diff --git a/src/main/java/com/lovetropics/accessibility/client/narrator/NvdaNarrator.java b/src/main/java/com/lovetropics/accessibility/client/narrator/NvdaNarrator.java index fd1ecf0..eb813da 100644 --- a/src/main/java/com/lovetropics/accessibility/client/narrator/NvdaNarrator.java +++ b/src/main/java/com/lovetropics/accessibility/client/narrator/NvdaNarrator.java @@ -3,8 +3,13 @@ import com.lovetropics.accessibility.LoveAccessibility; import com.mojang.text2speech.Narrator; import dev.gegy.nvda_controller_client.NvdaControllerClient; +import net.minecraft.client.GameNarrator; +import org.lwjgl.util.tinyfd.TinyFileDialogs; import javax.annotation.Nullable; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; public final class NvdaNarrator { private static Narrator instance; @@ -35,7 +40,20 @@ public boolean active() { public void destroy() { } }; - } catch (final Exception e) { + + if(nvda != null && !instance.active()) { + // Added just as a little help window in case NVDA is installed but not active + String programFilesPath = System.getenv("ProgramFiles(X86)"); + Path folderPath = Paths.get(programFilesPath, "NVDA\\nvda.exe"); + if(Files.exists(folderPath) && !TinyFileDialogs.tinyfd_messageBox("Minecraft", "NVDA detected but not active, do you want to try to default back to the native narrator?\n\nIf this problem persists, please report it at https://github.com/LoveTropics/LoveAccessibility", "yesno", "error", true)) { + throw new GameNarrator.NarratorInitException("NVDA Narrator library is not active"); + } + instance = null; + } + + } catch(GameNarrator.NarratorInitException e) { + throw e; + } catch(final Exception e) { LoveAccessibility.LOGGER.error("Failed to load NVDA controller client", e); } } diff --git a/src/main/java/com/lovetropics/accessibility/client/narrator/description/BlockDescription.java b/src/main/java/com/lovetropics/accessibility/client/narrator/description/BlockDescription.java index cac0e48..918b0ea 100644 --- a/src/main/java/com/lovetropics/accessibility/client/narrator/description/BlockDescription.java +++ b/src/main/java/com/lovetropics/accessibility/client/narrator/description/BlockDescription.java @@ -1,5 +1,7 @@ package com.lovetropics.accessibility.client.narrator.description; +import net.minecraft.client.Minecraft; +import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; import net.minecraft.network.chat.CommonComponents; @@ -13,10 +15,10 @@ import javax.annotation.Nullable; public record BlockDescription(Component component) { - public static BlockDescription describe(final Level level, final BlockPos pos) { + public static BlockDescription describe(final Minecraft minecraft, final Level level, final BlockPos pos) { final BlockEntity entity = level.getBlockEntity(pos); if (entity instanceof SignBlockEntity sign) { - return describeSign(sign); + return describeSign(minecraft.player, sign); } else if (entity instanceof CampfireBlockEntity campfire) { return describeInventory(campfire.getItems()); } @@ -24,10 +26,13 @@ public static BlockDescription describe(final Level level, final BlockPos pos) { return null; } - private static BlockDescription describeSign(final SignBlockEntity sign) { - Component message = sign.getMessage(0, false); - for (int i = 1; i < SignBlockEntity.LINES; i++) { - message = CommonComponents.joinForNarration(message, sign.getMessage(i, false)); + private static BlockDescription describeSign(LocalPlayer player, final SignBlockEntity sign) { + Component message = player == null ? sign.getFrontText().getMessage(0, false) + : sign.getTextFacingPlayer(player).getMessage(0, false); + // Was using SignBlockEntity.LINES but that no longer seems to exist + for (int i = 1; i < 4; i++) { + message = CommonComponents.joinForNarration(message, player == null ? sign.getFrontText().getMessage(i, false) + : sign.getTextFacingPlayer(player).getMessage(i, false)); } return new BlockDescription(message); } diff --git a/src/main/java/com/lovetropics/accessibility/client/narrator/description/ItemDescription.java b/src/main/java/com/lovetropics/accessibility/client/narrator/description/ItemDescription.java index c517057..2a26b92 100644 --- a/src/main/java/com/lovetropics/accessibility/client/narrator/description/ItemDescription.java +++ b/src/main/java/com/lovetropics/accessibility/client/narrator/description/ItemDescription.java @@ -3,7 +3,6 @@ import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; -import net.minecraft.network.chat.TextComponent; import net.minecraft.world.item.ItemStack; import javax.annotation.Nullable; @@ -18,7 +17,7 @@ public static ItemDescription describe(final ItemStack item) { } private static Component describeComponent(final ItemStack item) { - final MutableComponent prefix = new TextComponent(item.getCount() + " "); + final MutableComponent prefix = Component.literal(item.getCount() + " "); final Component typeName = item.getItem().getName(item); if (item.hasCustomHoverName()) { final Component displayName = item.getHoverName(); diff --git a/src/main/java/com/lovetropics/accessibility/client/narrator/world/LookingAtNarrator.java b/src/main/java/com/lovetropics/accessibility/client/narrator/world/LookingAtNarrator.java index 9b4e977..cfe2cf6 100644 --- a/src/main/java/com/lovetropics/accessibility/client/narrator/world/LookingAtNarrator.java +++ b/src/main/java/com/lovetropics/accessibility/client/narrator/world/LookingAtNarrator.java @@ -54,7 +54,7 @@ private LookingAtBlock evaluateBlockTarget(final Minecraft minecraft, final Clie final BlockPos pos = blockResult.getBlockPos(); final BlockState state = level.getBlockState(pos); if (!state.isAir() && !isSubmergedIn(minecraft, state.getBlock())) { - final BlockDescription details = BlockDescription.describe(level, pos); + final BlockDescription details = BlockDescription.describe(minecraft, level, pos); return new LookingAtBlock(pos, state.getBlock(), details); } return null; diff --git a/src/main/java/com/lovetropics/accessibility/mixin/GameNarratorAccessor.java b/src/main/java/com/lovetropics/accessibility/mixin/GameNarratorAccessor.java new file mode 100644 index 0000000..c30dfac --- /dev/null +++ b/src/main/java/com/lovetropics/accessibility/mixin/GameNarratorAccessor.java @@ -0,0 +1,14 @@ +package com.lovetropics.accessibility.mixin; + +import com.mojang.text2speech.Narrator; +import net.minecraft.client.GameNarrator; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(GameNarrator.class) +public interface GameNarratorAccessor { + + @Accessor("narrator") + Narrator getNarrator(); + +} diff --git a/src/main/java/com/lovetropics/accessibility/mixin/NarratorChatListenerMixin.java b/src/main/java/com/lovetropics/accessibility/mixin/GameNarratorMixin.java similarity index 84% rename from src/main/java/com/lovetropics/accessibility/mixin/NarratorChatListenerMixin.java rename to src/main/java/com/lovetropics/accessibility/mixin/GameNarratorMixin.java index 349bb1c..68cfc33 100644 --- a/src/main/java/com/lovetropics/accessibility/mixin/NarratorChatListenerMixin.java +++ b/src/main/java/com/lovetropics/accessibility/mixin/GameNarratorMixin.java @@ -2,7 +2,8 @@ import com.lovetropics.accessibility.client.narrator.NvdaNarrator; import com.mojang.text2speech.Narrator; -import net.minecraft.client.gui.chat.NarratorChatListener; +import net.minecraft.client.GameNarrator; +import org.lwjgl.util.tinyfd.TinyFileDialogs; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; @@ -11,8 +12,8 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -@Mixin(NarratorChatListener.class) -public class NarratorChatListenerMixin { +@Mixin(GameNarrator.class) +public class GameNarratorMixin { @Mutable @Shadow @Final diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index 1fdef6a..881a897 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader="javafml" -loaderVersion="[36,)" +loaderVersion="[41,)" license="All Rights Reserved" [[mods]] @@ -14,13 +14,13 @@ description=''' [[dependencies.love_accessibility]] modId="forge" mandatory=true - versionRange="[36,)" + versionRange="[46,)" ordering="NONE" side="BOTH" [[dependencies.love_accessibility]] modId="minecraft" mandatory=true - versionRange="[1.18.2,)" + versionRange="[1.20.1,)" ordering="NONE" side="BOTH" diff --git a/src/main/resources/love_accessibility.mixins.json b/src/main/resources/love_accessibility.mixins.json index c193309..16e939a 100644 --- a/src/main/resources/love_accessibility.mixins.json +++ b/src/main/resources/love_accessibility.mixins.json @@ -6,7 +6,8 @@ "mixins": [ ], "client": [ - "NarratorChatListenerMixin" + "GameNarratorMixin", + "GameNarratorAccessor" ], "injectors": { "defaultRequire": 1