diff --git a/README.md b/README.md index d3523f2..d8b5a8a 100644 --- a/README.md +++ b/README.md @@ -163,9 +163,11 @@ The default eaglercraftXOpts values is this: - `allowFNAWSkins:` can be used to disable the high poly FNAW skins - `localStorageNamespace:` can be used to change the prefix of the local storage keys (Default: `"_eaglercraftX"`) - `enableMinceraft:` can be used to disable the "Minceraft" title screen +- `crashOnUncaughtExceptions:` display crash reports when `window.onerror` is fired - `hooks:` can be used to define JavaScript callbacks for certain events * `localStorageSaved:` JavaScript callback to save local storage keys * `localStorageLoaded:` JavaScript callback to load local storage keys + * `crashReportShow:` JavaScript callback when a crash report is shown ### Using Hooks @@ -193,6 +195,17 @@ Be aware that the client will still save the key to the browser's local storage On a normal client you will only ever need to handle local storage keys called `p` (profile), `g` (game settings), `s` (server list), `r` (shared world relays), in your hooks functions. Feel free to just ignore any other keys. It is guaranteed that the data the client stores will always be valid base64, so it is best practice to decode it to raw binary first if possible to reduce it's size before saving it to something like a MySQL database in your backend if you are trying to implement some kind of profile syncing system for your website. The keys already have GZIP compression applied to them by default so don't bother trying to compress them yourself a second time because it won't reduce their size. +### Crash Report Hook + +The `crashReportShow` hook can be used to capture crash reports and append additional text to them. It takes two parameters, the crash report as a string and a callback function for appending text. Do not use the callback function outside the body of the hook. + + hooks: { + crashReportShow: function(report, customMessageCB) { + // 'report' is crash report as a string + customMessageCB("Hello from crashReportShow hook!"); + } + } + ## Developing a Client There is currently no system in place to make forks of 1.8 and merge commits made to the patch files in this repository with the patch files or workspace of the fork, you're on your own if you try to keep a fork of this repo for reasons other than to contribute to it diff --git a/client_version b/client_version index 5e6a25e..b9b626a 100644 --- a/client_version +++ b/client_version @@ -1 +1 @@ -u35 \ No newline at end of file +u36 \ 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 f24b1b0..b6723cd 100644 --- a/patches/minecraft/net/minecraft/client/Minecraft.edit.java +++ b/patches/minecraft/net/minecraft/client/Minecraft.edit.java @@ -741,12 +741,13 @@ + } + -> CHANGE 6 : 17 @ 6 : 54 +> CHANGE 6 : 18 @ 6 : 54 ~ Minecraft.getMinecraft().getRenderManager().setEnableFNAWSkins(this.gameSettings.enableFNAWSkins); ~ session.reset(); ~ SingleplayerServerController.launchEaglercraftServer(folderName, gameSettings.difficulty.getDifficultyId(), ~ Math.max(gameSettings.renderDistanceChunks, 2), worldSettingsIn); +~ EagRuntime.setMCServerWindowGlobal("singleplayer"); ~ this.displayGuiScreen(new GuiScreenIntegratedServerBusy( ~ new GuiScreenSingleplayerConnecting(new GuiMainMenu(), "Connecting to " + folderName), ~ "singleplayer.busy.startingIntegratedServer", "singleplayer.failed.startingIntegratedServer", @@ -787,7 +788,26 @@ ~ return EaglercraftGPU.glGetString(7937) + " GL version " + EaglercraftGPU.glGetString(7938) + ", " ~ + EaglercraftGPU.glGetString(7936); -> DELETE 2 @ 2 : 12 +> CHANGE 2 : 5 @ 2 : 5 + +~ theCrash.getCategory().addCrashSectionCallable("Is Eagler Shaders", new Callable() { +~ public String call() throws Exception { +~ return Minecraft.this.gameSettings.shaders ? "Yes" : "No"; + +> CHANGE 2 : 6 @ 2 : 5 + +~ theCrash.getCategory().addCrashSectionCallable("Is Dynamic Lights", new Callable() { +~ public String call() throws Exception { +~ return !Minecraft.this.gameSettings.shaders && Minecraft.this.gameSettings.enableDynamicLights ? "Yes" +~ : "No"; + +> INSERT 2 : 7 @ 2 + ++ theCrash.getCategory().addCrashSectionCallable("In Ext. Pipeline", new Callable() { ++ public String call() throws Exception { ++ return GlStateManager.isExtensionPipeline() ? "Yes" : "No"; ++ } ++ }); > CHANGE 2 : 3 @ 2 : 6 @@ -812,7 +832,11 @@ > DELETE 2 @ 2 : 219 -> CHANGE 13 : 14 @ 13 : 14 +> INSERT 6 : 7 @ 6 + ++ EagRuntime.setMCServerWindowGlobal(serverDataIn != null ? serverDataIn.serverIP : null); + +> CHANGE 7 : 8 @ 7 : 8 ~ return SingleplayerServerController.isWorldRunning(); diff --git a/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java b/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java index 09be208..9c5354c 100644 --- a/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/GuiMainMenu.edit.java @@ -342,7 +342,14 @@ > DELETE 1 @ 1 : 3 -> CHANGE 7 : 12 @ 7 : 8 +> CHANGE 3 : 7 @ 3 : 5 + +~ if (enableBlur) { +~ this.drawGradientRect(0, 0, this.width, this.height, -2130706433, 16777215); +~ this.drawGradientRect(0, 0, this.width, this.height, 0, Integer.MIN_VALUE); +~ } + +> CHANGE 2 : 7 @ 2 : 3 ~ boolean minc = (double) this.updateCounter < 1.0E-4D; ~ if (this.isDefault) { diff --git a/patches/minecraft/net/minecraft/client/gui/MapItemRenderer.edit.java b/patches/minecraft/net/minecraft/client/gui/MapItemRenderer.edit.java index e81fcf6..2a04379 100644 --- a/patches/minecraft/net/minecraft/client/gui/MapItemRenderer.edit.java +++ b/patches/minecraft/net/minecraft/client/gui/MapItemRenderer.edit.java @@ -33,6 +33,6 @@ > INSERT 1 : 2 @ 1 -+ this.mapTextureData[i] = (c & 0xFF00FF00) | ((c & 0x00FF0000) >> 16) | ((c & 0x000000FF) << 16); ++ this.mapTextureData[i] = (c & 0xFF00FF00) | ((c & 0x00FF0000) >>> 16) | ((c & 0x000000FF) << 16); > EOF diff --git a/patches/minecraft/net/minecraft/client/renderer/entity/RendererLivingEntity.edit.java b/patches/minecraft/net/minecraft/client/renderer/entity/RendererLivingEntity.edit.java index ef2d7a8..b60a41f 100644 --- a/patches/minecraft/net/minecraft/client/renderer/entity/RendererLivingEntity.edit.java +++ b/patches/minecraft/net/minecraft/client/renderer/entity/RendererLivingEntity.edit.java @@ -126,9 +126,9 @@ > CHANGE 9 : 16 @ 9 : 65 ~ GlStateManager.enableShaderBlendAdd(); -~ float f1 = 1.0F - (float) (i >> 24 & 255) / 255.0F; -~ float f2 = (float) (i >> 16 & 255) / 255.0F; -~ float f3 = (float) (i >> 8 & 255) / 255.0F; +~ float f1 = 1.0F - (float) (i >>> 24 & 255) / 255.0F; +~ float f2 = (float) (i >>> 16 & 255) / 255.0F; +~ float f3 = (float) (i >>> 8 & 255) / 255.0F; ~ float f4 = (float) (i & 255) / 255.0F; ~ GlStateManager.setShaderBlendSrc(f1, f1, f1, 1.0F); ~ GlStateManager.setShaderBlendAdd(f2 * f1 + 0.4F, f3 * f1, f4 * f1, 0.0f); diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformApplication.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformApplication.java index 8926416..463efe6 100644 --- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformApplication.java +++ b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformApplication.java @@ -274,4 +274,8 @@ public class PlatformApplication { } + public static void setMCServerWindowGlobal(String str) { + + } + } diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformAssets.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformAssets.java index 03785ec..615e3e9 100644 --- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformAssets.java +++ b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/PlatformAssets.java @@ -73,7 +73,7 @@ public class PlatformAssets { if(!a) { j = j | 0xFF000000; } - pixels[i] = (j & 0xFF00FF00) | ((j & 0x00FF0000) >> 16) | + pixels[i] = (j & 0xFF00FF00) | ((j & 0x00FF0000) >>> 16) | ((j & 0x000000FF) << 16); } return new ImageData(w, h, pixels, a); 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 5d108c5..ee6dcc8 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 @@ -143,7 +143,7 @@ public class PlatformRuntime { windowIcons[i].getRGB(0, 0, w, h, px, 0, w); for(int j = 0; j < px.length; ++j) { - px[j] = (px[j] & 0xFF00FF00) | ((px[j] >> 16) & 0xFF) | ((px[j] & 0xFF) << 16); // swap R/B + px[j] = (px[j] & 0xFF00FF00) | ((px[j] >>> 16) & 0xFF) | ((px[j] & 0xFF) << 16); // swap R/B } java.nio.ByteBuffer iconBuffer = st.malloc(w * h * 4); diff --git a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/lwjgl/DesktopClientConfigAdapter.java b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/lwjgl/DesktopClientConfigAdapter.java index 2709b2b..3c1fd1d 100644 --- a/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/lwjgl/DesktopClientConfigAdapter.java +++ b/sources/lwjgl/java/net/lax1dude/eaglercraft/v1_8/internal/lwjgl/DesktopClientConfigAdapter.java @@ -2,6 +2,7 @@ package net.lax1dude.eaglercraft.v1_8.internal.lwjgl; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; import org.json.JSONObject; @@ -163,6 +164,11 @@ public class DesktopClientConfigAdapter implements IClientConfigAdapter { public String callLocalStorageLoadHook(String key) { return null; } - + + @Override + public void callCrashReportHook(String crashReport, Consumer customMessageCB) { + + } + } } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EagRuntime.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EagRuntime.java index e80d6f4..e0ff3b0 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/EagRuntime.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/EagRuntime.java @@ -226,6 +226,9 @@ public class EagRuntime { return PlatformRuntime.maxMemory(); } + /** + * Note to skids: This doesn't do anything in TeaVM runtime! + */ public static long totalMemory() { return PlatformRuntime.totalMemory(); } @@ -322,4 +325,8 @@ public class EagRuntime { input.setCalendar(getLocaleCalendar()); return input; } + + public static void setMCServerWindowGlobal(String url) { + PlatformApplication.setMCServerWindowGlobal(url); + } } 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 32a245f..d09b040 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 = "u35"; + public static final String projectForkVersion = "u36"; public static final String projectForkVendor = "lax1dude"; public static final String projectForkURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; @@ -20,7 +20,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 = "u35"; + public static final String projectOriginVersion = "u36"; public static final String projectOriginURL = "https://gitlab.com/lax1dude/eaglercraftx-1.8"; // rest in peace @@ -31,7 +31,7 @@ public class EaglercraftVersion { public static final boolean enableUpdateService = true; public static final String updateBundlePackageName = "net.lax1dude.eaglercraft.v1_8.client"; - public static final int updateBundlePackageVersionInt = 35; + public static final int updateBundlePackageVersionInt = 36; public static final String updateLatestLocalStorageKey = "latestUpdate_" + updateBundlePackageName; diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/IClientConfigAdapterHooks.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/IClientConfigAdapterHooks.java index 397f8b5..e6d0a54 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/IClientConfigAdapterHooks.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/internal/IClientConfigAdapterHooks.java @@ -1,5 +1,7 @@ package net.lax1dude.eaglercraft.v1_8.internal; +import java.util.function.Consumer; + /** * Copyright (c) 2024 lax1dude. All Rights Reserved. * @@ -21,4 +23,6 @@ public interface IClientConfigAdapterHooks { String callLocalStorageLoadHook(String key); + void callCrashReportHook(String crashReport, Consumer customMessageCB); + } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/AcceleratedEffectRenderer.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/AcceleratedEffectRenderer.java index 6c3381d..1727846 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/AcceleratedEffectRenderer.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/AcceleratedEffectRenderer.java @@ -72,14 +72,14 @@ public class AcceleratedEffectRenderer implements IAcceleratedParticleEngine { public void drawParticle(float posX, float posY, float posZ, int particleIndexX, int particleIndexY, int lightMapData, int texSize, float particleSize, float r, float g, float b, float a) { InstancedParticleRenderer.appendParticle(posX, posY, posZ, particleIndexX, particleIndexY, lightMapData & 0xFF, - (lightMapData >> 16) & 0xFF, (int)(particleSize * 16.0f), texSize, r, g, b, a); + (lightMapData >>> 16) & 0xFF, (int)(particleSize * 16.0f), texSize, r, g, b, a); } @Override public void drawParticle(float posX, float posY, float posZ, int particleIndexX, int particleIndexY, int lightMapData, int texSize, float particleSize, int rgba) { InstancedParticleRenderer.appendParticle(posX, posY, posZ, particleIndexX, particleIndexY, lightMapData & 0xFF, - (lightMapData >> 16) & 0xFF, (int)(particleSize * 16.0f), texSize, rgba); + (lightMapData >>> 16) & 0xFF, (int)(particleSize * 16.0f), texSize, rgba); } } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/EaglerFontRenderer.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/EaglerFontRenderer.java index d71e2a8..61a5249 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/EaglerFontRenderer.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/minecraft/EaglerFontRenderer.java @@ -47,10 +47,10 @@ public class EaglerFontRenderer extends FontRenderer { if ((color & 0xFC000000) == 0) { color |= 0xFF000000; } - this.red = (float) (color >> 16 & 255) / 255.0F; - this.blue = (float) (color >> 8 & 255) / 255.0F; + this.red = (float) (color >>> 16 & 255) / 255.0F; + this.blue = (float) (color >>> 8 & 255) / 255.0F; this.green = (float) (color & 255) / 255.0F; - this.alpha = (float) (color >> 24 & 255) / 255.0F; + this.alpha = (float) (color >>> 24 & 255) / 255.0F; this.posX = x; this.posY = y; this.textColor = color; diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/netty/ByteBufEaglercraftImpl.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/netty/ByteBufEaglercraftImpl.java index d0963a1..118576e 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/netty/ByteBufEaglercraftImpl.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/netty/ByteBufEaglercraftImpl.java @@ -72,8 +72,8 @@ public class ByteBufEaglercraftImpl extends AbstractByteBuf { @Override protected void _setMedium(int index, int value) { - internal.put(index, (byte)((value >> 16) & 0xFF)); - internal.put(index + 1, (byte)((value >> 8) & 0xFF)); + internal.put(index, (byte)((value >>> 16) & 0xFF)); + internal.put(index + 1, (byte)((value >>> 8) & 0xFF)); internal.put(index + 2, (byte)(value & 0xFF)); } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ImageData.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ImageData.java index 71eb24d..ca5a5b1 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ImageData.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/ImageData.java @@ -118,14 +118,14 @@ public class ImageData { if((spx & 0xFF000000) == 0xFF000000 || (dpx & 0xFF000000) == 0) { pixels[di] = spx; }else { - int sa = (spx >> 24) & 0xFF; - int da = (dpx >> 24) & 0xFF; - int r = ((spx >> 16) & 0xFF) * sa / 255; - int g = ((spx >> 8) & 0xFF) * sa / 255; + int sa = (spx >>> 24) & 0xFF; + int da = (dpx >>> 24) & 0xFF; + int r = ((spx >>> 16) & 0xFF) * sa / 255; + int g = ((spx >>> 8) & 0xFF) * sa / 255; int b = (spx & 0xFF) * sa / 255; int aa = (255 - sa) * da; - r += ((dpx >> 16) & 0xFF) * aa / 65025; - g += ((dpx >> 8) & 0xFF) * aa / 65025; + r += ((dpx >>> 16) & 0xFF) * aa / 65025; + g += ((dpx >>> 8) & 0xFF) * aa / 65025; b += (dpx & 0xFF) * aa / 65025; sa += da; if(sa > 0xFF) sa = 0xFF; @@ -138,14 +138,14 @@ public class ImageData { public ImageData swapRB() { for(int i = 0; i < pixels.length; ++i) { int j = pixels[i]; - pixels[i] = (j & 0xFF00FF00) | ((j & 0x00FF0000) >> 16) | + pixels[i] = (j & 0xFF00FF00) | ((j & 0x00FF0000) >>> 16) | ((j & 0x000000FF) << 16); } return this; } public static int swapRB(int c) { - return (c & 0xFF00FF00) | ((c & 0x00FF0000) >> 16) | ((c & 0x000000FF) << 16); + return (c & 0xFF00FF00) | ((c & 0x00FF0000) >>> 16) | ((c & 0x000000FF) << 16); } } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/InstancedFontRenderer.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/InstancedFontRenderer.java index eff5bd1..0a36fd0 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/InstancedFontRenderer.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/InstancedFontRenderer.java @@ -413,7 +413,7 @@ public class InstancedFontRenderer { buf.putShort((short)y); buf.put((byte)cx); buf.put((byte)cy); - color = ((color >> 1) & 0x7F000000) | (color & 0xFFFFFF); + color = ((color >>> 1) & 0x7F000000) | (color & 0xFFFFFF); if(italic) { color |= 0x80000000; } @@ -438,7 +438,7 @@ public class InstancedFontRenderer { buf.putShort((short)y); buf.put((byte)cx); buf.put((byte)cy); - color = ((color >> 1) & 0x7F000000) | (color & 0xFFFFFF); + color = ((color >>> 1) & 0x7F000000) | (color & 0xFFFFFF); if(italic) { color |= 0x80000000; } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/WorldRenderer.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/WorldRenderer.java index b84cd69..a9555f5 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/WorldRenderer.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/opengl/WorldRenderer.java @@ -267,8 +267,8 @@ public class WorldRenderer { if (!this.needsUpdate) { j = this.intBuffer.get(i); int k = (int) ((float) (j & 255) * red); - int l = (int) ((float) (j >> 8 & 255) * green); - int i1 = (int) ((float) (j >> 16 & 255) * blue); + int l = (int) ((float) (j >>> 8 & 255) * green); + int i1 = (int) ((float) (j >>> 16 & 255) * blue); j = j & -16777216; j = j | i1 << 16 | l << 8 | k; } @@ -280,10 +280,10 @@ public class WorldRenderer { */ private void putColor(int argb, int parInt2) { int i = this.getColorIndex(parInt2); - int j = argb >> 16 & 255; - int k = argb >> 8 & 255; + int j = argb >>> 16 & 255; + int k = argb >>> 8 & 255; int l = argb & 255; - int i1 = argb >> 24 & 255; + int i1 = argb >>> 24 & 255; this.putColorRGBA(i, j, k, l, i1); } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/CapePackets.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/CapePackets.java index 581176d..b8df659 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/CapePackets.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/CapePackets.java @@ -63,8 +63,8 @@ public class CapePackets { } public static byte[] writeMyCapePreset(int capeId) { - return new byte[] { (byte) PACKET_MY_CAPE_PRESET, (byte) (capeId >> 24), (byte) (capeId >> 16), - (byte) (capeId >> 8), (byte) (capeId & 0xFF) }; + return new byte[] { (byte) PACKET_MY_CAPE_PRESET, (byte) (capeId >>> 24), (byte) (capeId >>> 16), + (byte) (capeId >>> 8), (byte) (capeId & 0xFF) }; } public static byte[] writeMyCapeCustom(CustomCape customCape) { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/DefaultCapes.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/DefaultCapes.java index 562d006..87437ae 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/DefaultCapes.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/DefaultCapes.java @@ -39,9 +39,14 @@ public enum DefaultCapes { SNOWMAN(17, "Snowman", new ResourceLocation("eagler:capes/17.snowman.png")), SPADE(18, "Spade", new ResourceLocation("eagler:capes/18.spade.png")), BIRTHDAY(19, "Birthday", new ResourceLocation("eagler:capes/19.birthday.png")), - DB(20, "dB", new ResourceLocation("eagler:capes/20.db.png")); + DB(20, "dB", new ResourceLocation("eagler:capes/20.db.png")), + _15TH_ANNIVERSARY(21, "15th Anniversary", new ResourceLocation("eagler:capes/21.15th_anniversary.png")), + VANILLA(22, "Vanilla", new ResourceLocation("eagler:capes/22.vanilla.png")), + TIKTOK(23, "TikTok", new ResourceLocation("eagler:capes/23.tiktok.png")), + PURPLE_HEART(24, "Purple Heart", new ResourceLocation("eagler:capes/24.purple_heart.png")), + CHERRY_BLOSSOM(25, "Cherry Blossom", new ResourceLocation("eagler:capes/25.cherry_blossom.png")); - public static final DefaultCapes[] defaultCapesMap = new DefaultCapes[21]; + public static final DefaultCapes[] defaultCapesMap = new DefaultCapes[26]; public final int id; public final String name; diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenEditProfile.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenEditProfile.java index d7343b1..8ed345b 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenEditProfile.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/GuiScreenEditProfile.java @@ -345,9 +345,9 @@ public class GuiScreenEditProfile extends GuiScreen { for(int i = 0, j, k; i < 4096; ++i) { j = i << 2; k = loadedSkin.pixels[i]; - rawSkin[j] = (byte)(k >> 24); - rawSkin[j + 1] = (byte)(k >> 16); - rawSkin[j + 2] = (byte)(k >> 8); + rawSkin[j] = (byte)(k >>> 24); + rawSkin[j + 1] = (byte)(k >>> 16); + rawSkin[j + 2] = (byte)(k >>> 8); rawSkin[j + 3] = (byte)(k & 0xFF); } for(int y = 20; y < 32; ++y) { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/ProfileExporter.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/ProfileExporter.java index 7686683..01e527c 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/ProfileExporter.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/ProfileExporter.java @@ -59,7 +59,7 @@ public class ProfileExporter { + (doExportServers ? "servers " : "") + (doExportResourcePacks ? "resourcePacks" : "") + "\n\n") .getBytes(StandardCharsets.UTF_8); - osb.write((comment.length >> 8) & 255); + osb.write((comment.length >>> 8) & 255); osb.write(comment.length & 255); osb.write(comment); @@ -164,9 +164,9 @@ public class ProfileExporter { byte[] ret = osb.toByteArray(); - ret[lengthIntegerOffset] = (byte)((fileCount >> 24) & 0xFF); - ret[lengthIntegerOffset + 1] = (byte)((fileCount >> 16) & 0xFF); - ret[lengthIntegerOffset + 2] = (byte)((fileCount >> 8) & 0xFF); + ret[lengthIntegerOffset] = (byte)((fileCount >>> 24) & 0xFF); + ret[lengthIntegerOffset + 1] = (byte)((fileCount >>> 16) & 0xFF); + ret[lengthIntegerOffset + 2] = (byte)((fileCount >>> 8) & 0xFF); ret[lengthIntegerOffset + 3] = (byte)(fileCount & 0xFF); logger.info("Export complete!"); diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/SkinConverter.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/SkinConverter.java index c776fb2..8e7a627 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/SkinConverter.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/SkinConverter.java @@ -42,8 +42,8 @@ public class SkinConverter { i = (y * 23 + x) * 3; j = skinIn.pixels[y * skinIn.width + x]; if((j & 0xFF000000) != 0) { - skinOut[i] = (byte)(j >> 16); - skinOut[i + 1] = (byte)(j >> 8); + skinOut[i] = (byte)(j >>> 16); + skinOut[i + 1] = (byte)(j >>> 8); skinOut[i + 2] = (byte)(j & 0xFF); }else { skinOut[i] = skinOut[i + 1] = skinOut[i + 2] = 0; @@ -54,8 +54,8 @@ public class SkinConverter { i = ((y + 6) * 23 + 22) * 3; j = skinIn.pixels[(y + 11) * skinIn.width + 22]; if((j & 0xFF000000) != 0) { - skinOut[i] = (byte)(j >> 16); - skinOut[i + 1] = (byte)(j >> 8); + skinOut[i] = (byte)(j >>> 16); + skinOut[i + 1] = (byte)(j >>> 8); skinOut[i + 2] = (byte)(j & 0xFF); }else { skinOut[i] = skinOut[i + 1] = skinOut[i + 2] = 0; diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/SkinPackets.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/SkinPackets.java index 510bd89..7616c6b 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/SkinPackets.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/profile/SkinPackets.java @@ -81,8 +81,8 @@ public class SkinPackets { } public static byte[] writeMySkinPreset(int skinId) { - return new byte[] { (byte) PACKET_MY_SKIN_PRESET, (byte) (skinId >> 24), (byte) (skinId >> 16), - (byte) (skinId >> 8), (byte) (skinId & 0xFF) }; + return new byte[] { (byte) PACKET_MY_SKIN_PRESET, (byte) (skinId >>> 24), (byte) (skinId >>> 16), + (byte) (skinId >>> 8), (byte) (skinId & 0xFF) }; } public static byte[] writeMySkinCustom(CustomSkin customSkin) { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/socket/ConnectionHandshake.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/socket/ConnectionHandshake.java index 318118d..c262ee9 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/socket/ConnectionHandshake.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/socket/ConnectionHandshake.java @@ -191,12 +191,12 @@ public class ConnectionHandshake { int passLen = password.length(); - digest.update((byte)((passLen >> 8) & 0xFF)); + digest.update((byte)((passLen >>> 8) & 0xFF)); digest.update((byte)(passLen & 0xFF)); for(int i = 0; i < passLen; ++i) { char codePoint = password.charAt(i); - digest.update((byte)((codePoint >> 8) & 0xFF)); + digest.update((byte)((codePoint >>> 8) & 0xFF)); digest.update((byte)(codePoint & 0xFF)); } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/SkullCommand.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/SkullCommand.java index ce73c22..5d2bf32 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/SkullCommand.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/SkullCommand.java @@ -57,9 +57,9 @@ public class SkullCommand { for(int i = 0, j, k; i < 4096; ++i) { j = i << 2; k = loaded.pixels[i]; - rawSkin[j] = (byte)(k >> 24); - rawSkin[j + 1] = (byte)(k >> 16); - rawSkin[j + 2] = (byte)(k >> 8); + rawSkin[j] = (byte)(k >>> 24); + rawSkin[j + 1] = (byte)(k >>> 16); + rawSkin[j + 2] = (byte)(k >>> 8); rawSkin[j + 3] = (byte)(k & 0xFF); } mc.thePlayer.sendQueue.addToSendQueue(new C17PacketCustomPayload("EAG|Skins-1.8", SkinPackets.writeCreateCustomSkull(rawSkin))); diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiScreenLANConnecting.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiScreenLANConnecting.java index 6445e8d..d433bfd 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiScreenLANConnecting.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/gui/GuiScreenLANConnecting.java @@ -8,8 +8,10 @@ import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServer; import net.lax1dude.eaglercraft.v1_8.sp.relay.RelayServerSocket; import net.lax1dude.eaglercraft.v1_8.sp.socket.NetHandlerSingleplayerLogin; import net.minecraft.client.LoadingScreenRenderer; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiDisconnected; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.resources.I18n; import net.minecraft.network.EnumConnectionState; import net.minecraft.network.login.client.C00PacketLoginStart; @@ -54,6 +56,7 @@ public class GuiScreenLANConnecting extends GuiScreen { this.parent = parent; this.code = code; this.relay = relay; + Minecraft.getMinecraft().setServerData(new ServerData("Shared World", "shared:" + relay.address, false)); } public boolean doesGuiPauseGame() { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/lan/LANServerController.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/lan/LANServerController.java index 7d6b951..401b198 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/lan/LANServerController.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/lan/LANServerController.java @@ -32,7 +32,7 @@ import net.lax1dude.eaglercraft.v1_8.sp.relay.pkt.*; */ public class LANServerController { - public static final Logger logger = LogManager.getLogger("IntegratedServerLAN"); + public static final Logger logger = LogManager.getLogger("LANServerController"); public static final List currentICEServers = new ArrayList(); diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/pkt/IPacket.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/pkt/IPacket.java index 9f79a77..33dc3a0 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/pkt/IPacket.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/relay/pkt/IPacket.java @@ -154,7 +154,7 @@ public class IPacket { is.write(0); }else { int l = txt.length(); - is.write((l >> 8) & 0xFF); + is.write((l >>> 8) & 0xFF); is.write(l & 0xFF); for(int i = 0; i < l; ++i) { is.write((int)txt.charAt(i)); diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerChunkLoader.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerChunkLoader.java index 96f6a54..403280b 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerChunkLoader.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/EaglerChunkLoader.java @@ -41,8 +41,8 @@ public class EaglerChunkLoader extends AnvilChunkLoader { char[] path = new char[12]; for(int i = 5; i >= 0; --i) { - path[i] = hex.charAt((unsignedX >> (i * 4)) & 0xF); - path[i + 6] = hex.charAt((unsignedZ >> (i * 4)) & 0xF); + path[i] = hex.charAt((unsignedX >>> (i << 2)) & 0xF); + path[i + 6] = hex.charAt((unsignedZ >>> (i << 2)) & 0xF); } return new String(path); diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/EPKCompiler.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/EPKCompiler.java index 27989d1..86e198c 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/EPKCompiler.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/export/EPKCompiler.java @@ -49,7 +49,7 @@ public class EPKCompiler { EagRuntime.fixDateFormat(new SimpleDateFormat("hh:mm:ss aa")).format(d) + "\n\n # world name: " + name + "\n\n") .getBytes(StandardCharsets.UTF_8); - os.write((comment.length >> 8) & 255); + os.write((comment.length >>> 8) & 255); os.write(comment.length & 255); os.write(comment); @@ -134,9 +134,9 @@ public class EPKCompiler { byte[] ret = os.toByteArray(); - ret[lengthIntegerOffset] = (byte)((totalFileCount >> 24) & 0xFF); - ret[lengthIntegerOffset + 1] = (byte)((totalFileCount >> 16) & 0xFF); - ret[lengthIntegerOffset + 2] = (byte)((totalFileCount >> 8) & 0xFF); + ret[lengthIntegerOffset] = (byte)(totalFileCount >>> 24); + ret[lengthIntegerOffset + 1] = (byte)(totalFileCount >>> 16); + ret[lengthIntegerOffset + 2] = (byte)(totalFileCount >>> 8); ret[lengthIntegerOffset + 3] = (byte)(totalFileCount & 0xFF); return ret; @@ -147,21 +147,21 @@ public class EPKCompiler { } public static void writeInt(int i, OutputStream os) throws IOException { - os.write((i >> 24) & 0xFF); - os.write((i >> 16) & 0xFF); - os.write((i >> 8) & 0xFF); + os.write((i >>> 24) & 0xFF); + os.write((i >>> 16) & 0xFF); + os.write((i >>> 8) & 0xFF); os.write(i & 0xFF); } public static void writeLong(long i, OutputStream os) throws IOException { - os.write((int)((i >> 56) & 0xFF)); - os.write((int)((i >> 48) & 0xFF)); - os.write((int)((i >> 40) & 0xFF)); - os.write((int)((i >> 32) & 0xFF)); - os.write((int)((i >> 24) & 0xFF)); - os.write((int)((i >> 16) & 0xFF)); - os.write((int)((i >> 8) & 0xFF)); - os.write((int)(i & 0xFF)); + os.write((int)((i >>> 56l) & 0xFFl)); + os.write((int)((i >>> 48l) & 0xFFl)); + os.write((int)((i >>> 40l) & 0xFFl)); + os.write((int)((i >>> 32l) & 0xFFl)); + os.write((int)((i >>> 24l) & 0xFFl)); + os.write((int)((i >>> 16l) & 0xFFl)); + os.write((int)((i >>> 8l) & 0xFFl)); + os.write((int)(i & 0xFFl)); } } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/skins/IntegratedCapePackets.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/skins/IntegratedCapePackets.java index af37b1e..402cde5 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/skins/IntegratedCapePackets.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/skins/IntegratedCapePackets.java @@ -89,9 +89,9 @@ public class IntegratedCapePackets { byte[] ret = new byte[1 + 16 + 4]; ret[0] = (byte)PACKET_OTHER_CAPE_PRESET; IntegratedSkinPackets.UUIDToBytes(uuid, ret, 1); - ret[17] = (byte)(presetId >> 24); - ret[18] = (byte)(presetId >> 16); - ret[19] = (byte)(presetId >> 8); + ret[17] = (byte)(presetId >>> 24); + ret[18] = (byte)(presetId >>> 16); + ret[19] = (byte)(presetId >>> 8); ret[20] = (byte)(presetId & 0xFF); return ret; } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/skins/IntegratedSkinPackets.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/skins/IntegratedSkinPackets.java index 9080558..4c93d56 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/skins/IntegratedSkinPackets.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/skins/IntegratedSkinPackets.java @@ -143,9 +143,9 @@ public class IntegratedSkinPackets { byte[] ret = new byte[1 + 16 + 4]; ret[0] = (byte)PACKET_OTHER_SKIN_PRESET; UUIDToBytes(uuid, ret, 1); - ret[17] = (byte)(presetId >> 24); - ret[18] = (byte)(presetId >> 16); - ret[19] = (byte)(presetId >> 8); + ret[17] = (byte)(presetId >>> 24); + ret[18] = (byte)(presetId >>> 16); + ret[19] = (byte)(presetId >>> 8); ret[20] = (byte)(presetId & 0xFF); return ret; } @@ -197,21 +197,21 @@ public class IntegratedSkinPackets { public static void UUIDToBytes(EaglercraftUUID uuid, byte[] bytes, int off) { long msb = uuid.getMostSignificantBits(); long lsb = uuid.getLeastSignificantBits(); - bytes[off] = (byte)(msb >> 56l); - bytes[off + 1] = (byte)(msb >> 48l); - bytes[off + 2] = (byte)(msb >> 40l); - bytes[off + 3] = (byte)(msb >> 32l); - bytes[off + 4] = (byte)(msb >> 24l); - bytes[off + 5] = (byte)(msb >> 16l); - bytes[off + 6] = (byte)(msb >> 8l); + bytes[off] = (byte)(msb >>> 56l); + bytes[off + 1] = (byte)(msb >>> 48l); + bytes[off + 2] = (byte)(msb >>> 40l); + bytes[off + 3] = (byte)(msb >>> 32l); + bytes[off + 4] = (byte)(msb >>> 24l); + bytes[off + 5] = (byte)(msb >>> 16l); + bytes[off + 6] = (byte)(msb >>> 8l); bytes[off + 7] = (byte)(msb & 0xFFl); - bytes[off + 8] = (byte)(lsb >> 56l); - bytes[off + 9] = (byte)(lsb >> 48l); - bytes[off + 10] = (byte)(lsb >> 40l); - bytes[off + 11] = (byte)(lsb >> 32l); - bytes[off + 12] = (byte)(lsb >> 24l); - bytes[off + 13] = (byte)(lsb >> 16l); - bytes[off + 14] = (byte)(lsb >> 8l); + bytes[off + 8] = (byte)(lsb >>> 56l); + bytes[off + 9] = (byte)(lsb >>> 48l); + bytes[off + 10] = (byte)(lsb >>> 40l); + bytes[off + 11] = (byte)(lsb >>> 32l); + bytes[off + 12] = (byte)(lsb >>> 24l); + bytes[off + 13] = (byte)(lsb >>> 16l); + bytes[off + 14] = (byte)(lsb >>> 8l); bytes[off + 15] = (byte)(lsb & 0xFFl); } diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/socket/IntegratedServerPlayerNetworkManager.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/socket/IntegratedServerPlayerNetworkManager.java index bccbaee..89b949c 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/socket/IntegratedServerPlayerNetworkManager.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/sp/server/socket/IntegratedServerPlayerNetworkManager.java @@ -239,9 +239,9 @@ public class IntegratedServerPlayerNetworkManager { byte[] compressedData; try { temporaryOutputStream.write(2); - temporaryOutputStream.write((len >> 24) & 0xFF); - temporaryOutputStream.write((len >> 16) & 0xFF); - temporaryOutputStream.write((len >> 8) & 0xFF); + temporaryOutputStream.write((len >>> 24) & 0xFF); + temporaryOutputStream.write((len >>> 16) & 0xFF); + temporaryOutputStream.write((len >>> 8) & 0xFF); temporaryOutputStream.write(len & 0xFF); try(OutputStream os = EaglerZLIB.newDeflaterOutputStream(temporaryOutputStream)) { temporaryBuffer.readBytes(os, len); diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/GuiUpdateVersionSlot.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/GuiUpdateVersionSlot.java index 0b9c76c..0ed9008 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/GuiUpdateVersionSlot.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/GuiUpdateVersionSlot.java @@ -127,13 +127,13 @@ public class GuiUpdateVersionSlot extends GuiSlot { if(strs.size() > 2 && screen.mx > xx + iconSize && screen.my > yy + 8 && screen.mx < xx + getListWidth() - 5 && screen.my < yy + 25) { screen.tooltip = cert.bundleVersionComment; } - char[] hexStr1 = new char[] { hexChars[(cert.bundleDataHash[0] >> 4) & 0xF], - hexChars[cert.bundleDataHash[1] & 0xF], hexChars[(cert.bundleDataHash[1] >> 4) & 0xF], - hexChars[cert.bundleDataHash[1] & 0xF], hexChars[(cert.bundleDataHash[2] >> 4) & 0xF], + char[] hexStr1 = new char[] { hexChars[(cert.bundleDataHash[0] >>> 4) & 0xF], + hexChars[cert.bundleDataHash[1] & 0xF], hexChars[(cert.bundleDataHash[1] >>> 4) & 0xF], + hexChars[cert.bundleDataHash[1] & 0xF], hexChars[(cert.bundleDataHash[2] >>> 4) & 0xF], hexChars[cert.bundleDataHash[2] & 0xF] }; - char[] hexStr2 = new char[] { hexChars[(cert.bundleDataHash[29] >> 4) & 0xF], - hexChars[cert.bundleDataHash[29] & 0xF], hexChars[(cert.bundleDataHash[30] >> 4) & 0xF], - hexChars[cert.bundleDataHash[30] & 0xF], hexChars[(cert.bundleDataHash[31] >> 4) & 0xF], + char[] hexStr2 = new char[] { hexChars[(cert.bundleDataHash[29] >>> 4) & 0xF], + hexChars[cert.bundleDataHash[29] & 0xF], hexChars[(cert.bundleDataHash[30] >>> 4) & 0xF], + hexChars[cert.bundleDataHash[30] & 0xF], hexChars[(cert.bundleDataHash[31] >>> 4) & 0xF], hexChars[cert.bundleDataHash[31] & 0xF] }; screen.drawString(mc.fontRendererObj, "Author: " + EnumChatFormatting.GRAY + cert.bundleAuthorName + EnumChatFormatting.WHITE + " Hash: " diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/UpdateCertificate.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/UpdateCertificate.java index a3bc785..a78f786 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/UpdateCertificate.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/update/UpdateCertificate.java @@ -141,7 +141,7 @@ public class UpdateCertificate { sha256.update(signaturePayload, 0, signaturePayload.length); sha256.doFinal(hash2048, 96); - hash2048[0] = (byte)((signaturePayload.length >> 8) & 0xFF); + hash2048[0] = (byte)((signaturePayload.length >>> 8) & 0xFF); hash2048[1] = (byte)(signaturePayload.length & 0xFF); if(!Arrays.equals(hash2048, rsa2048sumDec)) { diff --git a/sources/main/java/net/lax1dude/eaglercraft/v1_8/voice/GuiVoiceMenu.java b/sources/main/java/net/lax1dude/eaglercraft/v1_8/voice/GuiVoiceMenu.java index 42f029a..2794a68 100644 --- a/sources/main/java/net/lax1dude/eaglercraft/v1_8/voice/GuiVoiceMenu.java +++ b/sources/main/java/net/lax1dude/eaglercraft/v1_8/voice/GuiVoiceMenu.java @@ -559,9 +559,9 @@ public class GuiVoiceMenu extends Gui { } public static int attenuate(int cin, float r, float g, float b, float a) { - float var10 = (float) (cin >> 24 & 255) / 255.0F; - float var6 = (float) (cin >> 16 & 255) / 255.0F; - float var7 = (float) (cin >> 8 & 255) / 255.0F; + float var10 = (float) (cin >>> 24 & 255) / 255.0F; + float var6 = (float) (cin >>> 16 & 255) / 255.0F; + float var7 = (float) (cin >>> 8 & 255) / 255.0F; float var8 = (float) (cin & 255) / 255.0F; var10 *= a; var6 *= r; diff --git a/sources/resources/assets/eagler/capes/21.15th_anniversary.png b/sources/resources/assets/eagler/capes/21.15th_anniversary.png new file mode 100644 index 0000000..41331f8 Binary files /dev/null and b/sources/resources/assets/eagler/capes/21.15th_anniversary.png differ diff --git a/sources/resources/assets/eagler/capes/22.vanilla.png b/sources/resources/assets/eagler/capes/22.vanilla.png new file mode 100644 index 0000000..d7f97ab Binary files /dev/null and b/sources/resources/assets/eagler/capes/22.vanilla.png differ diff --git a/sources/resources/assets/eagler/capes/23.tiktok.png b/sources/resources/assets/eagler/capes/23.tiktok.png new file mode 100644 index 0000000..cf29a93 Binary files /dev/null and b/sources/resources/assets/eagler/capes/23.tiktok.png differ diff --git a/sources/resources/assets/eagler/capes/24.purple_heart.png b/sources/resources/assets/eagler/capes/24.purple_heart.png new file mode 100644 index 0000000..3d6d577 Binary files /dev/null and b/sources/resources/assets/eagler/capes/24.purple_heart.png differ diff --git a/sources/resources/assets/eagler/capes/25.cherry_blossom.png b/sources/resources/assets/eagler/capes/25.cherry_blossom.png new file mode 100644 index 0000000..a02860c Binary files /dev/null and b/sources/resources/assets/eagler/capes/25.cherry_blossom.png differ diff --git a/sources/resources/assets/eagler/glsl/deferred/deferred_core.vsh b/sources/resources/assets/eagler/glsl/deferred/deferred_core.vsh index 30ebf7c..6c5e04b 100644 --- a/sources/resources/assets/eagler/glsl/deferred/deferred_core.vsh +++ b/sources/resources/assets/eagler/glsl/deferred/deferred_core.vsh @@ -46,7 +46,7 @@ uniform float u_blockConstant1f; #define DO_COMPILE_STATE_WAVING_BLOCKS #define FAKE_SIN(valueIn, valueOut)\ valueOut = abs(1.0 - fract(valueIn * 0.159155) * 2.0);\ - valueOut = valueOut * valueOut * (3.0 - 2.0 * valueOut) * 2.0 - 1.0; + valueOut = valueOut * valueOut * (6.0 - 4.0 * valueOut) - 1.0; #define LIB_INCLUDE_WAVING_BLOCKS_FUNCTION #endif diff --git a/sources/resources/assets/eagler/glsl/deferred/deferred_shadow.vsh b/sources/resources/assets/eagler/glsl/deferred/deferred_shadow.vsh index 4811a3e..e212c80 100644 --- a/sources/resources/assets/eagler/glsl/deferred/deferred_shadow.vsh +++ b/sources/resources/assets/eagler/glsl/deferred/deferred_shadow.vsh @@ -53,7 +53,7 @@ uniform vec4 u_wavingBlockParam4f; #define DO_COMPILE_STATE_WAVING_BLOCKS #define FAKE_SIN(valueIn, valueOut)\ valueOut = abs(1.0 - fract(valueIn * 0.159155) * 2.0);\ - valueOut = valueOut * valueOut * (3.0 - 2.0 * valueOut) * 2.0 - 1.0; + valueOut = valueOut * valueOut * (6.0 - 4.0 * valueOut) - 1.0; #define LIB_INCLUDE_WAVING_BLOCKS_FUNCTION #endif diff --git a/sources/resources/assets/eagler/glsl/deferred/post_lens_ghosts.vsh b/sources/resources/assets/eagler/glsl/deferred/post_lens_ghosts.vsh index 5a73c7b..556bb31 100644 --- a/sources/resources/assets/eagler/glsl/deferred/post_lens_ghosts.vsh +++ b/sources/resources/assets/eagler/glsl/deferred/post_lens_ghosts.vsh @@ -39,7 +39,7 @@ uniform float u_baseScale1f; #define FAKE_SIN(valueIn, valueOut)\ valueOut = abs(1.0 - fract(valueIn * 0.159155) * 2.0);\ - valueOut = valueOut * valueOut * (3.0 - 2.0 * valueOut) * 2.0 - 1.0; + valueOut = valueOut * valueOut * (6.0 - 4.0 * valueOut) - 1.0; void main() { v_occlusion1f = max(textureLod(u_sunOcclusionValue, vec2(0.5, 0.5), 0.0).r * 1.5 - 0.5, 0.0); diff --git a/sources/resources/plugin_download.zip b/sources/resources/plugin_download.zip index 391713a..f315635 100644 Binary files a/sources/resources/plugin_download.zip and b/sources/resources/plugin_download.zip differ diff --git a/sources/resources/plugin_version.json b/sources/resources/plugin_version.json index fc71aa9..5cc76e2 100644 --- a/sources/resources/plugin_version.json +++ b/sources/resources/plugin_version.json @@ -1 +1 @@ -{"pluginName":"EaglercraftXBungee","pluginVersion":"1.2.6","pluginButton":"Download \"EaglerXBungee-1.2.6.jar\"","pluginFilename":"EaglerXBungee.zip"} \ No newline at end of file +{"pluginName":"EaglercraftXBungee","pluginVersion":"1.2.7","pluginButton":"Download \"EaglerXBungee-1.2.7.jar\"","pluginFilename":"EaglerXBungee.zip"} \ No newline at end of file diff --git a/sources/setup/workspace_template/javascript/SignedBundleTemplate.txt b/sources/setup/workspace_template/javascript/SignedBundleTemplate.txt index badf239..ef983d2 100644 --- a/sources/setup/workspace_template/javascript/SignedBundleTemplate.txt +++ b/sources/setup/workspace_template/javascript/SignedBundleTemplate.txt @@ -1,4 +1,5 @@ "use strict"; +${classes_js} // %%%%%%%%% launch options %%%%%%%%%%%% @@ -26,8 +27,6 @@ if(typeof window !== "undefined") { // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -${classes_js} - if(typeof window !== "undefined") { window.eaglercraftXOpts.enableSignatureBadge = true; window.eaglercraftXOpts.assetsURI = ${assets_epk}; } if(typeof window !== "undefined") setTimeout(() => { diff --git a/sources/setup/workspace_template/javascript/index.html b/sources/setup/workspace_template/javascript/index.html index 1b0afb2..3cade03 100644 --- a/sources/setup/workspace_template/javascript/index.html +++ b/sources/setup/workspace_template/javascript/index.html @@ -26,6 +26,7 @@ localesURI: "lang/", worldsDB: "worlds", logInvalidCerts: true, + crashOnUncaughtExceptions: true, servers: [ { addr: "ws://localhost:8081/", name: "Local test server" } ], 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 14da64d..b989865 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 @@ -309,4 +309,7 @@ public class PlatformApplication { public static boolean isShowingDebugConsole() { return DebugConsoleWindow.isShowingDebugConsole(); } + + @JSBody(params = { "str" }, script = "window.minecraftServer = str;") + public static native void setMCServerWindowGlobal(String str); } 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 e713497..3bdb380 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 @@ -605,6 +605,10 @@ public class PlatformInput { Window.clearTimeout(mouseUngrabTimeout); mouseUngrabTimeout = -1; } + try { + win.getDocument().exitPointerLock(); + }catch(Throwable t) { + } } public static void pressAnyKeyScreen() { 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 a1f2a98..81c827d 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 @@ -87,6 +87,7 @@ public class PlatformRuntime { win = Window.current(); doc = win.getDocument(); DebugConsoleWindow.initialize(win); + PlatformApplication.setMCServerWindowGlobal(null); logger.info("Creating main game canvas"); diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/buffer/EaglerArrayByteBuffer.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/buffer/EaglerArrayByteBuffer.java index adda4b2..a0ce5d7 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/buffer/EaglerArrayByteBuffer.java +++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/buffer/EaglerArrayByteBuffer.java @@ -348,11 +348,11 @@ public class EaglerArrayByteBuffer implements ByteBuffer { @Override public ByteBuffer putLong(long value) { if(position + 8 > limit) throw new ArrayIndexOutOfBoundsException(position); - dataView.setUint32(position, (int) (value & 0xFFFFFFFF), true); - dataView.setUint8(position + 4, (short) ((value >> 32) & 0xFF)); - dataView.setUint8(position + 5, (short) ((value >> 40) & 0xFF)); - dataView.setUint8(position + 6, (short) ((value >> 48) & 0xFF)); - dataView.setUint8(position + 7, (short) ((value >> 56) & 0xFF)); + dataView.setUint32(position, (int) (value & 0xFFFFFFFFl), true); + dataView.setUint8(position + 4, (short) ((value >>> 32l) & 0xFFl)); + dataView.setUint8(position + 5, (short) ((value >>> 40l) & 0xFFl)); + dataView.setUint8(position + 6, (short) ((value >>> 48l) & 0xFFl)); + dataView.setUint8(position + 7, (short) ((value >>> 56l) & 0xFFl)); position += 8; return this; } @@ -368,11 +368,11 @@ public class EaglerArrayByteBuffer implements ByteBuffer { @Override public ByteBuffer putLong(int index, long value) { if(index + 8 > limit) throw new ArrayIndexOutOfBoundsException(index); - dataView.setUint32(index, (int) (value & 0xFFFFFFFF), true); - dataView.setUint8(index + 4, (short) ((value >> 32) & 0xFF)); - dataView.setUint8(index + 5, (short) ((value >> 40) & 0xFF)); - dataView.setUint8(index + 6, (short) ((value >> 48) & 0xFF)); - dataView.setUint8(index + 7, (short) ((value >> 56) & 0xFF)); + dataView.setUint32(index, (int) (value & 0xFFFFFFFFl), true); + dataView.setUint8(index + 4, (short) ((value >>> 32l) & 0xFFl)); + dataView.setUint8(index + 5, (short) ((value >>> 40l) & 0xFFl)); + dataView.setUint8(index + 6, (short) ((value >>> 48l) & 0xFFl)); + dataView.setUint8(index + 7, (short) ((value >>> 56l) & 0xFFl)); return this; } diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/ClientMain.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/ClientMain.java index b6dfb61..30bcdc0 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/ClientMain.java +++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/ClientMain.java @@ -3,6 +3,8 @@ package net.lax1dude.eaglercraft.v1_8.internal.teavm; import java.io.PrintStream; import java.text.SimpleDateFormat; import java.util.Date; +import java.util.LinkedList; +import java.util.List; import org.json.JSONException; import org.teavm.jso.JSBody; @@ -76,6 +78,7 @@ public class ClientMain { try { JSEaglercraftXOptsRoot eaglercraftOpts = (JSEaglercraftXOptsRoot)opts; + crashOnUncaughtExceptions = eaglercraftOpts.getCrashOnUncaughtExceptions(false); configRootElementId = eaglercraftOpts.getContainer(); if(configRootElementId == null) { @@ -119,36 +122,38 @@ public class ClientMain { return; } - systemOut.println("ClientMain: [INFO] registering crash handlers"); - - setWindowErrorHandler(new WindowErrorHandler() { - - @Override - public void call(String message, String file, int line, int col, JSError error) { - StringBuilder str = new StringBuilder(); - - str.append("Native Browser Exception\n"); - str.append("----------------------------------\n"); - str.append(" Line: ").append((file == null ? "unknown" : file) + ":" + line + ":" + col).append('\n'); - str.append(" Type: ").append(error == null ? "generic" : error.getName()).append('\n'); - - if(error != null) { - str.append(" Desc: ").append(error.getMessage() == null ? "null" : error.getMessage()).append('\n'); - } - - if(message != null) { - if(error == null || error.getMessage() == null || !message.endsWith(error.getMessage())) { - str.append(" Desc: ").append(message).append('\n'); - } - } - - str.append("----------------------------------\n\n"); - str.append(error.getStack() == null ? "No stack trace is available" : error.getStack()).append('\n'); - - showCrashScreen(str.toString()); - } + if(crashOnUncaughtExceptions) { + systemOut.println("ClientMain: [INFO] registering crash handlers"); - }); + setWindowErrorHandler(new WindowErrorHandler() { + + @Override + public void call(String message, String file, int line, int col, JSError error) { + StringBuilder str = new StringBuilder(); + + str.append("Native Browser Exception\n"); + str.append("----------------------------------\n"); + str.append(" Line: ").append((file == null ? "unknown" : file) + ":" + line + ":" + col).append('\n'); + str.append(" Type: ").append(error == null ? "generic" : error.getName()).append('\n'); + + if(error != null) { + str.append(" Desc: ").append(error.getMessage() == null ? "null" : error.getMessage()).append('\n'); + } + + if(message != null) { + if(error == null || error.getMessage() == null || !message.endsWith(error.getMessage())) { + str.append(" Desc: ").append(message).append('\n'); + } + } + + str.append("----------------------------------\n\n"); + str.append(error.getStack() == null ? "No stack trace is available" : error.getStack()).append('\n'); + + showCrashScreen(str.toString()); + } + + }); + } systemOut.println("ClientMain: [INFO] initializing eaglercraftx runtime"); @@ -212,6 +217,7 @@ public class ClientMain { public static HTMLElement configRootElement = null; public static EPKFileEntry[] configEPKFiles = null; public static String configLocalesFolder = null; + public static boolean crashOnUncaughtExceptions = false; @JSFunctor private static interface WindowErrorHandler extends JSObject { @@ -236,61 +242,97 @@ public class ClientMain { private static boolean isCrashed = false; public static void showCrashScreen(String t) { + StringBuilder strBeforeBuilder = new StringBuilder(); + strBeforeBuilder.append("Game Crashed! I have fallen and I can't get up!\n\n"); + strBeforeBuilder.append(t); + strBeforeBuilder.append('\n').append('\n'); + String strBefore = strBeforeBuilder.toString(); + + HTMLDocument doc = Window.current().getDocument(); + if(configRootElement == null) { + configRootElement = doc.getElementById(configRootElementId); + } + + HTMLElement el = configRootElement; + + StringBuilder str = new StringBuilder(); + str.append("eaglercraft.version = \"").append(EaglercraftVersion.projectForkVersion).append("\"\n"); + str.append("eaglercraft.minecraft = \"1.8.8\"\n"); + str.append("eaglercraft.brand = \"" + EaglercraftVersion.projectForkVendor + "\"\n"); + str.append("eaglercraft.username = \"").append(EaglerProfile.getName()).append("\"\n"); + str.append('\n'); + str.append(addWebGLToCrash()); + str.append('\n'); + str.append("window.eaglercraftXOpts = "); + str.append(TeaVMClientConfigAdapter.instance.toString()).append('\n'); + str.append('\n'); + str.append("currentTime = "); + str.append(EagRuntime.fixDateFormat(new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z")).format(new Date())).append('\n'); + str.append('\n'); + addDebugNav(str, "userAgent"); + addDebugNav(str, "vendor"); + addDebugNav(str, "language"); + addDebugNav(str, "hardwareConcurrency"); + addDebugNav(str, "deviceMemory"); + addDebugNav(str, "platform"); + addDebugNav(str, "product"); + addDebugNavPlugins(str); + str.append('\n'); + addDebug(str, "localStorage"); + addDebug(str, "sessionStorage"); + addDebug(str, "indexedDB"); + str.append('\n'); + str.append("rootElement.clientWidth = ").append(el == null ? "undefined" : el.getClientWidth()).append('\n'); + str.append("rootElement.clientHeight = ").append(el == null ? "undefined" : el.getClientHeight()).append('\n'); + addDebug(str, "innerWidth"); + addDebug(str, "innerHeight"); + addDebug(str, "outerWidth"); + addDebug(str, "outerHeight"); + addDebug(str, "devicePixelRatio"); + addDebugScreen(str, "availWidth"); + addDebugScreen(str, "availHeight"); + addDebugScreen(str, "colorDepth"); + addDebugScreen(str, "pixelDepth"); + str.append('\n'); + addDebug(str, "minecraftServer"); + str.append('\n'); + addDebugLocation(str, "href"); + str.append('\n'); + String strAfter = str.toString(); + + String strFinal = strBefore + strAfter; + List additionalInfo = new LinkedList(); + try { + TeaVMClientConfigAdapter.instance.getHooks().callCrashReportHook(strFinal, additionalInfo::add); + }catch(Throwable tt) { + System.err.println("Uncaught exception invoking crash report hook!"); + EagRuntime.debugPrintStackTraceToSTDERR(tt); + } + if(!isCrashed) { isCrashed = true; - HTMLDocument doc = Window.current().getDocument(); - if(configRootElement == null) { - configRootElement = doc.getElementById(configRootElementId); + if(additionalInfo.size() > 0) { + try { + StringBuilder builderFinal = new StringBuilder(); + builderFinal.append(strBefore); + builderFinal.append("Got the following messages from the crash report hook registered in eaglercraftXOpts:\n\n"); + for(String str2 : additionalInfo) { + builderFinal.append("----------[ CRASH HOOK ]----------\n"); + builderFinal.append(str2).append('\n'); + builderFinal.append("----------------------------------\n\n"); + } + builderFinal.append(strAfter); + strFinal = builderFinal.toString(); + }catch(Throwable tt) { + System.err.println("Uncaught exception concatenating crash report hook messages!"); + EagRuntime.debugPrintStackTraceToSTDERR(tt); + } } - - HTMLElement el = configRootElement; - - StringBuilder str = new StringBuilder(); - str.append("Game Crashed! I have fallen and I can't get up!\n\n"); - str.append(t); - str.append('\n').append('\n'); - str.append("eaglercraft.version = \"").append(EaglercraftVersion.projectForkVersion).append("\"\n"); - str.append("eaglercraft.minecraft = \"1.8.8\"\n"); - str.append("eaglercraft.brand = \"" + EaglercraftVersion.projectForkVendor + "\"\n"); - str.append("eaglercraft.username = \"").append(EaglerProfile.getName()).append("\"\n"); - str.append('\n'); - str.append(addWebGLToCrash()); - str.append('\n'); - str.append("window.eaglercraftXOpts = "); - str.append(TeaVMClientConfigAdapter.instance.toString()).append('\n'); - str.append('\n'); - str.append("currentTime = "); - str.append(EagRuntime.fixDateFormat(new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z")).format(new Date())).append('\n'); - str.append('\n'); - addDebugNav(str, "userAgent"); - addDebugNav(str, "vendor"); - addDebugNav(str, "language"); - addDebugNav(str, "hardwareConcurrency"); - addDebugNav(str, "deviceMemory"); - addDebugNav(str, "platform"); - addDebugNav(str, "product"); - str.append('\n'); - str.append("rootElement.clientWidth = ").append(el == null ? "undefined" : el.getClientWidth()).append('\n'); - str.append("rootElement.clientHeight = ").append(el == null ? "undefined" : el.getClientHeight()).append('\n'); - addDebug(str, "innerWidth"); - addDebug(str, "innerHeight"); - addDebug(str, "outerWidth"); - addDebug(str, "outerHeight"); - addDebug(str, "devicePixelRatio"); - addDebugScreen(str, "availWidth"); - addDebugScreen(str, "availHeight"); - addDebugScreen(str, "colorDepth"); - addDebugScreen(str, "pixelDepth"); - str.append('\n'); - addDebug(str, "currentContext"); - str.append('\n'); - addDebugLocation(str, "href"); - str.append('\n'); if(el == null) { Window.alert("Root element not found, crash report was printed to console"); - System.err.println(str.toString()); + System.err.println(strFinal); return; } @@ -303,7 +345,7 @@ public class ClientMain { div.setAttribute("style", "z-index:100;position:absolute;top:135px;left:10%;right:10%;bottom:50px;background-color:white;border:1px solid #cccccc;overflow-x:hidden;overflow-y:scroll;overflow-wrap:break-word;white-space:pre-wrap;font: 14px monospace;padding:10px;"); el.appendChild(img); el.appendChild(div); - div.appendChild(doc.createTextNode(str.toString())); + div.appendChild(doc.createTextNode(strFinal)); PlatformRuntime.removeEventHandlers(); @@ -314,10 +356,29 @@ public class ClientMain { for(int i = 0; i < s.length; ++i) { System.err.println(" " + s[i]); } + if(additionalInfo.size() > 0) { + for(String str2 : additionalInfo) { + if(str2 != null) { + System.err.println(); + System.err.println(" ----------[ CRASH HOOK ]----------"); + s = str2.split("[\\r\\n]+"); + for(int i = 0; i < s.length; ++i) { + System.err.println(" " + s[i]); + } + System.err.println(" ----------------------------------"); + } + } + } } } + private static String webGLCrashStringCache = null; + private static String addWebGLToCrash() { + if(webGLCrashStringCache != null) { + return webGLCrashStringCache; + } + StringBuilder ret = new StringBuilder(); WebGLRenderingContext ctx = PlatformRuntime.webgl; @@ -328,7 +389,11 @@ public class ClientMain { cvs.setWidth(64); cvs.setHeight(64); - ctx = (WebGLRenderingContext)cvs.getContext("webgl"); + ctx = (WebGLRenderingContext)cvs.getContext("webgl2"); + + if(ctx == null) { + ctx = (WebGLRenderingContext)cvs.getContext("webgl"); + } } if(ctx != null) { @@ -345,12 +410,13 @@ public class ClientMain { //ret.append('\n').append("\nwebgl.anisotropicGlitch = ").append(DetectAnisotropicGlitch.hasGlitch()).append('\n'); //TODO ret.append('\n').append("webgl.ext.HDR16f = ").append(ctx.getExtension("EXT_color_buffer_half_float") != null).append('\n'); ret.append("webgl.ext.HDR32f = ").append(ctx.getExtension("EXT_color_buffer_float") != null).append('\n'); + ret.append("webgl.ext.HDR32f_linear = ").append(ctx.getExtension("OES_texture_float_linear") != null).append('\n'); }else { ret.append("Failed to query GPU info!\n"); } - return ret.toString(); + return webGLCrashStringCache = ret.toString(); } public static void showIncompatibleScreen(String t) { @@ -486,6 +552,13 @@ public class ClientMain { @JSBody(params = { "v" }, script = "try { return \"\"+window.location[v]; } catch(e) { return \"\"; }") private static native String getStringLocation(String var); + @JSBody(params = { }, script = "try { var retObj = new Array; if(typeof window.navigator.plugins === \"object\")" + + "{ var len = window.navigator.plugins.length; if(len > 0) { for(var idx = 0; idx < len; ++idx) {" + + "var thePlugin = window.navigator.plugins[idx]; retObj.push({ name: thePlugin.name," + + "filename: thePlugin.filename, desc: thePlugin.description }); } } } return JSON.stringify(retObj);" + + "} catch(e) { return \"\"; }") + private static native String getStringNavPlugins(); + private static void addDebug(StringBuilder str, String var) { str.append("window.").append(var).append(" = ").append(getString(var)).append('\n'); } @@ -494,6 +567,10 @@ public class ClientMain { str.append("window.navigator.").append(var).append(" = ").append(getStringNav(var)).append('\n'); } + private static void addDebugNavPlugins(StringBuilder str) { + str.append("window.navigator.plugins = ").append(getStringNavPlugins()).append('\n'); + } + private static void addDebugScreen(StringBuilder str, String var) { str.append("window.screen.").append(var).append(" = ").append(getStringScreen(var)).append('\n'); } diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/DebugConsoleWindow.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/DebugConsoleWindow.java index 26bedb3..fe3546b 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/DebugConsoleWindow.java +++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/DebugConsoleWindow.java @@ -64,13 +64,15 @@ public class DebugConsoleWindow { destroyWindow(); } }); - if("true".equals(parent.getLocalStorage().getItem(PlatformRuntime.getClientConfigAdapter().getLocalStorageNamespace() + ".showDebugConsole"))) { + if(parent.getLocalStorage() != null && "true".equals(parent.getLocalStorage().getItem(PlatformRuntime.getClientConfigAdapter().getLocalStorageNamespace() + ".showDebugConsole"))) { showDebugConsole0(); } } public static void showDebugConsole() { - parent.getLocalStorage().setItem(PlatformRuntime.getClientConfigAdapter().getLocalStorageNamespace() + ".showDebugConsole", "true"); + if(parent.getLocalStorage() != null) { + parent.getLocalStorage().setItem(PlatformRuntime.getClientConfigAdapter().getLocalStorageNamespace() + ".showDebugConsole", "true"); + } showDebugConsole0(); } @@ -108,7 +110,9 @@ public class DebugConsoleWindow { public void handleEvent(Event evt) { if(logger != null) { logger = null; - parent.getLocalStorage().setItem("_eaglercraftX.showDebugConsole", "false"); + if(parent.getLocalStorage() != null) { + parent.getLocalStorage().setItem(PlatformRuntime.getClientConfigAdapter().getLocalStorageNamespace() + ".showDebugConsole", "false"); + } } } }; diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/TeaVMClientConfigAdapter.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/TeaVMClientConfigAdapter.java index 7078eae..cdbe988 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/TeaVMClientConfigAdapter.java +++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/TeaVMClientConfigAdapter.java @@ -61,6 +61,7 @@ public class TeaVMClientConfigAdapter implements IClientConfigAdapter { private String localStorageNamespace = "_eaglercraftX"; private final TeaVMClientConfigAdapterHooks hooks = new TeaVMClientConfigAdapterHooks(); private boolean enableMinceraft = true; + private boolean crashOnUncaughtExceptions = false; public void loadNative(JSObject jsObject) { integratedServerOpts = new JSONObject(); @@ -83,6 +84,7 @@ public class TeaVMClientConfigAdapter implements IClientConfigAdapter { allowFNAWSkins = !demoMode && eaglercraftXOpts.getAllowFNAWSkins(true); localStorageNamespace = eaglercraftXOpts.getLocalStorageNamespace(EaglercraftVersion.localStorageNamespace); enableMinceraft = eaglercraftXOpts.getEnableMinceraft(true); + crashOnUncaughtExceptions = eaglercraftXOpts.getCrashOnUncaughtExceptions(false); JSEaglercraftXOptsHooks hooksObj = eaglercraftXOpts.getHooks(); if(hooksObj != null) { hooks.loadHooks(hooksObj); @@ -95,6 +97,7 @@ public class TeaVMClientConfigAdapter implements IClientConfigAdapter { integratedServerOpts.put("allowUpdateDL", isAllowUpdateDL); integratedServerOpts.put("allowVoiceClient", allowVoiceClient); integratedServerOpts.put("allowFNAWSkins", allowFNAWSkins); + integratedServerOpts.put("crashOnUncaughtExceptions", crashOnUncaughtExceptions); JSArrayReader serversArray = eaglercraftXOpts.getServers(); if(serversArray != null) { @@ -178,6 +181,7 @@ public class TeaVMClientConfigAdapter implements IClientConfigAdapter { allowFNAWSkins = eaglercraftOpts.optBoolean("allowFNAWSkins", true); localStorageNamespace = eaglercraftOpts.optString("localStorageNamespace", EaglercraftVersion.localStorageNamespace); enableMinceraft = eaglercraftOpts.optBoolean("enableMinceraft", true); + crashOnUncaughtExceptions = eaglercraftOpts.optBoolean("crashOnUncaughtExceptions", false); JSONArray serversArray = eaglercraftOpts.optJSONArray("servers"); if(serversArray != null) { for(int i = 0, l = serversArray.length(); i < l; ++i) { @@ -366,6 +370,7 @@ public class TeaVMClientConfigAdapter implements IClientConfigAdapter { jsonObject.put("allowFNAWSkins", allowFNAWSkins); jsonObject.put("localStorageNamespace", localStorageNamespace); jsonObject.put("enableMinceraft", enableMinceraft); + jsonObject.put("crashOnUncaughtExceptions", crashOnUncaughtExceptions); JSONArray serversArr = new JSONArray(); for(int i = 0, l = defaultServers.size(); i < l; ++i) { DefaultServer srv = defaultServers.get(i); diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/TeaVMClientConfigAdapterHooks.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/TeaVMClientConfigAdapterHooks.java index 2051738..93eb1d8 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/TeaVMClientConfigAdapterHooks.java +++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/TeaVMClientConfigAdapterHooks.java @@ -1,5 +1,6 @@ package net.lax1dude.eaglercraft.v1_8.internal.teavm; +import java.util.function.Consumer; import java.util.function.Supplier; import org.teavm.interop.Async; @@ -34,6 +35,7 @@ public class TeaVMClientConfigAdapterHooks implements IClientConfigAdapterHooks private LocalStorageSaveHook saveHook = null; private LocalStorageLoadHook loadHook = null; + private CrashReportHook crashHook = null; @JSFunctor private static interface LocalStorageSaveHook extends JSObject { @@ -65,6 +67,25 @@ public class TeaVMClientConfigAdapterHooks implements IClientConfigAdapterHooks } } + @JSFunctor + private static interface CrashReportHook extends JSObject { + void call(String crashReport, CustomMessageCB customMessageCB); + } + + @JSFunctor + private static interface CustomMessageCB extends JSObject { + void call(String msg); + } + + @Override + public void callCrashReportHook(String crashReport, Consumer customMessageCB) { + if(crashHook != null) { + callHookSafeSync("crashReportShow", () -> { + crashHook.call(crashReport, (msg) -> customMessageCB.accept(msg)); + }); + } + } + private static void callHookSafe(String identifer, Runnable hooker) { Window.setTimeout(() -> { try { @@ -76,6 +97,22 @@ public class TeaVMClientConfigAdapterHooks implements IClientConfigAdapterHooks }, 0); } + @Async + private static native void callHookSafeSync(String identifer, Runnable hooker); + + private static void callHookSafeSync(String identifer, Runnable hooker, final AsyncCallback cb) { + Window.setTimeout(() -> { + try { + hooker.run(); + }catch(Throwable t) { + logger.error("Caught exception while invoking eaglercraftXOpts \"{}\" hook!", identifer); + logger.error(t); + }finally { + cb.complete(null); + } + }, 0); + } + @Async private static native Object callHookSafeWithReturn(String identifer, Supplier hooker); @@ -96,5 +133,6 @@ public class TeaVMClientConfigAdapterHooks implements IClientConfigAdapterHooks public void loadHooks(JSEaglercraftXOptsHooks hooks) { saveHook = (LocalStorageSaveHook)hooks.getLocalStorageSavedHook(); loadHook = (LocalStorageLoadHook)hooks.getLocalStorageLoadedHook(); + crashHook = (CrashReportHook)hooks.getCrashReportHook(); } } diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/opts/JSEaglercraftXOptsHooks.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/opts/JSEaglercraftXOptsHooks.java index 19b43b1..7b5cf41 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/opts/JSEaglercraftXOptsHooks.java +++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/opts/JSEaglercraftXOptsHooks.java @@ -26,4 +26,7 @@ public abstract class JSEaglercraftXOptsHooks implements JSObject { @JSBody(script = "return (typeof this.localStorageLoaded === \"function\") ? this.localStorageLoaded : null;") public native JSObject getLocalStorageLoadedHook(); + @JSBody(script = "return (typeof this.crashReportShow === \"function\") ? this.crashReportShow : null;") + public native JSObject getCrashReportHook(); + } diff --git a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/opts/JSEaglercraftXOptsRoot.java b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/opts/JSEaglercraftXOptsRoot.java index 467f9c6..caf1f9d 100644 --- a/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/opts/JSEaglercraftXOptsRoot.java +++ b/sources/teavm/java/net/lax1dude/eaglercraft/v1_8/internal/teavm/opts/JSEaglercraftXOptsRoot.java @@ -96,4 +96,7 @@ public abstract class JSEaglercraftXOptsRoot implements JSObject { @JSBody(params = { "def" }, script = "return (typeof this.enableMinceraft === \"boolean\") ? this.enableMinceraft : def;") public native boolean getEnableMinceraft(boolean defaultValue); + @JSBody(params = { "def" }, script = "return (typeof this.crashOnUncaughtExceptions === \"boolean\") ? this.crashOnUncaughtExceptions : def;") + public native boolean getCrashOnUncaughtExceptions(boolean defaultValue); + }