From 0aeb0ccac56fc19ca871b6e6c8262e24f2103e94 Mon Sep 17 00:00:00 2001 From: LAX1DUDE Date: Wed, 4 Jan 2023 00:11:39 -0800 Subject: [PATCH] Update #8 - Added ayunami's seamless fullscreen controls When you enter fullscreen via F11 or video settings you can now use regular ESC again to pause and unpause the game and close your inventory and use CTRL as the sprint key without closing the tab. This greatly improves user experience when you are a new player and don't understand yet that regular vanilla ESC and CTRL+W messes up the game. --- CREDITS | 1 + client_version | 2 +- .../net/minecraft/client/Minecraft.edit.java | 28 +++++--- .../minecraft/client/gui/GuiChat.edit.java | 41 +++++++++-- .../minecraft/client/gui/GuiScreen.edit.java | 2 +- .../client/gui/GuiVideoSettings.edit.java | 6 +- .../gui/inventory/GuiContainer.edit.java | 2 +- .../inventory/GuiContainerCreative.edit.java | 2 +- .../client/settings/GameSettings.edit.java | 15 ++-- .../v1_8/internal/PlatformInput.java | 10 +++ .../lax1dude/eaglercraft/v1_8/Display.java | 8 +++ .../eaglercraft/v1_8/EaglercraftVersion.java | 4 +- sources/resources/assets/eagler/CREDITS.txt | 3 +- .../v1_8/internal/PlatformInput.java | 68 ++++++++++++++++++- 14 files changed, 164 insertions(+), 28 deletions(-) diff --git a/CREDITS b/CREDITS index 2e1a229..d8f8d54 100644 --- a/CREDITS +++ b/CREDITS @@ -16,6 +16,7 @@ - Many bug fixes - Added resource packs - Added screen recording + - Added seamless fullscreen - Created the replit diff --git a/client_version b/client_version index f0cf776..f61b8a1 100644 --- a/client_version +++ b/client_version @@ -1 +1 @@ -u7 \ No newline at end of file +u8 \ No newline at end of file diff --git a/patches/minecraft/net/minecraft/client/Minecraft.edit.java b/patches/minecraft/net/minecraft/client/Minecraft.edit.java index 631956a..af45196 100644 --- a/patches/minecraft/net/minecraft/client/Minecraft.edit.java +++ b/patches/minecraft/net/minecraft/client/Minecraft.edit.java @@ -20,6 +20,7 @@ > CHANGE 1 : 32 @ 1 : 4 ~ +~ import net.lax1dude.eaglercraft.v1_8.internal.PlatformInput; ~ import org.apache.commons.lang3.Validate; ~ ~ import com.google.common.collect.Lists; @@ -32,7 +33,6 @@ ~ import net.lax1dude.eaglercraft.v1_8.Mouse; ~ import net.lax1dude.eaglercraft.v1_8.futures.Executors; ~ import net.lax1dude.eaglercraft.v1_8.futures.FutureTask; -~ import net.lax1dude.eaglercraft.v1_8.futures.Futures; ~ import net.lax1dude.eaglercraft.v1_8.futures.ListenableFuture; ~ import net.lax1dude.eaglercraft.v1_8.futures.ListenableFutureTask; ~ import net.lax1dude.eaglercraft.v1_8.internal.EnumPlatformType; @@ -77,9 +77,7 @@ > DELETE 2 @ 2 : 3 -> DELETE 14 @ 14 : 15 - -> DELETE 1 @ 1 : 3 +> DELETE 14 @ 14 : 18 > DELETE 21 @ 21 : 25 @@ -425,7 +423,7 @@ > CHANGE 108 : 109 @ 108 : 148 -~ logger.error("Use F11 to toggle fullscreen!"); +~ Display.toggleFullscreen(); > DELETE 11 @ 11 : 12 @@ -466,7 +464,13 @@ ~ if ((!this.inGameHasFocus || !Mouse.isActuallyGrabbed()) && Mouse.getEventButtonState()) { ~ this.inGameHasFocus = false; -> CHANGE 42 : 43 @ 42 : 43 +> INSERT 16 : 19 @ 16 + ++ if (k == 0x1D && (areKeysLocked() || isFullScreen())) { ++ KeyBinding.setKeyBindState(gameSettings.keyBindSprint.getKeyCode(), Keyboard.getEventKeyState()); ++ } + +> CHANGE 26 : 27 @ 26 : 27 ~ if (k == 1 || (k > -1 && k == this.gameSettings.keyBindClose.getKeyCode())) { @@ -545,7 +549,11 @@ ~ return System.currentTimeMillis(); -> DELETE 10 @ 10 : 27 +> CHANGE 3 : 4 @ 3 : 4 + +~ return Display.isFullscreen(); + +> DELETE 6 @ 6 : 23 > DELETE 44 @ 44 : 48 @@ -571,11 +579,15 @@ > DELETE 24 @ 24 : 32 -> INSERT 7 : 11 @ 7 +> INSERT 7 : 15 @ 7 + + public static int getGLMaximumTextureSize() { + return EaglercraftGPU.glGetInteger(GL_MAX_TEXTURE_SIZE); + } ++ ++ public boolean areKeysLocked() { ++ return PlatformInput.lockKeys; ++ } > EOF diff --git a/patches/minecraft/net/minecraft/client/gui/GuiChat.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiChat.edit.java index 673e8f2..c9d6342 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiChat.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiChat.edit.java @@ -34,15 +34,48 @@ + this.buttonList.add(exitButton = new GuiButton(69, this.width - 100, 3, 97, 20, I18n.format("chat.exit"))); + } -> CHANGE 18 : 19 @ 18 : 19 +> CHANGE 18 : 20 @ 18 : 27 ~ protected void keyTyped(char parChar1, int parInt1) { +~ if (parInt1 == 1 && (this.mc.gameSettings.keyBindClose.getKeyCode() == 0 || this.mc.areKeysLocked())) { -> CHANGE 7 : 8 @ 7 : 10 +> CHANGE 1 : 5 @ 1 : 10 -~ if (parInt1 != 28 && parInt1 != 156) { +~ } else { +~ this.waitingOnAutocomplete = false; +~ if (parInt1 == 15) { +~ this.autocompletePlayerNames(); -> CHANGE 43 : 44 @ 43 : 44 +> CHANGE 1 : 2 @ 1 : 2 + +~ this.playerNamesFound = false; + +> DELETE 1 @ 1 : 6 + +> CHANGE 1 : 21 @ 1 : 2 + +~ if (parInt1 != 28 && parInt1 != 156) { +~ if (parInt1 == 200) { +~ this.getSentHistory(-1); +~ } else if (parInt1 == 208) { +~ this.getSentHistory(1); +~ } else if (parInt1 == 201) { +~ this.mc.ingameGUI.getChatGUI().scroll(this.mc.ingameGUI.getChatGUI().getLineCount() - 1); +~ } else if (parInt1 == 209) { +~ this.mc.ingameGUI.getChatGUI().scroll(-this.mc.ingameGUI.getChatGUI().getLineCount() + 1); +~ } else { +~ this.inputField.textboxKeyTyped(parChar1, parInt1); +~ } +~ } else { +~ String s = this.inputField.getText().trim(); +~ if (s.length() > 0) { +~ this.sendChatMessage(s); +~ } +~ +~ this.mc.displayGuiScreen((GuiScreen) null); +~ } + +> CHANGE 25 : 26 @ 25 : 26 ~ protected void mouseClicked(int parInt1, int parInt2, int parInt3) { diff --git a/patches/minecraft/net/minecraft/client/gui/GuiScreen.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiScreen.edit.java index b61f717..5bdaf8a 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiScreen.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiScreen.edit.java @@ -90,7 +90,7 @@ ~ protected void keyTyped(char parChar1, int parInt1) { ~ if (((this.mc.theWorld == null || this.mc.thePlayer.getHealth() <= 0.0F) && parInt1 == 1) ~ || parInt1 == this.mc.gameSettings.keyBindClose.getKeyCode() -~ || (parInt1 == 1 && this.mc.gameSettings.keyBindClose.getKeyCode() == 0)) { +~ || (parInt1 == 1 && (this.mc.gameSettings.keyBindClose.getKeyCode() == 0 || this.mc.areKeysLocked()))) { > INSERT 4 : 6 @ 4 diff --git a/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java index b175de8..66b65e2 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java @@ -13,9 +13,9 @@ ~ GameSettings.Options.PARTICLES, GameSettings.Options.FXAA, GameSettings.Options.MIPMAP_LEVELS, ~ GameSettings.Options.BLOCK_ALTERNATIVES, GameSettings.Options.ENTITY_SHADOWS, GameSettings.Options.FOG, -~ GameSettings.Options.HUD_FPS, GameSettings.Options.HUD_COORDS, GameSettings.Options.HUD_PLAYER, -~ GameSettings.Options.HUD_STATS, GameSettings.Options.HUD_WORLD, GameSettings.Options.HUD_24H, -~ GameSettings.Options.CHUNK_FIX }; +~ GameSettings.Options.FULLSCREEN, GameSettings.Options.HUD_FPS, GameSettings.Options.HUD_COORDS, +~ GameSettings.Options.HUD_PLAYER, GameSettings.Options.HUD_STATS, GameSettings.Options.HUD_WORLD, +~ GameSettings.Options.HUD_24H, GameSettings.Options.CHUNK_FIX }; > CHANGE 11 : 13 @ 11 : 14 diff --git a/patches/minecraft/net/minecraft/client/gui/inventory/GuiContainer.edit.java b/patches/minecraft/net/minecraft/client/gui/inventory/GuiContainer.edit.java index 4923a82..be3a458 100644 --- a/patches/minecraft/net/minecraft/client/gui/inventory/GuiContainer.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/inventory/GuiContainer.edit.java @@ -41,7 +41,7 @@ ~ protected void keyTyped(char parChar1, int parInt1) { ~ if (parInt1 == this.mc.gameSettings.keyBindClose.getKeyCode() ~ || parInt1 == this.mc.gameSettings.keyBindInventory.getKeyCode() -~ || (parInt1 == 1 && this.mc.gameSettings.keyBindClose.getKeyCode() == 0)) { +~ || (parInt1 == 1 && (this.mc.gameSettings.keyBindClose.getKeyCode() == 0 || this.mc.areKeysLocked()))) { > CHANGE 1 : 3 @ 1 : 9 diff --git a/patches/minecraft/net/minecraft/client/gui/inventory/GuiContainerCreative.edit.java b/patches/minecraft/net/minecraft/client/gui/inventory/GuiContainerCreative.edit.java index d59b125..018fec3 100644 --- a/patches/minecraft/net/minecraft/client/gui/inventory/GuiContainerCreative.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/inventory/GuiContainerCreative.edit.java @@ -26,7 +26,7 @@ > CHANGE 13 : 16 @ 13 : 14 -~ if (parInt1 == getCloseKey()) { +~ if (parInt1 == getCloseKey() || (parInt1 == 1 && this.mc.areKeysLocked())) { ~ mc.displayGuiScreen(null); ~ } else if (!this.checkHotbarKeys(parInt1)) { diff --git a/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java b/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java index a19ece7..19bb493 100644 --- a/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java +++ b/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java @@ -124,7 +124,7 @@ > DELETE 58 @ 58 : 75 -> INSERT 13 : 49 @ 13 +> INSERT 13 : 53 @ 13 + if (parOptions == GameSettings.Options.HUD_FPS) { + this.hudFps = !this.hudFps; @@ -162,10 +162,14 @@ + this.fxaa = (this.fxaa + parInt1) % 3; + } + ++ if (parOptions == GameSettings.Options.FULLSCREEN) { ++ this.mc.toggleFullscreen(); ++ } ++ > DELETE 54 @ 54 : 60 -> INSERT 12 : 28 @ 12 +> INSERT 12 : 30 @ 12 + case HUD_COORDS: + return this.hudCoords; @@ -183,6 +187,8 @@ + return this.chunkFix; + case FOG: + return this.fog; ++ case FULLSCREEN: ++ return this.mc.isFullScreen(); > CHANGE 43 : 46 @ 43 : 47 @@ -370,12 +376,13 @@ ~ TOUCHSCREEN("options.touchscreen", false, true), CHAT_SCALE("options.chat.scale", true, false), ~ CHAT_WIDTH("options.chat.width", true, false), CHAT_HEIGHT_FOCUSED("options.chat.height.focused", true, false), -> CHANGE 14 : 19 @ 14 : 15 +> CHANGE 14 : 20 @ 14 : 15 ~ ENTITY_SHADOWS("options.entityShadows", false, true), HUD_FPS("options.hud.fps", false, true), ~ HUD_COORDS("options.hud.coords", false, true), HUD_STATS("options.hud.stats", false, true), ~ HUD_WORLD("options.hud.world", false, true), HUD_PLAYER("options.hud.player", false, true), ~ HUD_24H("options.hud.24h", false, true), CHUNK_FIX("options.chunkFix", false, true), -~ FOG("options.fog", false, true), FXAA("options.fxaa", false, false); +~ FOG("options.fog", false, true), FXAA("options.fxaa", false, false), +~ FULLSCREEN("options.fullscreen", false, true); > EOF diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java index 7230ba0..69e5f00 100644 --- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java +++ b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java @@ -49,6 +49,8 @@ public class PlatformInput { private static boolean enableRepeatEvents = false; private static int functionKeyModifier = GLFW_KEY_F; + public static boolean lockKeys = false; + private static final List keyboardCharList = new LinkedList(); private static class KeyboardEvent { @@ -370,5 +372,13 @@ public class PlatformInput { public static void setFunctionKeyModifier(int key) { functionKeyModifier = KeyboardConstants.getGLFWKeyFromEagler(key); } + + public static void toggleFullscreen() { + // + } + + public static boolean isFullscreen() { + return false; + } } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/Display.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/Display.java index 6d7bf96..2e2d7d7 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/Display.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/Display.java @@ -69,4 +69,12 @@ public class Display { return PlatformInput.wasResized(); } + public static boolean isFullscreen() { + return PlatformInput.isFullscreen(); + } + + public static void toggleFullscreen() { + PlatformInput.toggleFullscreen(); + } + } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java index 78f7952..e9e2eed 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java @@ -8,7 +8,7 @@ public class EaglercraftVersion { /// Customize these to fit your fork: public static final String projectForkName = "EaglercraftX"; - public static final String projectForkVersion = "u7"; + public static final String projectForkVersion = "u8"; public static final String projectForkVendor = "lax1dude"; public static final String projectForkURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; @@ -23,7 +23,7 @@ public class EaglercraftVersion { public static final String projectOriginName = "EaglercraftX"; public static final String projectOriginAuthor = "lax1dude"; public static final String projectOriginRevision = "1.8"; - public static final String projectOriginVersion = "u7"; + public static final String projectOriginVersion = "u8"; public static final String projectOriginURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; diff --git a/sources/resources/assets/eagler/CREDITS.txt b/sources/resources/assets/eagler/CREDITS.txt index 0e41f0a..5a59d44 100644 --- a/sources/resources/assets/eagler/CREDITS.txt +++ b/sources/resources/assets/eagler/CREDITS.txt @@ -16,6 +16,7 @@ - Many bug fixes - Added resource packs - Added screen recording + - Added seamless fullscreen - Created the replit @@ -130,7 +131,7 @@ Project Author: Timothy Lottes, NVIDIA Project URL: https://gist.github.com/kosua20/0c506b81b3812ac900048059d2383126 - Used For: generating and applying patch files in build system + Used For: in-game hardware accelerated FXAA antialiasing (when enabled) * ============================================================================== * diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java index c31e6a5..6eaf900 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java +++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformInput.java @@ -3,14 +3,18 @@ package net.lax1dude.eaglercraft.v1_8.internal; import java.util.LinkedList; import java.util.List; +import net.lax1dude.eaglercraft.v1_8.internal.teavm.TeaVMUtils; import org.teavm.jso.JSBody; +import org.teavm.jso.JSObject; import org.teavm.jso.browser.TimerHandler; import org.teavm.jso.browser.Window; +import org.teavm.jso.dom.events.Event; import org.teavm.jso.dom.events.EventListener; import org.teavm.jso.dom.events.KeyboardEvent; import org.teavm.jso.dom.events.MouseEvent; import org.teavm.jso.dom.events.WheelEvent; import org.teavm.jso.dom.html.HTMLCanvasElement; +import org.teavm.jso.dom.html.HTMLElement; import org.teavm.jso.webgl.WebGLFramebuffer; import org.teavm.jso.webgl.WebGLRenderbuffer; @@ -88,6 +92,11 @@ public class PlatformInput { private static long mouseGrabTimer = 0l; private static int mouseUngrabTimeout = -1; private static boolean pointerLockFlag = false; + + private static JSObject fullscreenQuery = null; + + public static boolean keyboardLockSupported = false; + public static boolean lockKeys = false; @JSBody(params = { }, script = "window.onbeforeunload = () => {return false;};") private static native void onBeforeCloseRegister(); @@ -153,7 +162,9 @@ public class PlatformInput { @Override public void handleEvent(KeyboardEvent evt) { int w = getWhich(evt); - if (w == 122) return; // F11 + if (w == 122) { // F11 + toggleFullscreen(); + } evt.preventDefault(); evt.stopPropagation(); if(!enableRepeatEvents && evt.isRepeat()) return; @@ -166,7 +177,6 @@ public class PlatformInput { @Override public void handleEvent(KeyboardEvent evt) { int w = getWhich(evt); - if (w == 122) return; // F11 evt.preventDefault(); evt.stopPropagation(); if(!enableRepeatEvents && evt.isRepeat()) return; @@ -230,6 +240,19 @@ public class PlatformInput { } }); onBeforeCloseRegister(); + + fullscreenQuery = fullscreenMediaQuery(); + if (keyboardLockSupported = checkKeyboardLockSupported()) { + TeaVMUtils.addEventListener(fullscreenQuery, "change", new EventListener() { + @Override + public void handleEvent(Event evt) { + if (!mediaQueryMatches(evt)) { + unlockKeys(); + lockKeys = false; + } + } + }); + } } @JSBody(params = { }, script = "if(window.navigator.userActivation){return window.navigator.userActivation.hasBeenActive;}else{return false;}") @@ -526,5 +549,46 @@ public class PlatformInput { mouseEvents.clear(); keyEvents.clear(); } + + @JSBody(params = {}, script = "return window.matchMedia('(display-mode: fullscreen)');") + private static native JSObject fullscreenMediaQuery(); + + @JSBody(params = { "mediaQuery" }, script = "return mediaQuery.matches;") + private static native boolean mediaQueryMatches(JSObject mediaQuery); + + public static void toggleFullscreen() { + if (isFullscreen()) { + if (keyboardLockSupported) { + unlockKeys(); + lockKeys = false; + } + exitFullscreen(); + } else { + if (keyboardLockSupported) { + lockKeys(); + lockKeys = true; + } + requestFullscreen(canvas); + } + } + + public static boolean isFullscreen() { + return mediaQueryMatches(fullscreenQuery); + } + + @JSBody(params = { }, script = "window.navigator.keyboard.lock();") + private static native void lockKeys(); + + @JSBody(params = { }, script = "window.navigator.keyboard.unlock();") + private static native void unlockKeys(); + + @JSBody(params = { }, script = "return 'keyboard' in window.navigator && 'lock' in window.navigator.keyboard;") + private static native boolean checkKeyboardLockSupported(); + + @JSBody(params = { }, script = "document.exitFullscreen();") + private static native void exitFullscreen(); + + @JSBody(params = { "element" }, script = "element.requestFullscreen();") + private static native void requestFullscreen(HTMLElement element); }