From 8e62c673b4084a9cfb169a3abd8bad073921c99e Mon Sep 17 00:00:00 2001 From: LAX1DUDE Date: Thu, 1 Sep 2022 23:44:01 -0700 Subject: [PATCH] more various changes from my TODO list --- .gitignore | 1 + lwjgl-rundir/resources/credits.txt | 2 +- .../adapter/EaglerAdapterImpl2.java | 16 +++++++++++ .../lax1dude/eaglercraft/ConfigConstants.java | 2 +- .../eaglercraft/glemu/EffectPipeline.java | 4 +++ .../java/net/minecraft/client/Minecraft.java | 2 ++ .../net/minecraft/src/EntityRenderer.java | 7 ++++- .../java/net/minecraft/src/GuiMainMenu.java | 26 ++++++++++-------- .../net/minecraft/src/StringTranslate.java | 15 +++++----- .../zip_generator/ZipGenerator.java | 12 ++++++-- zip-generator/zipGenerator.jar | Bin 6791 -> 6408 bytes 11 files changed, 62 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 5b3627b..bc13388 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ sp-relay/src/main/java/META-INF zip-generator/out zip-generator/src/main/java/META-INF *.iml +crash_report_override.txt \ No newline at end of file diff --git a/lwjgl-rundir/resources/credits.txt b/lwjgl-rundir/resources/credits.txt index a247b70..3f2b9c0 100644 --- a/lwjgl-rundir/resources/credits.txt +++ b/lwjgl-rundir/resources/credits.txt @@ -2,7 +2,7 @@ eaglercraft is an AOT compiled port of mojang's minecraft 1.5.2 designed to run §1this §1was §1created §1by §1calder §1young §1(lax1dude)§r -§4ingame §4voice §4chat §4service §4created §4by §4ayunami2000§r +§4project §4currently §4maintained §4by §4ayunami2000§r compiling the javascript and emulating the JRE is largely made possible by the TeaVM project, created by Alexey Andreev and is available for free at §nhttp://teavm.org/§r under Apache License 2.0 diff --git a/src/lwjgl/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java b/src/lwjgl/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java index 68ada7c..eddaa85 100644 --- a/src/lwjgl/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java +++ b/src/lwjgl/java/net/lax1dude/eaglercraft/adapter/EaglerAdapterImpl2.java @@ -1287,8 +1287,14 @@ public class EaglerAdapterImpl2 { public static final void setMasterVolume(float v) { ss.setMasterVolume(v); } + public static final void setMusicVolume(float v) { + // used in browser + } private static int playbackId = 0; public static final int beginPlayback(String fileName, float x, float y, float z, float volume, float pitch) { + return beginPlayback(fileName, x, y, z, volume, pitch, false); + } + public static final int beginPlayback(String fileName, float x, float y, float z, float volume, float pitch, boolean ayunamiAddedThisBoolean) { int id = ++playbackId; URL loc = null; if((loc = getResourceURL(fileName)) != null) { @@ -1308,6 +1314,9 @@ public class EaglerAdapterImpl2 { return id; } public static final int beginPlaybackStatic(String fileName, float volume, float pitch) { + return beginPlaybackStatic(fileName, volume, pitch, false); + } + public static final int beginPlaybackStatic(String fileName, float volume, float pitch, boolean ayunamiAddedThisBoolean) { int id = ++playbackId; URL loc = null; if((loc = getResourceURL(fileName)) != null) { @@ -1361,6 +1370,9 @@ public class EaglerAdapterImpl2 { public static final boolean isPlaying(int id) { return ss.playing("sound_"+id); } + public static final void fireTitleMusicEvent(boolean b, float f) { + // used in browser + } public static final void openConsole() { EventQueue.invokeLater(new Runnable() { @@ -1968,4 +1980,8 @@ public class EaglerAdapterImpl2 { return true; } + public static final byte[] downloadURL(String url) { + return null; + } + } diff --git a/src/main/java/net/lax1dude/eaglercraft/ConfigConstants.java b/src/main/java/net/lax1dude/eaglercraft/ConfigConstants.java index 3cf9e59..2d80f5d 100644 --- a/src/main/java/net/lax1dude/eaglercraft/ConfigConstants.java +++ b/src/main/java/net/lax1dude/eaglercraft/ConfigConstants.java @@ -6,7 +6,7 @@ public class ConfigConstants { public static boolean profanity = false; - public static final String version = "22w35a"; + public static final String version = "22w35b"; public static final String mainMenuString = "eaglercraft " + version; public static final String forkMe = "https://github.com/lax1dude/eaglercraft"; diff --git a/src/main/java/net/lax1dude/eaglercraft/glemu/EffectPipeline.java b/src/main/java/net/lax1dude/eaglercraft/glemu/EffectPipeline.java index 9f7b84b..19048a1 100644 --- a/src/main/java/net/lax1dude/eaglercraft/glemu/EffectPipeline.java +++ b/src/main/java/net/lax1dude/eaglercraft/glemu/EffectPipeline.java @@ -145,6 +145,7 @@ public class EffectPipeline { glDepthMask(false); _wglDrawArrays(_wGL_TRIANGLES, 0, 6); glColorMask(true, true, true, false); + glDepthMask(true); _wglBindFramebuffer(_wGL_FRAMEBUFFER, null); _wglViewport(0, 0, viewportW, viewportH); } @@ -155,6 +156,9 @@ public class EffectPipeline { private static long timer = 0l; public static void drawNoise(int viewportW, int viewportH, float intensity) { + if(noiseProgram == null) { + return; + } // three guesses to figure out what this does diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java index 7530c84..ab0f9d8 100644 --- a/src/main/java/net/minecraft/client/Minecraft.java +++ b/src/main/java/net/minecraft/client/Minecraft.java @@ -1503,10 +1503,12 @@ public class Minecraft implements Runnable { this.myNetworkManager.processReadPackets(); } else { this.entityRenderer.startup = 0; + this.entityRenderer.preStartup = 0; } if(!this.gameSettings.adderall || !yeeState) { this.entityRenderer.startup = 0; + this.entityRenderer.preStartup = 0; this.gameSettings.adderall = false; } diff --git a/src/main/java/net/minecraft/src/EntityRenderer.java b/src/main/java/net/minecraft/src/EntityRenderer.java index 307c379..71832cb 100644 --- a/src/main/java/net/minecraft/src/EntityRenderer.java +++ b/src/main/java/net/minecraft/src/EntityRenderer.java @@ -157,8 +157,9 @@ public class EntityRenderer { * 6=TiltRight) */ public int debugViewDirection; - + public int startup = 0; + public int preStartup = 0; public EntityRenderer(Minecraft par1Minecraft) { this.mc = par1Minecraft; @@ -1270,6 +1271,10 @@ public class EntityRenderer { if(startup == 0) { var3.ambientTickCountdown = random.nextInt(12000); } + ++preStartup; + if(preStartup < 300) { + return; + } ++startup; int k = 60 - (startup / 5); if(k < 10) k = 10; diff --git a/src/main/java/net/minecraft/src/GuiMainMenu.java b/src/main/java/net/minecraft/src/GuiMainMenu.java index da987e8..1254303 100644 --- a/src/main/java/net/minecraft/src/GuiMainMenu.java +++ b/src/main/java/net/minecraft/src/GuiMainMenu.java @@ -331,18 +331,20 @@ public class GuiMainMenu extends GuiScreen { EaglerAdapter.glDisable(EaglerAdapter.GL_CULL_FACE); EaglerAdapter.glDepthMask(false); EaglerAdapter.glBlendFunc(EaglerAdapter.GL_SRC_ALPHA, EaglerAdapter.GL_ONE_MINUS_SRC_ALPHA); - byte var5 = 8; + byte var5 = ConfigConstants.panoramaBlur ? (byte)8 : (byte)1; for (int var6 = 0; var6 < var5 * var5; ++var6) { - EaglerAdapter.glPushMatrix(); - float var7 = ((float) (var6 % var5) / (float) var5 - 0.5F) / 64.0F; - float var8 = ((float) (var6 / var5) / (float) var5 - 0.5F) / 64.0F; - float var9 = 0.0F; - EaglerAdapter.glTranslatef(var7, var8, var9); - - float panTimer = (float)(System.currentTimeMillis() - start) * 0.03f; - EaglerAdapter.glRotatef(MathHelper.sin(panTimer / 400.0F) * 25.0F + 20.0F, 1.0F, 0.0F, 0.0F); - EaglerAdapter.glRotatef(-(panTimer) * 0.1F, 0.0F, 1.0F, 0.0F); + if (ConfigConstants.panoramaBlur) { + EaglerAdapter.glPushMatrix(); + float var7 = ((float) (var6 % var5) / (float) var5 - 0.5F) / 64.0F; + float var8 = ((float) (var6 / var5) / (float) var5 - 0.5F) / 64.0F; + float var9 = 0.0F; + EaglerAdapter.glTranslatef(var7, var8, var9); + + float panTimer = (float)(System.currentTimeMillis() - start) * 0.03f; + EaglerAdapter.glRotatef(MathHelper.sin(panTimer / 400.0F) * 25.0F + 20.0F, 1.0F, 0.0F, 0.0F); + EaglerAdapter.glRotatef(-(panTimer) * 0.1F, 0.0F, 1.0F, 0.0F); + } for (int var10 = 0; var10 < 6; ++var10) { EaglerAdapter.glPushMatrix(); @@ -383,7 +385,9 @@ public class GuiMainMenu extends GuiScreen { EaglerAdapter.glPopMatrix(); } - EaglerAdapter.glPopMatrix(); + if (ConfigConstants.panoramaBlur) { + EaglerAdapter.glPopMatrix(); + } EaglerAdapter.glColorMask(true, true, true, false); } diff --git a/src/main/java/net/minecraft/src/StringTranslate.java b/src/main/java/net/minecraft/src/StringTranslate.java index 89c8bfe..931492d 100644 --- a/src/main/java/net/minecraft/src/StringTranslate.java +++ b/src/main/java/net/minecraft/src/StringTranslate.java @@ -44,18 +44,17 @@ public class StringTranslate { } private void loadLanguage(Properties par1Properties, String par2Str) throws IOException { - BufferedReader var3 = null; + String[] var3 = EaglerAdapter.fileContents("/lang/" + par2Str + ".lang").replace('\r', '\n') + .replaceAll("\n+", "\n").split("\n"); - var3 = new BufferedReader(new InputStreamReader(EaglerAdapter.loadResource("/lang/" + par2Str + ".lang"), "UTF-8")); - - for (String var4 = var3.readLine(); var4 != null; var4 = var3.readLine()) { + for (String var4 : var3) { var4 = var4.trim(); - if (!var4.startsWith("#")) { - String[] var5 = var4.split("="); + if (!var4.isEmpty() && !var4.startsWith("#")) { + int var5 = var4.indexOf('='); - if (var5 != null && var5.length == 2) { - par1Properties.setProperty(var5[0], var5[1]); + if (var5 != -1) { + par1Properties.setProperty(var4.substring(0, var5), var4.substring(var5 + 1)); } } } diff --git a/zip-generator/src/main/java/net/lax1dude/eaglercraft/zip_generator/ZipGenerator.java b/zip-generator/src/main/java/net/lax1dude/eaglercraft/zip_generator/ZipGenerator.java index 99b0ffc..3422357 100644 --- a/zip-generator/src/main/java/net/lax1dude/eaglercraft/zip_generator/ZipGenerator.java +++ b/zip-generator/src/main/java/net/lax1dude/eaglercraft/zip_generator/ZipGenerator.java @@ -25,7 +25,7 @@ public class ZipGenerator { System.out.println(); try { - if(!net.lax1dude.eaglercraft.v1_8.buildtools.Java11Check.classLoadCheck()) { + if(!(boolean) Class.forName("net.lax1dude.eaglercraft.v1_8.buildtools.Java11Check").getMethod("classLoadCheck").invoke(null)) { throw new RuntimeException("wtf?"); } }catch(Throwable t) { @@ -47,6 +47,12 @@ public class ZipGenerator { System.out.println("Loading 'javascript/classes.js'"); String classesJs = FileUtils.readFileToString(new File("javascript/classes.js"), "UTF-8").replaceFirst("\\/\\/# sourceMappingURL=.*(\\r\\n|\\r|\\n)*", "").trim(); + + File f = new File("crash_report_override.txt"); + if(f.isFile()) { + classesJs = classesJs.replace("If this has happened more than once then please copy the text on this screen and publish" + + " it in the issues feed of this fork\\'s GitHub repository.", FileUtils.readFileToString(f, "UTF-8").trim()); + } System.out.println("Loading 'javascript/classes_server.js'"); String classesServerJs = FileUtils.readFileToString(new File("javascript/classes_server.js"), "UTF-8").replaceFirst("\\/\\/# sourceMappingURL=.*(\\r\\n|\\r|\\n)*", "").trim(); @@ -67,8 +73,8 @@ public class ZipGenerator { FileUtils.writeStringToFile(new File("stable-download/Offline_Download_Version.html"), offlineTemplate, "UTF-8"); - System.out.println("Copying 'javascript/classes.js' to 'stable-download/web/classes.js'"); - FileUtils.copyFile(new File("javascript/classes.js"), new File("stable-download/web/classes.js")); + System.out.println("Writing 'javascript/classes.js' to 'stable-download/web/classes.js'"); + FileUtils.writeStringToFile(new File("stable-download/web/classes.js"), classesJs, "UTF-8"); System.out.println("Copying 'javascript/classes.js.map' to 'stable-download/web/classes.js.map'"); FileUtils.copyFile(new File("javascript/classes.js.map"), new File("stable-download/web/classes.js.map")); diff --git a/zip-generator/zipGenerator.jar b/zip-generator/zipGenerator.jar index 59dd8297cf377838d8dd0420cdf9ec6d21d8b500..acf9dc4ad2db6cafebfb42bdd075489cb6409130 100644 GIT binary patch delta 6101 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 literal 6791 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