Controlify icon indicating copy to clipboard operation
Controlify copied to clipboard

[Bug/Crash] Minecraft will crash upon pressing F3+Esc in a singleplayer world with this mod.

Open fintmc opened this issue 1 year ago • 1 comments

Current Behaviour

When you press F3+Esc in minecraft, it will pause the world but not show the menu screen, instead it will show a message saying "Game paused" or something similar. When using this mod, the game will instead crash with the logs below.

Expected Behaviour

Pressing F3+Esc will show the pause screen and not crash.

Screenshots

No response

Reproduction Steps

Using Minecraft 1.20.1, Fabric 0.15.6, Fabric API 0.90.0+1.20.1, YetAnotherConfigLib 3.2.1+1.20 Originally found with FabulouslyOptimized modpack, later tested with the configs above on default MC settings.

  1. Open an existing or create a new singleplayer world with the mod.
  2. Press F3+Esc

Logs

---- Minecraft Crash Report ----
// Oops.

Time: 2024-02-03 08:52:55
Description: Unexpected error

java.util.NoSuchElementException: No value present
	at java.base/java.util.Optional.orElseThrow(Optional.java:377)
	at dev.isxander.controlify.screenop.compat.vanilla.PauseScreenProcessor.onWidgetRebuild(PauseScreenProcessor.java:40)
	at net.minecraft.class_437.handler$zcb000$controlify$onScreenInitialInit(class_437.java:1169)
	at net.minecraft.class_437.method_25423(class_437.java:297)
	at net.minecraft.class_310.method_1507(class_310.java:1080)
	at net.minecraft.class_310.method_20539(class_310.java:1672)
	at net.minecraft.class_309.method_1466(class_309.java:430)
	at net.minecraft.class_309.method_22678(class_309.java:477)
	at net.minecraft.class_1255.execute(class_1255.java:102)
	at net.minecraft.class_309.method_22676(class_309.java:477)
	at org.lwjgl.glfw.GLFWKeyCallbackI.callback(GLFWKeyCallbackI.java:44)
	at org.lwjgl.system.JNI.invokeV(Native Method)
	at org.lwjgl.glfw.GLFW.glfwPollEvents(GLFW.java:3403)
	at com.mojang.blaze3d.systems.RenderSystem.pollEvents(RenderSystem.java:201)
	at com.mojang.blaze3d.systems.RenderSystem.flipFrame(RenderSystem.java:212)
	at net.minecraft.class_1041.method_15998(class_1041.java:288)
	at net.minecraft.class_310.method_1523(class_310.java:1241)
	at net.minecraft.class_310.method_1514(class_310.java:802)
	at net.minecraft.client.main.Main.main(Main.java:250)
	at net.fabricmc.loader.impl.game.minecraft.MinecraftGameProvider.launch(MinecraftGameProvider.java:470)
	at net.fabricmc.loader.impl.launch.knot.Knot.launch(Knot.java:74)
	at net.fabricmc.loader.impl.launch.knot.KnotClient.main(KnotClient.java:23)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at org.multimc.onesix.OneSixLauncher.launchWithMainClass(OneSixLauncher.java:243)
	at org.multimc.onesix.OneSixLauncher.launch(OneSixLauncher.java:278)
	at org.multimc.EntryPoint.listen(EntryPoint.java:143)
	at org.multimc.EntryPoint.main(EntryPoint.java:34)

Mod Version

1.6.0+1.20

Controller

none used

Bluetooth

  • [ ] Yes

Operating System

Linux/SteamOS

ARM

  • [ ] Yes

Additional Information

Before you say anything, I was unable to use the latest version of Minecraft to do the tests and I did look into the code before submitting this report.

Analyzing the stacktrace I figured it must be an issue where dev.isxander.controlify.screenop.compat.vanilla.PauseScreenProcessor.onWidgetRebuild at PauseScreenProcessor.java:40 calls Optional.orElseThrow(), which crashes the game. Looking into the code I found that on line 41 of the file, it tries to call getWidget("menu.returnToGame") and if not found error out (.orElseThrow()):

// src/main/java/dev/isxander/controlify/screenop/compat/vanilla/PauseScreenProcessor.java
...
/* 39 */      if (screen.showsPauseMenu()) {
/* 40 */          ButtonGuideApi.addGuideToButtonBuiltin(
/* 41 */                  (AbstractButton) getWidget("menu.returnToGame").orElseThrow(),
                                        // ^ here                         ^ crash is from here
/* 42 */                  bindings -> bindings.GUI_BACK,
/* 43 */                  ButtonRenderPosition.TEXT,
/* 44 */                  ButtonGuidePredicate.ALWAYS
/* 45 */          );
...

But since the F3+Esc pause screen doesn't have buttons, the getWidget() call will return an empty value and cause a crash.

If anyone could, please test this issue on newer versions of MC, because the code is still present it is also an issue with the newer versions.

Just to make sure...

  • [ ] I have made sure I am using the latest version of Controlify for the latest version of Minecraft.
  • [X] I have made sure there are no other issues describing the same problem on the issue tracker.

fintmc avatar Feb 03 '24 16:02 fintmc

just realized that it will also crash on line 47 too for the same reason on the f3+esc screen

fintmc avatar Feb 04 '24 10:02 fintmc