diff --git a/client_version b/client_version index 0388712..dc93039 100644 --- a/client_version +++ b/client_version @@ -1 +1 @@ -u40 \ No newline at end of file +u41 \ 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 98573c1..976a5e1 100644 --- a/patches/minecraft/net/minecraft/client/Minecraft.edit.java +++ b/patches/minecraft/net/minecraft/client/Minecraft.edit.java @@ -18,7 +18,7 @@ > DELETE 1 @ 1 : 4 -> CHANGE 1 : 73 @ 1 : 4 +> CHANGE 1 : 74 @ 1 : 4 ~ ~ import net.lax1dude.eaglercraft.v1_8.ClientUUIDLoadingCache; @@ -52,6 +52,7 @@ ~ import net.lax1dude.eaglercraft.v1_8.minecraft.EaglerFontRenderer; ~ import net.lax1dude.eaglercraft.v1_8.minecraft.EnumInputEvent; ~ import net.lax1dude.eaglercraft.v1_8.minecraft.GuiScreenGenericErrorMessage; +~ import net.lax1dude.eaglercraft.v1_8.minecraft.GuiScreenVideoSettingsWarning; ~ import net.lax1dude.eaglercraft.v1_8.notifications.ServerNotificationRenderer; ~ import net.lax1dude.eaglercraft.v1_8.opengl.EaglerMeshLoader; ~ import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU; @@ -358,21 +359,27 @@ ~ mainMenu = new GuiConnecting(mainMenu, this, this.serverName, this.serverPort); -> INSERT 2 : 10 @ 2 +> CHANGE 2 : 5 @ 2 : 7 -+ mainMenu = new GuiScreenEditProfile(mainMenu); -+ -+ if (!EagRuntime.getConfiguration().isForceProfanityFilter() && !gameSettings.hasShownProfanityFilter) { -+ mainMenu = new GuiScreenContentWarning(mainMenu); -+ } -+ -+ this.displayGuiScreen(mainMenu); -+ +~ int vidIssues = gameSettings.checkBadVideoSettings(); +~ if (vidIssues != 0) { +~ mainMenu = new GuiScreenVideoSettingsWarning(mainMenu, vidIssues); -> DELETE 3 @ 3 : 6 +> CHANGE 2 : 6 @ 2 : 7 -> CHANGE 1 : 7 @ 1 : 9 +~ mainMenu = new GuiScreenEditProfile(mainMenu); +~ +~ if (!EagRuntime.getConfiguration().isForceProfanityFilter() && !gameSettings.hasShownProfanityFilter) { +~ mainMenu = new GuiScreenContentWarning(mainMenu); +> CHANGE 2 : 14 @ 2 : 3 + +~ this.displayGuiScreen(mainMenu); +~ +~ this.renderEngine.deleteTexture(this.mojangLogo); +~ this.mojangLogo = null; +~ this.loadingScreen = new LoadingScreenRenderer(this); +~ ~ while (Mouse.next()) ~ ; ~ while (Keyboard.next()) @@ -959,10 +966,11 @@ + } + -> INSERT 26 : 28 @ 26 +> INSERT 26 : 29 @ 26 -+ boolean miningTouch = isMiningTouch(); -+ boolean useTouch = thePlayer.getItemShouldUseOnTouchEagler(); ++ boolean touchMode = PointerInputAbstraction.isTouchMode(); ++ boolean miningTouch = touchMode && isMiningTouch(); ++ boolean useTouch = touchMode && thePlayer.getItemShouldUseOnTouchEagler(); > CHANGE 1 : 2 @ 1 : 2 diff --git a/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java index 505bdaf..be42ea7 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiVideoSettings.edit.java @@ -5,10 +5,11 @@ # Version: 1.0 # Author: lax1dude -> CHANGE 3 : 8 @ 3 : 9 +> CHANGE 3 : 9 @ 3 : 9 ~ ~ import net.lax1dude.eaglercraft.v1_8.Display; +~ import net.lax1dude.eaglercraft.v1_8.minecraft.GuiScreenVideoSettingsWarning; ~ import net.lax1dude.eaglercraft.v1_8.opengl.EaglercraftGPU; ~ import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; ~ import net.lax1dude.eaglercraft.v1_8.recording.ScreenRecordingController; @@ -71,7 +72,18 @@ ~ ~ protected void actionPerformed(GuiButton parGuiButton) { -> CHANGE 9 : 10 @ 9 : 10 +> CHANGE 3 : 9 @ 3 : 4 + +~ GuiScreen contScreen = parentGuiScreen; +~ int vidIssues = mc.gameSettings.checkBadVideoSettings(); +~ if (vidIssues != 0) { +~ contScreen = new GuiScreenVideoSettingsWarning(contScreen, vidIssues); +~ } +~ this.mc.displayGuiScreen(contScreen); + +> DELETE 1 @ 1 : 2 + +> CHANGE 3 : 4 @ 3 : 4 ~ protected void mouseClicked(int parInt1, int parInt2, int parInt3) { diff --git a/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java b/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java index 26e1345..f3907c8 100644 --- a/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java +++ b/patches/minecraft/net/minecraft/client/settings/GameSettings.edit.java @@ -14,7 +14,7 @@ > DELETE 1 @ 1 : 3 -> INSERT 3 : 31 @ 3 +> INSERT 3 : 32 @ 3 + + import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayManager; @@ -39,6 +39,7 @@ + import net.lax1dude.eaglercraft.v1_8.internal.KeyboardConstants; + import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; + import net.lax1dude.eaglercraft.v1_8.log4j.Logger; ++ import net.lax1dude.eaglercraft.v1_8.minecraft.GuiScreenVideoSettingsWarning; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.EaglerDeferredConfig; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.deferred.EaglerDeferredPipeline; + import net.lax1dude.eaglercraft.v1_8.opengl.ext.dynamiclights.DynamicLightsStateManager; @@ -95,7 +96,7 @@ ~ public int guiScale = 3; -> INSERT 3 : 23 @ 3 +> INSERT 3 : 24 @ 3 + public boolean hudFps = true; + public boolean hudCoords = true; @@ -117,6 +118,7 @@ + public boolean hasShownProfanityFilter = false; + public float touchControlOpacity = 1.0f; + public boolean hideDefaultUsernameWarning = false; ++ public boolean hideVideoSettingsWarning = false; > CHANGE 1 : 15 @ 1 : 2 @@ -536,7 +538,7 @@ ~ for (EnumPlayerModelParts enumplayermodelparts : EnumPlayerModelParts._VALUES) { -> INSERT 4 : 70 @ 4 +> INSERT 4 : 74 @ 4 + + if (astring[0].equals("enableFNAWSkins")) { @@ -603,6 +605,10 @@ + this.hideDefaultUsernameWarning = astring[1].equals("true"); + } + ++ if (astring[0].equals("hideVideoSettingsWarning")) { ++ hideVideoSettingsWarning = astring[1].equals("true"); ++ } ++ + deferredShaderConf.readOption(astring[0], astring[1]); > CHANGE 6 : 23 @ 6 : 7 @@ -666,7 +672,7 @@ > DELETE 9 @ 9 : 20 -> INSERT 5 : 36 @ 5 +> INSERT 5 : 37 @ 5 + printwriter.println("hudFps:" + this.hudFps); + printwriter.println("hudWorld:" + this.hudWorld); @@ -699,6 +705,7 @@ + printwriter.println("screenRecordMicVolume:" + this.screenRecordMicVolume); + printwriter.println("touchControlOpacity:" + this.touchControlOpacity); + printwriter.println("hideDefaultUsernameWarning:" + this.hideDefaultUsernameWarning); ++ printwriter.println("hideVideoSettingsWarning:" + this.hideVideoSettingsWarning); > CHANGE 5 : 8 @ 5 : 6 @@ -731,7 +738,7 @@ ~ Math.max(this.renderDistanceChunks, 2), this.chatVisibility, this.chatColours, i)); -> INSERT 36 : 44 @ 36 +> INSERT 36 : 60 @ 36 + private String toJSONArray(List e) { + JSONArray arr = new JSONArray(); @@ -741,6 +748,22 @@ + return arr.toString(); + } + ++ public int checkBadVideoSettings() { ++ return hideVideoSettingsWarning ? 0 ++ : ((renderDistanceChunks > 6 ? GuiScreenVideoSettingsWarning.WARNING_RENDER_DISTANCE : 0) ++ | (!enableVsync ? GuiScreenVideoSettingsWarning.WARNING_VSYNC : 0) ++ | (limitFramerate < 30 ? GuiScreenVideoSettingsWarning.WARNING_FRAME_LIMIT : 0)); ++ } ++ ++ public void fixBadVideoSettings() { ++ if (renderDistanceChunks > 6) ++ renderDistanceChunks = 4; ++ if (!enableVsync) ++ enableVsync = true; ++ if (limitFramerate < 30) ++ limitFramerate = 260; ++ } ++ > CHANGE 4 : 5 @ 4 : 5 diff --git a/patches/resources/assets/minecraft/lang/en_US.edit.lang b/patches/resources/assets/minecraft/lang/en_US.edit.lang index 3ca9626..2138769 100644 --- a/patches/resources/assets/minecraft/lang/en_US.edit.lang +++ b/patches/resources/assets/minecraft/lang/en_US.edit.lang @@ -257,7 +257,7 @@ + eaglercraft.command.clientStub=This command is client side! + -> INSERT 163 : 545 @ 163 +> INSERT 163 : 561 @ 163 + eaglercraft.singleplayer.busy.killTask=Cancel Task + eaglercraft.singleplayer.busy.cancelWarning=Are you sure? @@ -641,6 +641,22 @@ + + eaglercraft.touch.interact.entity=Interact + ++ eaglercraft.options.badVideoSettingsDetected.title=Issues Detected ++ eaglercraft.options.badVideoSettingsDetected.0=Some of your video settings may be causing ++ eaglercraft.options.badVideoSettingsDetected.1=the game to lag excessively ++ eaglercraft.options.badVideoSettingsDetected.vsync.0=VSync is disabled, some browsers require ++ eaglercraft.options.badVideoSettingsDetected.vsync.1=VSync to be enabled to hint when the ++ eaglercraft.options.badVideoSettingsDetected.vsync.2=framebuffer has updated. If the game feels ++ eaglercraft.options.badVideoSettingsDetected.vsync.3=significantly slower than is indicated by ++ eaglercraft.options.badVideoSettingsDetected.vsync.4=the FPS counter, you should enable VSync. ++ eaglercraft.options.badVideoSettingsDetected.renderDistance.0=Render distance is %d chunks, most devices ++ eaglercraft.options.badVideoSettingsDetected.renderDistance.1=lag when the render distance is greater ++ eaglercraft.options.badVideoSettingsDetected.renderDistance.2=than 4 chunks ++ eaglercraft.options.badVideoSettingsDetected.frameLimit.0=Framerate limit is set to %d ++ eaglercraft.options.badVideoSettingsDetected.fixSettings=Fix Settings ++ eaglercraft.options.badVideoSettingsDetected.continueAnyway=Continue Anyway ++ eaglercraft.options.badVideoSettingsDetected.doNotShowAgain=Do Not Show Again ++ > INSERT 18 : 19 @ 18 diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformRuntime.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformRuntime.java index 3ea0ba4..b943f00 100644 --- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformRuntime.java +++ b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformRuntime.java @@ -268,51 +268,53 @@ public class PlatformRuntime { glfwSwapInterval(0); - KHRDebug.glDebugMessageCallbackKHR(new GLDebugMessageKHRCallbackI() { - @Override - public void invoke(int source, int type, int id, int severity, int length, long message, long userParam) { - StringBuilder b = new StringBuilder(); - b.append("[KHR DEBUG #"); b.append(id); b.append("] "); - - switch(source) { - case KHRDebug.GL_DEBUG_SOURCE_API_KHR: b.append("[API - "); break; - case KHRDebug.GL_DEBUG_SOURCE_APPLICATION_KHR: b.append("[APPLICATION - "); break; - case KHRDebug.GL_DEBUG_SOURCE_SHADER_COMPILER_KHR: b.append("[SHADER COMPILER - "); break; - case KHRDebug.GL_DEBUG_SOURCE_THIRD_PARTY_KHR: b.append("[THIRD PARTY - "); break; - case KHRDebug.GL_DEBUG_SOURCE_OTHER_KHR: default: b.append("[OTHER - "); break; + if(!requestedDisableKHRDebug) { + KHRDebug.glDebugMessageCallbackKHR(new GLDebugMessageKHRCallbackI() { + @Override + public void invoke(int source, int type, int id, int severity, int length, long message, long userParam) { + StringBuilder b = new StringBuilder(); + b.append("[KHR DEBUG #"); b.append(id); b.append("] "); + + switch(source) { + case KHRDebug.GL_DEBUG_SOURCE_API_KHR: b.append("[API - "); break; + case KHRDebug.GL_DEBUG_SOURCE_APPLICATION_KHR: b.append("[APPLICATION - "); break; + case KHRDebug.GL_DEBUG_SOURCE_SHADER_COMPILER_KHR: b.append("[SHADER COMPILER - "); break; + case KHRDebug.GL_DEBUG_SOURCE_THIRD_PARTY_KHR: b.append("[THIRD PARTY - "); break; + case KHRDebug.GL_DEBUG_SOURCE_OTHER_KHR: default: b.append("[OTHER - "); break; + } + + switch(type) { + case KHRDebug.GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR: b.append("DEPRECATED BEHAVIOR] "); break; + case KHRDebug.GL_DEBUG_TYPE_ERROR_KHR: b.append("ERROR] "); break; + default: + case KHRDebug.GL_DEBUG_TYPE_OTHER_KHR: b.append("OTHER] "); break; + case KHRDebug.GL_DEBUG_TYPE_PERFORMANCE_KHR: b.append("PERFORMANCE] "); break; + case KHRDebug.GL_DEBUG_TYPE_PORTABILITY_KHR: b.append("PORTABILITY] "); break; + case KHRDebug.GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR: b.append("UNDEFINED BEHAVIOR] "); break; + } + + switch(severity) { + default: + case KHRDebug.GL_DEBUG_SEVERITY_LOW_KHR: b.append("[LOW Severity] "); break; + case KHRDebug.GL_DEBUG_SEVERITY_MEDIUM_KHR: b.append("[MEDIUM Severity] "); break; + case KHRDebug.GL_DEBUG_SEVERITY_HIGH_KHR: b.append("[SEVERE] "); break; + } + + String message2 = GLDebugMessageKHRCallback.getMessage(length, message); + if(message2.contains("GPU stall due to ReadPixels")) return; + b.append(message2); + logger.error(b.toString()); + + StackTraceElement[] ex = new RuntimeException().getStackTrace(); + for(int i = 0; i < ex.length; ++i) { + logger.error(" at {}", ex[i]); + } } - - switch(type) { - case KHRDebug.GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_KHR: b.append("DEPRECATED BEHAVIOR] "); break; - case KHRDebug.GL_DEBUG_TYPE_ERROR_KHR: b.append("ERROR] "); break; - default: - case KHRDebug.GL_DEBUG_TYPE_OTHER_KHR: b.append("OTHER] "); break; - case KHRDebug.GL_DEBUG_TYPE_PERFORMANCE_KHR: b.append("PERFORMANCE] "); break; - case KHRDebug.GL_DEBUG_TYPE_PORTABILITY_KHR: b.append("PORTABILITY] "); break; - case KHRDebug.GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_KHR: b.append("UNDEFINED BEHAVIOR] "); break; - } - - switch(severity) { - default: - case KHRDebug.GL_DEBUG_SEVERITY_LOW_KHR: b.append("[LOW Severity] "); break; - case KHRDebug.GL_DEBUG_SEVERITY_MEDIUM_KHR: b.append("[MEDIUM Severity] "); break; - case KHRDebug.GL_DEBUG_SEVERITY_HIGH_KHR: b.append("[SEVERE] "); break; - } - - String message2 = GLDebugMessageKHRCallback.getMessage(length, message); - if(message2.contains("GPU stall due to ReadPixels")) return; - b.append(message2); - logger.error(b.toString()); - - StackTraceElement[] ex = new RuntimeException().getStackTrace(); - for(int i = 0; i < ex.length; ++i) { - logger.error(" at {}", ex[i]); - } - } - }, 0l); - - GLES30.glEnable(KHRDebug.GL_DEBUG_OUTPUT_KHR); - GLES30.glEnable(KHRDebug.GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR); + }, 0l); + + GLES30.glEnable(KHRDebug.GL_DEBUG_OUTPUT_KHR); + GLES30.glEnable(KHRDebug.GL_DEBUG_OUTPUT_SYNCHRONOUS_KHR); + } logger.info("Initializing Audio..."); PlatformAudio.platformInitialize(); @@ -361,6 +363,7 @@ public class PlatformRuntime { private static EnumPlatformANGLE requestedANGLEPlatform = EnumPlatformANGLE.DEFAULT; private static int requestedGLVersion = 300; + private static boolean requestedDisableKHRDebug = false; public static void requestANGLE(EnumPlatformANGLE plaf) { requestedANGLEPlatform = plaf; @@ -370,6 +373,10 @@ public class PlatformRuntime { requestedGLVersion = i; } + public static void requestDisableKHRDebug(boolean dis) { + requestedDisableKHRDebug = dis; + } + public static EnumPlatformANGLE getPlatformANGLE() { return rendererANGLEPlatform; } diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformWebRTC.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformWebRTC.java index cfea7c3..f9cc34b 100644 --- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformWebRTC.java +++ b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformWebRTC.java @@ -3,7 +3,6 @@ package net.lax1dude.eaglercraft.v1_8.internal; import dev.onvoid.webrtc.*; import dev.onvoid.webrtc.internal.NativeLoader; import net.lax1dude.eaglercraft.v1_8.EagRuntime; -import net.lax1dude.eaglercraft.v1_8.EagUtils; import net.lax1dude.eaglercraft.v1_8.log4j.LogManager; import net.lax1dude.eaglercraft.v1_8.log4j.Logger; import net.lax1dude.eaglercraft.v1_8.sp.lan.LANPeerEvent; @@ -257,14 +256,19 @@ public class PlatformWebRTC { @Override public void onStateChange() { if (dataChannel != null && dataChannel.getState() == RTCDataChannelState.OPEN) { - scheduleTask(-1l, () -> { - while (true) { + final Runnable[] retry = new Runnable[1]; + final int[] loopCount = new int[1]; + scheduleTask(-1l, retry[0] = () -> { + f: { synchronized (lock1) { if (iceCandidates.isEmpty()) { - break; + break f; } } - EagUtils.sleep(1); + if(++loopCount[0] < 5) { + scheduleTask(1000l, retry[0]); + } + return; } synchronized (lock2) { clientDataChannelClosed = false; @@ -562,14 +566,20 @@ public class PlatformWebRTC { @Override public void onDataChannel(RTCDataChannel dataChannel) { - scheduleTask(-1l, () -> { - while (true) { + final Runnable[] retry = new Runnable[1]; + final int[] loopCount = new int[1]; + scheduleTask(-1l, retry[0] = () -> { + int i = 0; + f: { synchronized (lock3) { if (iceCandidates.isEmpty()) { - break; + break f; } } - EagUtils.sleep(1); + if(++loopCount[0] < 5) { + scheduleTask(1000l, retry[0]); + } + return; } if (dataChannel == null) return; synchronized (fuckTeaVM) { diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/lwjgl/LWJGLEntryPoint.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/lwjgl/LWJGLEntryPoint.java index 22321c6..287f14d 100644 --- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/lwjgl/LWJGLEntryPoint.java +++ b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/lwjgl/LWJGLEntryPoint.java @@ -87,6 +87,8 @@ public class LWJGLEntryPoint { PlatformRuntime.requestGL(300); }else if(args[i].equalsIgnoreCase("gles=310")) { PlatformRuntime.requestGL(310); + }else if(args[i].equalsIgnoreCase("disableKHRDebug")) { + PlatformRuntime.requestDisableKHRDebug(true); }else { EnumPlatformANGLE angle = EnumPlatformANGLE.fromId(args[i]); if(angle != EnumPlatformANGLE.DEFAULT) { 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 5fa0208..6bf5dd7 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EaglercraftVersion.java @@ -10,7 +10,7 @@ public class EaglercraftVersion { /// Customize these to fit your fork: public static final String projectForkName = "EaglercraftX"; - public static final String projectForkVersion = "u40"; + public static final String projectForkVersion = "u41"; public static final String projectForkVendor = "lax1dude"; public static final String projectForkURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; @@ -20,20 +20,20 @@ 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 = "u40"; + public static final String projectOriginVersion = "u41"; public static final String projectOriginURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; // rest in peace // EPK Version Identifier - public static final String EPKVersionIdentifier = "u40"; // Set to null to disable EPK version check + public static final String EPKVersionIdentifier = "u41"; // Set to null to disable EPK version check // Updating configuration public static final boolean enableUpdateService = true; public static final String updateBundlePackageName = "net.lax1dude.eaglercraft.v1_8.client"; - public static final int updateBundlePackageVersionInt = 40; + public static final int updateBundlePackageVersionInt = 41; public static final String updateLatestLocalStorageKey = "latestUpdate_" + updateBundlePackageName; diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/GuiScreenVideoSettingsWarning.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/GuiScreenVideoSettingsWarning.java new file mode 100644 index 0000000..7016124 --- /dev/null +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/GuiScreenVideoSettingsWarning.java @@ -0,0 +1,114 @@ +package net.lax1dude.eaglercraft.v1_8.minecraft; + +import java.util.ArrayList; +import java.util.List; + +import net.minecraft.client.gui.GuiButton; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.resources.I18n; +import net.minecraft.util.EnumChatFormatting; + +/** + * Copyright (c) 2024 lax1dude. All Rights Reserved. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + */ +public class GuiScreenVideoSettingsWarning extends GuiScreen { + + private final GuiScreen cont; + private final int mask; + private final List messages = new ArrayList<>(); + private int top = 0; + + public static final int WARNING_VSYNC = 1; + public static final int WARNING_RENDER_DISTANCE = 2; + public static final int WARNING_FRAME_LIMIT = 4; + + public GuiScreenVideoSettingsWarning(GuiScreen cont, int mask) { + this.cont = cont; + this.mask = mask; + } + + public void initGui() { + messages.clear(); + messages.add(EnumChatFormatting.RED + I18n.format("options.badVideoSettingsDetected.title")); + messages.add(null); + messages.add(EnumChatFormatting.GRAY + I18n.format("options.badVideoSettingsDetected.0")); + messages.add(EnumChatFormatting.GRAY + I18n.format("options.badVideoSettingsDetected.1")); + if((mask & WARNING_VSYNC) != 0) { + messages.add(null); + messages.add(I18n.format("options.badVideoSettingsDetected.vsync.0")); + messages.add(I18n.format("options.badVideoSettingsDetected.vsync.1")); + messages.add(I18n.format("options.badVideoSettingsDetected.vsync.2")); + messages.add(I18n.format("options.badVideoSettingsDetected.vsync.3")); + messages.add(I18n.format("options.badVideoSettingsDetected.vsync.4")); + } + if((mask & WARNING_RENDER_DISTANCE) != 0) { + messages.add(null); + messages.add(I18n.format("options.badVideoSettingsDetected.renderDistance.0", mc.gameSettings.renderDistanceChunks)); + messages.add(I18n.format("options.badVideoSettingsDetected.renderDistance.1")); + messages.add(I18n.format("options.badVideoSettingsDetected.renderDistance.2")); + } + if((mask & WARNING_FRAME_LIMIT) != 0) { + messages.add(null); + messages.add(I18n.format("options.badVideoSettingsDetected.frameLimit.0", mc.gameSettings.limitFramerate)); + } + int j = 0; + for(int i = 0, l = messages.size(); i < l; ++i) { + if(messages.get(i) != null) { + j += 9; + }else { + j += 5; + } + } + top = this.height / 6 + j / -12; + j += top; + buttonList.clear(); + buttonList.add(new GuiButton(0, this.width / 2 - 100, j + 16, I18n.format("options.badVideoSettingsDetected.fixSettings"))); + buttonList.add(new GuiButton(1, this.width / 2 - 100, j + 40, I18n.format("options.badVideoSettingsDetected.continueAnyway"))); + buttonList.add(new GuiButton(2, this.width / 2 - 100, j + 64, I18n.format("options.badVideoSettingsDetected.doNotShowAgain"))); + } + + public void drawScreen(int par1, int par2, float par3) { + this.drawDefaultBackground(); + int j = 0; + for(int i = 0, l = messages.size(); i < l; ++i) { + String str = messages.get(i); + if(str != null) { + this.drawCenteredString(fontRendererObj, str, this.width / 2, top + j, 16777215); + j += 9; + }else { + j += 5; + } + } + super.drawScreen(par1, par2, par3); + } + + protected void actionPerformed(GuiButton par1GuiButton) { + if(par1GuiButton.id == 0) { + mc.gameSettings.fixBadVideoSettings(); + mc.gameSettings.saveOptions(); + if((mask & WARNING_RENDER_DISTANCE) != 0) { + mc.renderGlobal.loadRenderers(); + } + mc.displayGuiScreen(cont); + }else if(par1GuiButton.id == 1) { + mc.displayGuiScreen(cont); + }else if(par1GuiButton.id == 2) { + mc.gameSettings.hideVideoSettingsWarning = true; + mc.gameSettings.saveOptions(); + mc.displayGuiScreen(cont); + } + } + +} diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/lan/LANClientPeer.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/lan/LANClientPeer.java index d50ff53..5d00117 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/lan/LANClientPeer.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/lan/LANClientPeer.java @@ -50,6 +50,7 @@ class LANClientPeer { PlatformWebRTC.serverLANPeerICECandidates(clientId, candidates); long millis = EagRuntime.steadyTimeMillis(); do { + PlatformWebRTC.runScheduledTasks(); LANPeerEvent evt; if((evt = PlatformWebRTC.serverLANGetEvent(clientId)) != null) { if(evt instanceof LANPeerEvent.LANPeerICECandidateEvent) { @@ -78,6 +79,7 @@ class LANClientPeer { PlatformWebRTC.serverLANPeerDescription(clientId, description); long millis = EagRuntime.steadyTimeMillis(); do { + PlatformWebRTC.runScheduledTasks(); LANPeerEvent evt; if((evt = PlatformWebRTC.serverLANGetEvent(clientId)) != null) { if(evt instanceof LANPeerEvent.LANPeerDescriptionEvent) { @@ -105,6 +107,7 @@ class LANClientPeer { if(state == SENT_ICE_CANDIDATE) { long millis = EagRuntime.steadyTimeMillis(); do { + PlatformWebRTC.runScheduledTasks(); LANPeerEvent evt; while((evt = PlatformWebRTC.serverLANGetEvent(clientId)) != null && evt instanceof LANPeerEvent.LANPeerICECandidateEvent) { // skip ice candidates diff --git a/sources/resources/EPKVersionIdentifier.txt b/sources/resources/EPKVersionIdentifier.txt index 0388712..dc93039 100644 --- a/sources/resources/EPKVersionIdentifier.txt +++ b/sources/resources/EPKVersionIdentifier.txt @@ -1 +1 @@ -u40 \ No newline at end of file +u41 \ No newline at end of file diff --git a/sources/resources/plugin_download.zip b/sources/resources/plugin_download.zip index 42d0bf7..f6df894 100644 Binary files a/sources/resources/plugin_download.zip and b/sources/resources/plugin_download.zip differ diff --git a/sources/resources/relay_download.zip b/sources/resources/relay_download.zip index 82fc9f6..ab0c491 100644 Binary files a/sources/resources/relay_download.zip and b/sources/resources/relay_download.zip differ diff --git a/sources/teavm-boot-menu/java/net/lax1dude/eaglercraft/v1_8/boot_menu/teavm/BootMenuDatastore.java b/sources/teavm-boot-menu/java/net/lax1dude/eaglercraft/v1_8/boot_menu/teavm/BootMenuDatastore.java index 7077a69..e2d7416 100644 --- a/sources/teavm-boot-menu/java/net/lax1dude/eaglercraft/v1_8/boot_menu/teavm/BootMenuDatastore.java +++ b/sources/teavm-boot-menu/java/net/lax1dude/eaglercraft/v1_8/boot_menu/teavm/BootMenuDatastore.java @@ -314,7 +314,7 @@ public class BootMenuDatastore { @Override public void handleEvent() { IDBCursor c = r.getResult(); - if(c == null || c.getKey() == null || c.getValue() == null) { + if(c == null || c.getKey() == null) { cb.complete(res[0]); return; } diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformApplication.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformApplication.java index 6806aa8..2f529d3 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformApplication.java +++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformApplication.java @@ -68,29 +68,34 @@ public class PlatformApplication { } public static void setClipboard(String text) { + boolean b = false; try { - setClipboard0(text); + b = setClipboard0(text); }catch(Throwable t) { PlatformRuntime.logger.error("Exception setting clipboard data"); + } + if(!b) { try { Window.prompt("Here is the text you're trying to copy:", text); }catch(Throwable t2) { } } } - + public static String getClipboard() { + String ret = null; try { - return getClipboard0(); + ret = getClipboard0(); }catch(Throwable t) { PlatformRuntime.logger.error("Exception getting clipboard data"); + } + if(ret == null) { try { - String ret = Window.prompt("Please enter the text to paste:"); - return ret != null ? ret : ""; + ret = Window.prompt("Please enter the text to paste:"); }catch(Throwable t2) { - return ""; } } + return ret != null ? ret : ""; } @JSFunctor @@ -114,11 +119,11 @@ public class PlatformApplication { }); } - @JSBody(params = { "cb" }, script = "if(!navigator.clipboard) { cb(prompt(\"Please enter the text to paste:\") || \"\"); } else if (!navigator.clipboard.readText) cb(\"\"); else navigator.clipboard.readText().then(function(s) { cb(s); }, function(s) { cb(\"\"); });") + @JSBody(params = { "cb" }, script = "if(!navigator.clipboard) { cb(null); } else if (!navigator.clipboard.readText) cb(null); else navigator.clipboard.readText().then(function(s) { cb(s || null); }, function() { cb(null); });") private static native void getClipboard1(StupidFunctionResolveString cb); - @JSBody(params = { "str" }, script = "if(navigator.clipboard) navigator.clipboard.writeText(str);") - private static native void setClipboard0(String str); + @JSBody(params = { "str" }, script = "if(navigator.clipboard) { navigator.clipboard.writeText(str); return true; } else { return false; }") + private static native boolean setClipboard0(String str); public static void setLocalStorage(String name, byte[] data) { setLocalStorage(name, data, true); diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformRuntime.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformRuntime.java index afc1005..d64bdcc 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformRuntime.java +++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformRuntime.java @@ -252,7 +252,7 @@ public class PlatformRuntime { } useVisualViewport = false; - if(isVisualViewportSupported(System.currentTimeMillis())) { + if(isVisualViewportSupported()) { if(isEmbeddedInBody) { useVisualViewport = true; }else { @@ -525,8 +525,8 @@ public class PlatformRuntime { return EnumPlatformOS.getFromUA(getUserAgentString()); } - @JSBody(params = { "ts" }, script = "if(ts > 1728322572561 && window[decodeURIComponent(\"%6C%6F%63%61%74%69%6F%6E\")][decodeURIComponent(\"%68%6F%73%74%6E%61%6D%65\")] === decodeURIComponent(\"%65%61%67%6C%65%72%63%72%61%66%74%2E%64%65%76\")) setTimeout(function() { var i = 1; while(i > 0) { ++i; } }, 353000); return (typeof visualViewport !== \"undefined\");") - private static native boolean isVisualViewportSupported(double ts); + @JSBody(params = { }, script = "return (typeof visualViewport !== \"undefined\");") + private static native boolean isVisualViewportSupported(); @JSBody(params = { }, script = "return visualViewport;") static native VisualViewport getVisualViewport(); diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/EarlyLoadScreen.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/EarlyLoadScreen.java index 69f6b97..a0015cb 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/EarlyLoadScreen.java +++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/EarlyLoadScreen.java @@ -279,6 +279,10 @@ public class EarlyLoadScreen { } public static void loadFinal(byte[] image) { + ImageData img = PlatformAssets.loadImageFile(image); + if(img == null) { + return; + } finalTexture = _wglGenTextures(); _wglActiveTexture(GL_TEXTURE0); _wglBindTexture(GL_TEXTURE_2D, finalTexture); @@ -286,11 +290,10 @@ public class EarlyLoadScreen { _wglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); _wglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); _wglTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - ImageData img = PlatformAssets.loadImageFile(image); - IntBuffer upload = PlatformRuntime.allocateIntBuffer(256*256); + IntBuffer upload = PlatformRuntime.allocateIntBuffer(img.width * img.height); upload.put(img.pixels); upload.flip(); - _wglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_RGBA, GL_UNSIGNED_BYTE, upload); + _wglTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.width, img.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, upload); PlatformRuntime.freeIntBuffer(upload); } diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/IndexedDBFilesystem.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/IndexedDBFilesystem.java index 8a75b99..f6e3d1e 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/IndexedDBFilesystem.java +++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/IndexedDBFilesystem.java @@ -290,7 +290,7 @@ public class IndexedDBFilesystem implements IEaglerFilesystem { @Override public void handleEvent() { IDBCursor c = r.getResult(); - if(c == null || c.getKey() == null || c.getValue() == null) { + if(c == null || c.getKey() == null) { cb.complete(res[0]); return; }