diff --git a/Minecraft.Client/PlayerConnection.cpp b/Minecraft.Client/PlayerConnection.cpp index cd19a1ef7..548fcd885 100644 --- a/Minecraft.Client/PlayerConnection.cpp +++ b/Minecraft.Client/PlayerConnection.cpp @@ -81,12 +81,13 @@ PlayerConnection::~PlayerConnection() void PlayerConnection::tick() { - if( done ) return; - - if( m_bCloseOnTick ) - { - disconnect( DisconnectPacket::eDisconnect_Closed ); - return; + if (done || m_bCloseOnTick) + { + if (m_bCloseOnTick && !done) + { + disconnect(DisconnectPacket::eDisconnect_Closed); + } + return; } didTick = false; @@ -98,12 +99,29 @@ void PlayerConnection::tick() } catch (const IOException& e) { - app.DebugPrintF("IOException -- %ls\n", e.information); - disconnect(DisconnectPacket::eDisconnect_None); + app.DebugPrintf("IOException - %ls\n", e.information.c_str()); + disconnect(DisconnectPacket::eDisconnect_UnexpectedPacket); return; } + catch (const RuntimeException &e) + { + app.DebugPrintf("RuntimeException - %ls\n", e.information.c_str()); + disconnect(DisconnectPacket::eDisconnect_None); // izzint - no good disconnect packet for this, just keep as-is + return; + } + catch (const IllegalArgumentException &e) + { + app.DebugPrintf("IllegalArgumentException - %ls\n", e.information.c_str()); + disconnect(DisconnectPacket::eDisconnect_None); // izzint - no good disconnect packet for this, just keep as-is + return; + } + catch (const EOFException &e) + { + app.DebugPrintf("EOFException - %ls\n", e.information.c_str()); + disconnect(DisconnectPacket::eDisconnect_EndOfStream); + return; + } - connection->tick(); if(done) return; if ((tickCount - lastKeepAliveTick) > 20 * 1) diff --git a/Minecraft.World/DataInputStream.cpp b/Minecraft.World/DataInputStream.cpp index 18deed397..5dd3172bb 100644 --- a/Minecraft.World/DataInputStream.cpp +++ b/Minecraft.World/DataInputStream.cpp @@ -16,7 +16,14 @@ DataInputStream::DataInputStream(InputStream *in) : stream( in ) //This method simply performs in.read() and returns the result. int DataInputStream::read() { - return stream->read(); + int result = stream->read(); + + if (result == -1) + { + throw EOFException(L"DataInputStream::read - end of stream"); // izzint - implementation 4j didn't do for some reason + } + + return result; } //Reads some number of bytes from the contained input stream and stores them into the buffer array b. @@ -134,7 +141,7 @@ bool DataInputStream::readFully(byteArray b) int byteRead = stream->read(); if( byteRead == -1 ) { - return false; + throw EOFException(L"DataInputStream::readFully - end of stream"); } else { @@ -153,7 +160,7 @@ bool DataInputStream::readFully(charArray b) int byteRead = stream->read(); if( byteRead == -1 ) { - return false; + throw EOFException(L"DataInputStream::readFully - end of stream"); } else {