From b2dd5c5dd993e73939904fd392d240ebfba36dcd Mon Sep 17 00:00:00 2001 From: PeytonPlayz595 <106421860+PeytonPlayz595@users.noreply.github.com> Date: Mon, 10 Jun 2024 20:31:25 -0400 Subject: [PATCH] Implement multiplayer, several bug fixes --- .../opengl/EaglerAdapterGL30.java | 32 ++- src/net/PeytonPlayz585/profile/Profile.java | 78 +++++++ .../socket/ByteBufferDirectInputStream.java | 22 ++ src/net/PeytonPlayz585/socket/Socket.java | 49 +++++ .../socket/SocketException.java | 62 ++++++ src/net/lax1dude/eaglercraft/Client.java | 2 +- src/net/minecraft/client/Minecraft.java | 9 +- src/net/minecraft/src/FontRenderer.java | 24 ++- src/net/minecraft/src/GuiConnecting.java | 8 +- src/net/minecraft/src/GuiContainer.java | 1 + src/net/minecraft/src/GuiGameOver.java | 6 + src/net/minecraft/src/GuiMultiplayer.java | 61 +++--- src/net/minecraft/src/NBTTagCompound.java | 4 + src/net/minecraft/src/NetClientHandler.java | 30 ++- src/net/minecraft/src/NetworkManager.java | 193 +++++++++--------- src/net/minecraft/src/Packet.java | 33 ++- src/net/minecraft/src/RenderGlobal.java | 2 +- src/net/minecraft/src/SoundManager.java | 6 +- .../minecraft/src/ThreadCloseConnection.java | 21 ++ .../minecraft/src/ThreadConnectToServer.java | 34 +++ src/net/minecraft/src/ThreadSleepForever.java | 24 --- 21 files changed, 509 insertions(+), 192 deletions(-) create mode 100644 src/net/PeytonPlayz585/profile/Profile.java create mode 100644 src/net/PeytonPlayz585/socket/ByteBufferDirectInputStream.java create mode 100644 src/net/PeytonPlayz585/socket/Socket.java create mode 100644 src/net/PeytonPlayz585/socket/SocketException.java create mode 100644 src/net/minecraft/src/ThreadCloseConnection.java create mode 100644 src/net/minecraft/src/ThreadConnectToServer.java delete mode 100644 src/net/minecraft/src/ThreadSleepForever.java diff --git a/src/net/PeytonPlayz585/opengl/EaglerAdapterGL30.java b/src/net/PeytonPlayz585/opengl/EaglerAdapterGL30.java index 4b0ac40..35c16cb 100644 --- a/src/net/PeytonPlayz585/opengl/EaglerAdapterGL30.java +++ b/src/net/PeytonPlayz585/opengl/EaglerAdapterGL30.java @@ -4,7 +4,9 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import java.nio.IntBuffer; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import net.PeytonPlayz585.glemu.FixedFunctionShader; import net.PeytonPlayz585.glemu.GLObjectMap; @@ -195,6 +197,8 @@ public class EaglerAdapterGL30 extends EaglerAdapterImpl2 { private BufferGL glbuffer; private int shaderMode; private int listLength; + + private List translate = new ArrayList(); private DisplayList(int id) { this.id = id; @@ -204,6 +208,16 @@ public class EaglerAdapterGL30 extends EaglerAdapterImpl2 { this.listLength = 0; } } + + private static class Translate { + private float f, f1, f2; + + private Translate(float f, float f1, float f2) { + this.f = f; + this.f1 = f1; + this.f2 = f2; + } + } private static final HashMap displayLists = new HashMap(); private static final HashMap displayListsInitialized = new HashMap(); @@ -370,7 +384,8 @@ public class EaglerAdapterGL30 extends EaglerAdapterImpl2 { deevis.set(p1, p2, p3); getMatrix().translate(deevis); if (isCompilingDisplayList) { - throw new IllegalArgumentException("matrix is not supported while recording display list use tessellator class instead"); + compilingDisplayList.translate.add(new Translate(p1, p2, p3)); + //throw new IllegalArgumentException("matrix is not supported while recording display list use tessellator class instead"); } } @@ -706,6 +721,13 @@ public class EaglerAdapterGL30 extends EaglerAdapterImpl2 { bindTheShader(d.shaderMode | getShaderModeFlag1()); _wglBindVertexArray0(d.glarray); _wglDrawQuadArrays(0, d.listLength); + + //glTranslate support for display lists + for(Translate t : d.translate) { + deevis.set(t.f, t.f1, t.f2); + getMatrix().translate(deevis); + } + shader.unuseProgram(); vertexDrawn += d.listLength * 6 / 4; triangleDrawn += d.listLength / 2; @@ -805,7 +827,13 @@ public class EaglerAdapterGL30 extends EaglerAdapterImpl2 { } public static final void glPolygonOffset(float p1, float p2) { - _wglPolygonOffset(p1, p2); + //if(p1 != 0) { + p1 = -p1; + //} + //if(p2 != 0) { + p2 = -p2; + //} + _wglPolygonOffset(-p1, -p2); } public static final void glCallLists(IntBuffer p1) { diff --git a/src/net/PeytonPlayz585/profile/Profile.java b/src/net/PeytonPlayz585/profile/Profile.java new file mode 100644 index 0000000..474288f --- /dev/null +++ b/src/net/PeytonPlayz585/profile/Profile.java @@ -0,0 +1,78 @@ +package net.PeytonPlayz585.profile; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2; +import net.minecraft.client.Minecraft; +import net.minecraft.src.CompressedStreamTools; +import net.minecraft.src.NBTTagCompound; + +public class Profile { + + private static String username = ""; + + public static String getName() { + return username; + } + + public static void setName(String str) { + username = str; + Minecraft mc = Minecraft.getMinecraft(); + if(mc != null) { + mc.session.username = str; + } + } + + public static void read() { + read(EaglerAdapterImpl2.loadLocalStorage("P")); + } + + public static void read(byte[] profileStorage) { + if (profileStorage == null) { + return; + } + + NBTTagCompound profile; + try { + profile = CompressedStreamTools.func_1138_a(new ByteArrayInputStream(profileStorage)); + }catch(IOException ex) { + return; + } + + if (profile == null || profile.hasNoTags()) { + return; + } + + String loadUsername = profile.getString("username").trim(); + + if(!loadUsername.isEmpty()) { + username = loadUsername.replaceAll("[^A-Za-z0-9]", "_"); + } + } + + private static byte[] write() { + NBTTagCompound profile = new NBTTagCompound(); + profile.setString("username", username); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try { + CompressedStreamTools.writeGzippedCompoundToOutputStream(profile, baos); + } catch (IOException e) { + return null; + } + return baos.toByteArray(); + } + + public static void save() { + byte[] b = write(); + if(b != null) { + EaglerAdapterImpl2.saveLocalStorage("P", b); + } + } + + static { + read(); + } + +} diff --git a/src/net/PeytonPlayz585/socket/ByteBufferDirectInputStream.java b/src/net/PeytonPlayz585/socket/ByteBufferDirectInputStream.java new file mode 100644 index 0000000..87ba4bf --- /dev/null +++ b/src/net/PeytonPlayz585/socket/ByteBufferDirectInputStream.java @@ -0,0 +1,22 @@ +package net.PeytonPlayz585.socket; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; + +public class ByteBufferDirectInputStream extends InputStream { + private ByteBuffer buf; + public ByteBufferDirectInputStream(ByteBuffer b) { + this.buf = b; + } + + @Override + public int read() throws IOException { + return buf.remaining() > 0 ? ((int) buf.get() & 0xFF) : -1; + } + + @Override + public int available() { + return buf.remaining(); + } +} \ No newline at end of file diff --git a/src/net/PeytonPlayz585/socket/Socket.java b/src/net/PeytonPlayz585/socket/Socket.java new file mode 100644 index 0000000..b2727dc --- /dev/null +++ b/src/net/PeytonPlayz585/socket/Socket.java @@ -0,0 +1,49 @@ +package net.PeytonPlayz585.socket; + +import java.io.IOException; + +import net.lax1dude.eaglercraft.adapter.EaglerAdapterImpl2; + +public class Socket { + + public Socket(String hostName, int port) throws IOException { + if(!EaglerAdapterImpl2.startConnection(hostName + ":" + port)) { + IOException e = new IOException("Connection failed: " + hostName + ":" + port); + e.printStackTrace(); + throw e; + } + } + + public Socket(String hostName) throws IOException { + if(!EaglerAdapterImpl2.startConnection(hostName)) { + IOException e = new IOException("Connection failed: " + hostName); + e.printStackTrace(); + throw e; + } + } + + public void write(byte[] data) { + if(socketOpen()) { + EaglerAdapterImpl2.writePacket(data); + } + } + + public byte[] read() { + if(socketOpen()) { + return EaglerAdapterImpl2.readPacket(); + } else { + return null; + } + } + + public void close() { + if(socketOpen()) { + EaglerAdapterImpl2.endConnection(); + } + } + + public boolean socketOpen() { + return EaglerAdapterImpl2.connectionOpen(); + } + +} diff --git a/src/net/PeytonPlayz585/socket/SocketException.java b/src/net/PeytonPlayz585/socket/SocketException.java new file mode 100644 index 0000000..59d2895 --- /dev/null +++ b/src/net/PeytonPlayz585/socket/SocketException.java @@ -0,0 +1,62 @@ +/* + * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package net.PeytonPlayz585.socket; + +import java.io.IOException; + +/** + * Thrown to indicate that there is an error creating or accessing a Socket. + * + * @author Jonathan Payne + * @since JDK1.0 + */ +public +class SocketException extends IOException { + private static final long serialVersionUID = -5935874303556886934L; + + /** + * Constructs a new {@code SocketException} with the + * specified detail message. + * + * @param msg the detail message. + */ + public SocketException(String msg) { + super(msg); + } + + /** + * Constructs a new {@code SocketException} with no detail message. + */ + public SocketException() { + } + + @Override + public String toString() { + String s = "java.net.SocketException"; + String message = getLocalizedMessage(); + return (message != null) ? (s + ": " + message) : s; + } +} \ No newline at end of file diff --git a/src/net/lax1dude/eaglercraft/Client.java b/src/net/lax1dude/eaglercraft/Client.java index 753c3ea..9e6423b 100644 --- a/src/net/lax1dude/eaglercraft/Client.java +++ b/src/net/lax1dude/eaglercraft/Client.java @@ -41,7 +41,7 @@ public class Client { private static void run0() { System.out.println(" -------- starting minecraft -------- "); instance = new Minecraft(); - Session session = new Session("Player", "mcpass"); + Session session = new Session("Player094", "mcpass"); instance.session = session; LocalStorageManager.loadStorage(); run1(); diff --git a/src/net/minecraft/client/Minecraft.java b/src/net/minecraft/client/Minecraft.java index 3910200..23dcbfc 100644 --- a/src/net/minecraft/client/Minecraft.java +++ b/src/net/minecraft/client/Minecraft.java @@ -72,7 +72,6 @@ import net.minecraft.src.TexturePortalFX; import net.minecraft.src.TextureWatchFX; import net.minecraft.src.TextureWaterFX; import net.minecraft.src.TextureWaterFlowFX; -import net.minecraft.src.ThreadSleepForever; import net.minecraft.src.Timer; import net.minecraft.src.UnexpectedThrowable; import net.minecraft.src.Vec3D; @@ -138,7 +137,6 @@ public class Minecraft implements Runnable { public Minecraft() { StatList.func_27360_a(); this.tempDisplayHeight = GL11.getCanvasHeight(); - new ThreadSleepForever(this, "Timer hack thread"); this.displayWidth = GL11.getCanvasWidth(); this.displayHeight = GL11.getCanvasHeight(); @@ -198,12 +196,7 @@ public class Minecraft implements Runnable { this.checkGLError("Post startup"); this.ingameGUI = new GuiIngame(this); - if(this.serverName != null) { - this.displayGuiScreen(new GuiConnecting(this, this.serverName, this.serverPort)); - } else { - this.displayGuiScreen(new GuiMainMenu()); - } - + this.displayGuiScreen(new GuiMainMenu()); } private void loadScreen() { diff --git a/src/net/minecraft/src/FontRenderer.java b/src/net/minecraft/src/FontRenderer.java index 8644daa..45472b8 100644 --- a/src/net/minecraft/src/FontRenderer.java +++ b/src/net/minecraft/src/FontRenderer.java @@ -10,6 +10,7 @@ public class FontRenderer { private int[] charWidth = new int[256]; public int fontTextureName = 0; private int fontDisplayLists; + private IntBuffer buffer = GLAllocation.createDirectIntBuffer(1024); public FontRenderer(GameSettings var1, String var2, RenderEngine var3) { BufferedImage var4; @@ -75,6 +76,7 @@ public class FontRenderer { var19.addVertexWithUV((double)(0.0F + var20), 0.0D, 0.0D, (double)(((float)var10 + var20) / 128.0F + var21), (double)((float)var11 / 128.0F + var23)); var19.addVertexWithUV(0.0D, 0.0D, 0.0D, (double)((float)var10 / 128.0F + var21), (double)((float)var11 / 128.0F + var23)); var19.draw(); + GL11.glTranslatef((float)this.charWidth[var9], 0.0F, 0.0F); GL11.glEndList(); } @@ -138,6 +140,7 @@ public class FontRenderer { } GL11.glColor4f(var10, var7, var8, var9); + this.buffer.clear(); GL11.glPushMatrix(); GL11.glTranslatef((float)var2, (float)var3, 0.0F); @@ -149,19 +152,30 @@ public class FontRenderer { var11 = 15; } - GL11.glCallList(fontDisplayLists + 256 + var11 + (var5 ? 16 : 0)); - GL11.glTranslatef(charWidth[256 + var11 + (var5 ? 16 : 0)] * 0.5f, 0.0F, 0.0F); + this.buffer.put(this.fontDisplayLists + 256 + var11 + (var5 ? 16 : 0)); + if(this.buffer.remaining() == 0) { + this.buffer.flip(); + GL11.glCallLists(this.buffer); + this.buffer.clear(); + } } if(var6 < var1.length()) { var11 = ChatAllowedCharacters.allowedCharacters.indexOf(var1.charAt(var6)); if(var11 >= 0) { - GL11.glCallList(fontDisplayLists + var11 + 32); - GL11.glTranslatef(charWidth[var11 + 32], 0.0F, 0.0F); + this.buffer.put(this.fontDisplayLists + var11 + 32); } } + + if(this.buffer.remaining() == 0) { + this.buffer.flip(); + GL11.glCallLists(this.buffer); + this.buffer.clear(); + } } + this.buffer.flip(); + GL11.glCallLists(this.buffer); GL11.glPopMatrix(); } } @@ -267,4 +281,4 @@ public class FontRenderer { return var6; } } -} +} \ No newline at end of file diff --git a/src/net/minecraft/src/GuiConnecting.java b/src/net/minecraft/src/GuiConnecting.java index 0ae7458..5dcebad 100644 --- a/src/net/minecraft/src/GuiConnecting.java +++ b/src/net/minecraft/src/GuiConnecting.java @@ -5,11 +5,11 @@ import net.minecraft.client.Minecraft; public class GuiConnecting extends GuiScreen { private NetClientHandler clientHandler; private boolean cancelled = false; - - public GuiConnecting(Minecraft var1, String var2, int var3) { - System.out.println("Connecting to " + var2 + ", " + var3); + + public GuiConnecting(Minecraft var1, String var2) { + System.out.println("Connecting to " + var2); var1.changeWorld1((World)null); - //(new ThreadConnectToServer(this, var1, var2, var3)).start(); + (new ThreadConnectToServer(this, var1, var2)).start(); } public void updateScreen() { diff --git a/src/net/minecraft/src/GuiContainer.java b/src/net/minecraft/src/GuiContainer.java index 34a12e5..eccf6e8 100644 --- a/src/net/minecraft/src/GuiContainer.java +++ b/src/net/minecraft/src/GuiContainer.java @@ -172,6 +172,7 @@ public abstract class GuiContainer extends GuiScreen { public void updateScreen() { super.updateScreen(); + this.mc.setIngameNotInFocus(); if(!this.mc.thePlayer.isEntityAlive() || this.mc.thePlayer.isDead) { this.mc.thePlayer.closeScreen(); } diff --git a/src/net/minecraft/src/GuiGameOver.java b/src/net/minecraft/src/GuiGameOver.java index 5f2f953..a8c9f7d 100644 --- a/src/net/minecraft/src/GuiGameOver.java +++ b/src/net/minecraft/src/GuiGameOver.java @@ -31,6 +31,12 @@ public class GuiGameOver extends GuiScreen { } } + + @Override + public void updateScreen() { + super.updateScreen(); + this.mc.setIngameNotInFocus(); + } public void drawScreen(int var1, int var2, float var3) { this.drawGradientRect(0, 0, this.width, this.height, 1615855616, -1602211792); diff --git a/src/net/minecraft/src/GuiMultiplayer.java b/src/net/minecraft/src/GuiMultiplayer.java index d280149..f148d99 100644 --- a/src/net/minecraft/src/GuiMultiplayer.java +++ b/src/net/minecraft/src/GuiMultiplayer.java @@ -2,15 +2,19 @@ package net.minecraft.src; import org.lwjgl.input.Keyboard; +import net.PeytonPlayz585.profile.Profile; + public class GuiMultiplayer extends GuiScreen { private GuiScreen parentScreen; private GuiTextField field_22111_h; + private GuiTextField username; public GuiMultiplayer(GuiScreen var1) { this.parentScreen = var1; } public void updateScreen() { + this.username.updateCursorCounter(); this.field_22111_h.updateCursorCounter(); } @@ -21,10 +25,15 @@ public class GuiMultiplayer extends GuiScreen { this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 96 + 12, var1.translateKey("multiplayer.connect"))); this.controlList.add(new GuiButton(1, this.width / 2 - 100, this.height / 4 + 120 + 12, var1.translateKey("gui.cancel"))); String var2 = this.mc.gameSettings.lastServer.replaceAll("_", ":"); - ((GuiButton)this.controlList.get(0)).enabled = var2.length() > 0; - this.field_22111_h = new GuiTextField(this, this.fontRenderer, this.width / 2 - 100, this.height / 4 - 10 + 50 + 18, 200, 20, var2); - this.field_22111_h.isFocused = true; + String var3 = Profile.getName(); + this.username = new GuiTextField(this, this.fontRenderer, this.width / 2 - 100, this.height / 4 - 10 + 25 + 18, 200, 20, var3); + this.field_22111_h = new GuiTextField(this, this.fontRenderer, this.width / 2 - 100, this.height / 4 - 10 + 65 + 18, 200, 20, var2); + this.username.isFocused = true; + this.username.setMaxStringLength(16); + this.field_22111_h.isFocused = false; this.field_22111_h.setMaxStringLength(128); + + ((GuiButton)this.controlList.get(0)).enabled = this.field_22111_h.getText().length() > 0 && this.username.getText().length() > 0; } public void onGuiClosed() { @@ -37,28 +46,13 @@ public class GuiMultiplayer extends GuiScreen { this.mc.displayGuiScreen(this.parentScreen); } else if(var1.id == 0) { String var2 = this.field_22111_h.getText().trim(); + String username1 = this.username.getText().trim(); this.mc.gameSettings.lastServer = var2.replaceAll(":", "_"); + Profile.setName(username1); + Profile.save(); this.mc.gameSettings.saveOptions(); - String[] var3 = var2.split(":"); - if(var2.startsWith("[")) { - int var4 = var2.indexOf("]"); - if(var4 > 0) { - String var5 = var2.substring(1, var4); - String var6 = var2.substring(var4 + 1).trim(); - if(var6.startsWith(":") && var6.length() > 0) { - var6 = var6.substring(1); - var3 = new String[]{var5, var6}; - } else { - var3 = new String[]{var5}; - } - } - } - - if(var3.length > 2) { - var3 = new String[]{var2}; - } - - this.mc.displayGuiScreen(new GuiConnecting(this.mc, var3[0], var3.length > 1 ? this.parseIntWithDefault(var3[1], 25565) : 25565)); + + this.mc.displayGuiScreen(new GuiConnecting(this.mc, var2)); } } @@ -74,26 +68,31 @@ public class GuiMultiplayer extends GuiScreen { protected void keyTyped(char var1, int var2) { this.field_22111_h.textboxKeyTyped(var1, var2); - if(var1 == 13) { - this.actionPerformed((GuiButton)this.controlList.get(0)); - } - - ((GuiButton)this.controlList.get(0)).enabled = this.field_22111_h.getText().length() > 0; + this.username.textboxKeyTyped(var1, var2); + + ((GuiButton)this.controlList.get(0)).enabled = this.field_22111_h.getText().length() > 0 && this.username.getText().length() > 0; } protected void mouseClicked(int var1, int var2, int var3) { super.mouseClicked(var1, var2, var3); this.field_22111_h.mouseClicked(var1, var2, var3); + this.username.mouseClicked(var1, var2, var3); } public void drawScreen(int var1, int var2, float var3) { StringTranslate var4 = StringTranslate.getInstance(); this.drawDefaultBackground(); this.drawCenteredString(this.fontRenderer, var4.translateKey("multiplayer.title"), this.width / 2, this.height / 4 - 60 + 20, 16777215); - this.drawString(this.fontRenderer, var4.translateKey("multiplayer.info1"), this.width / 2 - 140, this.height / 4 - 60 + 60 + 0, 10526880); - this.drawString(this.fontRenderer, var4.translateKey("multiplayer.info2"), this.width / 2 - 140, this.height / 4 - 60 + 60 + 9, 10526880); - this.drawString(this.fontRenderer, var4.translateKey("multiplayer.ipinfo"), this.width / 2 - 140, this.height / 4 - 60 + 60 + 36, 10526880); + this.drawString(this.fontRenderer, var4.translateKey("multiplayer.info1"), this.width / 2 - 140, this.height / 4 - 60 + 50 + 0, 10526880); + this.drawString(this.fontRenderer, var4.translateKey("multiplayer.info2"), this.width / 2 - 140, this.height / 4 - 60 + 50 + 9, 10526880); + this.drawString(this.fontRenderer, var4.translateKey("Username:"), this.width / 2 - 100, this.height / 4 - 100 + 85 + 36, 10526880); + this.drawString(this.fontRenderer, var4.translateKey("Server IP:"), this.width / 2 - 100, this.height / 4 - 60 + 85 + 36, 10526880); this.field_22111_h.drawTextBox(); + this.username.drawTextBox(); super.drawScreen(var1, var2, var3); } + + private boolean containsOnlyAZ09(String input) { + return input.matches("[a-z0-9]+") || input.matches("[A-Z0-9]+") || input.equals(" "); + } } diff --git a/src/net/minecraft/src/NBTTagCompound.java b/src/net/minecraft/src/NBTTagCompound.java index f8704cd..2761e86 100644 --- a/src/net/minecraft/src/NBTTagCompound.java +++ b/src/net/minecraft/src/NBTTagCompound.java @@ -135,6 +135,10 @@ public class NBTTagCompound extends NBTBase { return this.getByte(var1) != 0; } + public boolean hasNoTags() { + return this.tagMap.isEmpty(); + } + public String toString() { return "" + this.tagMap.size() + " entries"; } diff --git a/src/net/minecraft/src/NetClientHandler.java b/src/net/minecraft/src/NetClientHandler.java index 2702bc8..b80da0b 100644 --- a/src/net/minecraft/src/NetClientHandler.java +++ b/src/net/minecraft/src/NetClientHandler.java @@ -7,6 +7,8 @@ import java.io.IOException; //import java.net.UnknownHostException; import java.util.List; +import net.PeytonPlayz585.opengl.GL11; +import net.PeytonPlayz585.socket.Socket; import net.minecraft.client.Minecraft; public class NetClientHandler extends NetHandler { @@ -19,14 +21,32 @@ public class NetClientHandler extends NetHandler { public MapStorage field_28118_b = new MapStorage((ISaveHandler)null); Random rand = new Random(); - public NetClientHandler(Minecraft var1, String var2, int var3) throws IOException { + public NetClientHandler(Minecraft var1, String var2) throws IOException { this.mc = var1; - //Socket var4 = new Socket(InetAddress.getByName(var2), var3); - //this.netManager = new NetworkManager(var4, "Client", this); + + String uri = null; + if(var2.startsWith("ws://")) { + uri = var2.substring(5); + }else if(var2.startsWith("wss://")){ + uri = var2.substring(6); + }else if(!var2.contains("://")){ + uri = var2; + if(GL11.isSSLPage()) { + var2 = "wss://" + var2; + } else { + var2 = "ws://" + var2; + } + }else { + throw new IOException("Invalid URI Protocol!"); + } + + Socket var4 = new Socket(var2); + this.netManager = new NetworkManager(var4, "Client", this); } public void processReadPackets() { if(!this.disconnected) { + this.netManager.readPacket(); this.netManager.processReadPackets(); } @@ -379,6 +399,10 @@ public class NetClientHandler extends NetHandler { public void handleHandshake(Packet2Handshake var1) { this.addToSendQueue(new Packet1Login(this.mc.session.username, 14)); } + + public void handleHandshake() { + this.addToSendQueue(new Packet1Login(this.mc.session.username, 14)); + } public void disconnect() { this.disconnected = true; diff --git a/src/net/minecraft/src/NetworkManager.java b/src/net/minecraft/src/NetworkManager.java index 9c64125..2e76cc3 100644 --- a/src/net/minecraft/src/NetworkManager.java +++ b/src/net/minecraft/src/NetworkManager.java @@ -1,33 +1,32 @@ package net.minecraft.src; -import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; +import java.io.EOFException; import java.io.IOException; -//import java.net.Socket; -//import java.net.SocketAddress; -//import java.net.SocketException; +import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedList; import java.util.List; +import net.PeytonPlayz585.socket.ByteBufferDirectInputStream; +import net.PeytonPlayz585.socket.Socket; +import net.PeytonPlayz585.socket.SocketException; + public class NetworkManager { public static final Object threadSyncObject = new Object(); public static int numReadThreads; public static int numWriteThreads; private Object sendQueueLock = new Object(); - //private Socket networkSocket; - //private final SocketAddress remoteSocketAddress; - private DataInputStream socketInputStream; - private DataOutputStream socketOutputStream; + private Socket networkSocket; private boolean isRunning = true; private List readPackets = Collections.synchronizedList(new ArrayList()); private List dataPackets = Collections.synchronizedList(new ArrayList()); private List chunkDataPackets = Collections.synchronizedList(new ArrayList()); private NetHandler netHandler; private boolean isServerTerminating = false; - private Thread writeThread; - private Thread readThread; private boolean isTerminating = false; private String terminationReason = ""; private Object[] field_20101_t; @@ -38,25 +37,10 @@ public class NetworkManager { public int chunkDataSendCounter = 0; private int field_20100_w = 50; -// public NetworkManager(Socket var1, String var2, NetHandler var3) throws IOException { -// this.networkSocket = var1; -// this.remoteSocketAddress = var1.getRemoteSocketAddress(); -// this.netHandler = var3; -// -// try { -// var1.setSoTimeout(30000); -// var1.setTrafficClass(24); -// } catch (SocketException var5) { -// System.err.println(var5.getMessage()); -// } -// -// this.socketInputStream = new DataInputStream(var1.getInputStream()); -// this.socketOutputStream = new DataOutputStream(new BufferedOutputStream(var1.getOutputStream(), 5120)); -// this.readThread = new NetworkReaderThread(this, var2 + " read thread"); -// this.writeThread = new NetworkWriterThread(this, var2 + " write thread"); -// this.readThread.start(); -// this.writeThread.start(); -// } + public NetworkManager(Socket var1, String var2, NetHandler var3) throws IOException { + this.networkSocket = var1; + this.netHandler = var3; + } public void addToSendQueue(Packet var1) { if(!this.isServerTerminating) { @@ -68,7 +52,8 @@ public class NetworkManager { } else { this.dataPackets.add(var1); } - + sendPacket(); + } } } @@ -88,7 +73,14 @@ public class NetworkManager { this.sendQueueByteLength -= var2.getPacketSize() + 1; } - Packet.writePacket(var2, this.socketOutputStream); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream socketOutputStream = new DataOutputStream(baos); + Packet.writePacket(var2, socketOutputStream); + baos.flush(); + socketOutputStream.flush(); + this.networkSocket.write(baos.toByteArray()); + baos.flush(); + socketOutputStream.flush(); var10000 = field_28144_e; var10001 = var2.getPacketId(); var10000[var10001] += var2.getPacketSize() + 1; @@ -102,14 +94,21 @@ public class NetworkManager { this.sendQueueByteLength -= var2.getPacketSize() + 1; } - Packet.writePacket(var2, this.socketOutputStream); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream socketOutputStream = new DataOutputStream(baos); + Packet.writePacket(var2, socketOutputStream); + baos.flush(); + socketOutputStream.flush(); + this.networkSocket.write(baos.toByteArray()); + baos.flush(); + socketOutputStream.flush(); var10000 = field_28144_e; var10001 = var2.getPacketId(); var10000[var10001] += var2.getPacketSize() + 1; this.field_20100_w = 0; var1 = true; } - + return var1; } catch (Exception var8) { if(!this.isTerminating) { @@ -121,33 +120,69 @@ public class NetworkManager { } public void wakeThreads() { - this.readThread.interrupt(); - this.writeThread.interrupt(); + // Do nothing } - private boolean readPacket() { + private ByteBuffer oldChunkBuffer = null; + private LinkedList readChunks = new LinkedList(); + + public boolean readPacket() { boolean var1 = false; - - try { - Packet var2 = Packet.readPacket(this.socketInputStream, this.netHandler.isServerHandler()); - if(var2 != null) { - int[] var10000 = field_28145_d; - int var10001 = var2.getPacketId(); - var10000[var10001] += var2.getPacketSize() + 1; - this.readPackets.add(var2); - var1 = true; - } else { - this.networkShutdown("disconnect.endOfStream", new Object[0]); - } - - return var1; - } catch (Exception var3) { - if(!this.isTerminating) { - this.onNetworkError(var3); - } - - return false; + readChunks.clear(); + + if(oldChunkBuffer != null) { + readChunks.add(oldChunkBuffer); } + + byte[] packet; + while((packet = this.networkSocket.read()) != null) { + readChunks.add(ByteBuffer.wrap(packet)); + } + + if(!readChunks.isEmpty()) { + int cap = 0; + for(ByteBuffer b : readChunks) { + cap += b.limit(); + } + + ByteBuffer stream = ByteBuffer.allocate(cap); + for(ByteBuffer b : readChunks) { + stream.put(b); + } + stream.flip(); + + DataInputStream packetStream = new DataInputStream(new ByteBufferDirectInputStream(stream)); + while(stream.hasRemaining()) { + stream.mark(); + try { + Packet var2 = Packet.readPacket(packetStream, this.netHandler.isServerHandler()); + if(var2 != null) { + int[] var10000 = field_28145_d; + int var10001 = var2.getPacketId(); + var10000[var10001] += var2.getPacketSize() + 1; + this.readPackets.add(var2); + var1 = true; + } else { + this.networkShutdown("disconnect.endOfStream", new Object[0]); + } + } catch(EOFException e) { + stream.reset(); + break; + } catch(IOException e) { + continue; + } catch(Throwable t) { + t.printStackTrace(); + } + } + + if(stream.hasRemaining()) { + oldChunkBuffer = stream.slice(); + }else { + oldChunkBuffer = null; + } + } + + return var1; } private void onNetworkError(Exception var1) { @@ -160,30 +195,17 @@ public class NetworkManager { this.isTerminating = true; this.terminationReason = var1; this.field_20101_t = var2; - //(new NetworkMasterThread(this)).start(); this.isRunning = false; try { - this.socketInputStream.close(); - this.socketInputStream = null; - } catch (Throwable var6) { - } - - try { - this.socketOutputStream.close(); - this.socketOutputStream = null; - } catch (Throwable var5) { - } - - try { - //this.networkSocket.close(); - //this.networkSocket = null; + this.networkSocket.close(); + this.networkSocket = null; } catch (Throwable var4) { } } } - + public void processReadPackets() { if(this.sendQueueByteLength > 1048576) { this.networkShutdown("disconnect.overflow", new Object[0]); @@ -208,24 +230,23 @@ public class NetworkManager { if(this.isTerminating && this.readPackets.isEmpty()) { this.netHandler.handleErrorMessage(this.terminationReason, this.field_20101_t); } + + if(!this.networkSocket.socketOpen()) { + onNetworkError(new SocketException(new String("Connection reset"))); + } } public void func_28142_c() { this.wakeThreads(); this.isServerTerminating = true; - this.readThread.interrupt(); - //(new ThreadCloseConnection(this)).start(); + (new ThreadCloseConnection(this)).start(); } static boolean isRunning(NetworkManager var0) { return var0.isRunning; } - static boolean isServerTerminating(NetworkManager var0) { - return var0.isServerTerminating; - } - static boolean readNetworkPacket(NetworkManager var0) { return var0.readPacket(); } @@ -234,23 +255,7 @@ public class NetworkManager { return var0.sendPacket(); } - static DataOutputStream func_28140_f(NetworkManager var0) { - return var0.socketOutputStream; - } - - static boolean func_28138_e(NetworkManager var0) { - return var0.isTerminating; - } - static void func_30005_a(NetworkManager var0, Exception var1) { var0.onNetworkError(var1); } - - static Thread getReadThread(NetworkManager var0) { - return var0.readThread; - } - - static Thread getWriteThread(NetworkManager var0) { - return var0.writeThread; - } } diff --git a/src/net/minecraft/src/Packet.java b/src/net/minecraft/src/Packet.java index 2cdf256..e394116 100644 --- a/src/net/minecraft/src/Packet.java +++ b/src/net/minecraft/src/Packet.java @@ -53,32 +53,29 @@ public abstract class Packet { return ((Integer)packetClassToIdMap.get(this.getClass())).intValue(); } + + //Ignore EOFExceptions, it will be handled in NetworkManager public static Packet readPacket(DataInputStream var0, boolean var1) throws IOException { boolean var2 = false; Packet var3 = null; int var6; - try { - var6 = var0.read(); - if(var6 == -1) { - return null; - } - - if(var1 && !serverPacketIdList.contains(Integer.valueOf(var6)) || !var1 && !clientPacketIdList.contains(Integer.valueOf(var6))) { - throw new IOException("Bad packet id " + var6); - } - - var3 = getNewPacket(var6); - if(var3 == null) { - throw new IOException("Bad packet id " + var6); - } - - var3.readPacketData(var0); - } catch (EOFException var5) { - System.out.println("Reached end of stream"); + var6 = var0.read(); + if(var6 == -1) { return null; } + if(var1 && !serverPacketIdList.contains(Integer.valueOf(var6)) || !var1 && !clientPacketIdList.contains(Integer.valueOf(var6))) { + throw new IOException("Bad packet id " + var6); + } + + var3 = getNewPacket(var6); + if(var3 == null) { + throw new IOException("Bad packet id " + var6); + } + + var3.readPacketData(var0); + PacketCounter var4 = (PacketCounter)packetStats.get(Integer.valueOf(var6)); if(var4 == null) { var4 = new PacketCounter((Empty1)null); diff --git a/src/net/minecraft/src/RenderGlobal.java b/src/net/minecraft/src/RenderGlobal.java index aa4c20a..7374ba1 100644 --- a/src/net/minecraft/src/RenderGlobal.java +++ b/src/net/minecraft/src/RenderGlobal.java @@ -956,7 +956,7 @@ public class RenderGlobal implements IWorldAccess { var8 = this.worldObj.getBlockId(var2.blockX, var2.blockY, var2.blockZ); Block var9 = var8 > 0 ? Block.blocksList[var8] : null; GL11.glDisable(GL11.GL_ALPHA_TEST); - GL11.glPolygonOffset(3.0F, 3.0F); + GL11.glPolygonOffset(-3.0F, -3.0F); GL11.glEnable(GL11.GL_POLYGON_OFFSET_FILL); double var10 = var1.lastTickPosX + (var1.posX - var1.lastTickPosX) * (double)var5; double var12 = var1.lastTickPosY + (var1.posY - var1.lastTickPosY) * (double)var5; diff --git a/src/net/minecraft/src/SoundManager.java b/src/net/minecraft/src/SoundManager.java index 31bbfca..82b1ae6 100644 --- a/src/net/minecraft/src/SoundManager.java +++ b/src/net/minecraft/src/SoundManager.java @@ -103,7 +103,11 @@ public class SoundManager { double var4 = var1.prevPosX + (var1.posX - var1.prevPosX) * (double)var2; double var6 = var1.prevPosY + (var1.posY - var1.prevPosY) * (double)var2; double var8 = var1.prevPosZ + (var1.posZ - var1.prevPosZ) * (double)var2; - GL11.setListenerPos((float)var4, (float)var6, (float)var8, (float)var1.motionX, (float)var1.motionY, (float)var1.motionZ, (float)var9, (float)var3); + try { + GL11.setListenerPos((float)var4, (float)var6, (float)var8, (float)var1.motionX, (float)var1.motionY, (float)var1.motionZ, (float)var9, (float)var3); + } catch(Exception e) { + // ??? + } } } } diff --git a/src/net/minecraft/src/ThreadCloseConnection.java b/src/net/minecraft/src/ThreadCloseConnection.java new file mode 100644 index 0000000..461b323 --- /dev/null +++ b/src/net/minecraft/src/ThreadCloseConnection.java @@ -0,0 +1,21 @@ +package net.minecraft.src; + +class ThreadCloseConnection extends Thread { + final NetworkManager field_28109_a; + + ThreadCloseConnection(NetworkManager var1) { + this.field_28109_a = var1; + } + + public void run() { + try { + Thread.sleep(2000L); + if(NetworkManager.isRunning(this.field_28109_a)) { + this.field_28109_a.networkShutdown("disconnect.closed", new Object[0]); + } + } catch (Exception var2) { + var2.printStackTrace(); + } + + } +} \ No newline at end of file diff --git a/src/net/minecraft/src/ThreadConnectToServer.java b/src/net/minecraft/src/ThreadConnectToServer.java new file mode 100644 index 0000000..d12ec2b --- /dev/null +++ b/src/net/minecraft/src/ThreadConnectToServer.java @@ -0,0 +1,34 @@ +package net.minecraft.src; + +import net.minecraft.client.Minecraft; + +class ThreadConnectToServer { + final Minecraft mc; + final String hostName; + final GuiConnecting connectingGui; + + ThreadConnectToServer(GuiConnecting var1, Minecraft var2, String var3) { + this.connectingGui = var1; + this.mc = var2; + this.hostName = var3; + } + + public void start() { + try { + GuiConnecting.setNetClientHandler(this.connectingGui, new NetClientHandler(this.mc, this.hostName)); + if(GuiConnecting.isCancelled(this.connectingGui)) { + return; + } + + GuiConnecting.getNetClientHandler(this.connectingGui).handleHandshake(); + } catch (Exception var4) { + if(GuiConnecting.isCancelled(this.connectingGui)) { + return; + } + + var4.printStackTrace(); + this.mc.displayGuiScreen(new GuiConnectFailed("connect.failed", "disconnect.genericReason", new Object[]{var4.toString()})); + } + + } +} \ No newline at end of file diff --git a/src/net/minecraft/src/ThreadSleepForever.java b/src/net/minecraft/src/ThreadSleepForever.java deleted file mode 100644 index 8da7b6f..0000000 --- a/src/net/minecraft/src/ThreadSleepForever.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.minecraft.src; - -import net.minecraft.client.Minecraft; - -public class ThreadSleepForever extends Thread { - final Minecraft mc; - - public ThreadSleepForever(Minecraft var1, String var2) { - super(var2); - this.mc = var1; - this.setDaemon(true); - this.start(); - } - - public void run() { - while(this.mc.running) { - try { - Thread.sleep(2147483647L); - } catch (InterruptedException var2) { - } - } - - } -}