Fix multiplayer

Should work with actual alpha servers now
This commit is contained in:
PeytonPlayz595 2024-10-16 12:39:44 -04:00
parent 3018e41862
commit d3142f1adf
5 changed files with 209 additions and 85 deletions

View File

@ -0,0 +1,22 @@
package net.PeytonPlayz585.network;
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();
}
}

View File

@ -0,0 +1,40 @@
package net.PeytonPlayz585.network;
import net.PeytonPlayz585.opengl.GL11;
import java.io.IOException;
import java.io.OutputStream;
public class Socket {
public Socket(String ip) throws IOException {
if(!GL11.EaglerAdapterImpl2.startConnection(ip)) {
throw new IOException("Failed to connect to '" + ip + "'!");
}
}
public void close() {
if(!GL11.EaglerAdapterImpl2.connectionOpen()) {
return;
}
GL11.EaglerAdapterImpl2.endConnection();
}
public boolean open() {
return GL11.EaglerAdapterImpl2.connectionOpen();
}
public void write(byte[] data) {
if(open()) {
GL11.EaglerAdapterImpl2.writePacket(data);
}
}
public byte[] read() {
if(open()) {
return GL11.EaglerAdapterImpl2.readPacket();
}
return null;
}
}

View File

@ -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.network;
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;
}
}

View File

@ -21,7 +21,8 @@ public class NetClientHandler extends NetHandler {
public void processReadPackets() { public void processReadPackets() {
if(!this.disconnected) { if(!this.disconnected) {
NetClientHandler.this.netManager.readPacket(); this.netManager.readPacket();
this.netManager.processReadPackets();
} }
} }

View File

@ -5,18 +5,20 @@ import java.io.DataInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.EOFException; import java.io.EOFException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import net.PeytonPlayz585.opengl.GL11; import net.PeytonPlayz585.network.ByteBufferDirectInputStream;
import net.PeytonPlayz585.network.Socket;
public class NetworkManager { public class NetworkManager {
private Object sendQueueLock = new Object(); private Object sendQueueLock = new Object();
private Socket field_12258_e;
private boolean isRunning = true; private boolean isRunning = true;
private List readPackets = Collections.synchronizedList(new ArrayList());
private List dataPackets = Collections.synchronizedList(new ArrayList()); private List dataPackets = Collections.synchronizedList(new ArrayList());
private List chunkDataPackets = Collections.synchronizedList(new ArrayList()); private List chunkDataPackets = Collections.synchronizedList(new ArrayList());
private NetHandler netHandler; private NetHandler netHandler;
@ -28,6 +30,7 @@ public class NetworkManager {
private int chunkDataSendCounter = 0; private int chunkDataSendCounter = 0;
public NetworkManager(String var4, NetHandler var3) throws IOException { public NetworkManager(String var4, NetHandler var3) throws IOException {
this.netHandler = var3; this.netHandler = var3;
String uri = null; String uri = null;
System.out.println(uri); System.out.println(uri);
@ -41,9 +44,8 @@ public class NetworkManager {
}else { }else {
throw new IOException("Invalid URI Protocol!"); throw new IOException("Invalid URI Protocol!");
} }
if(!GL11.EaglerAdapterImpl2.startConnection(var4)) {
throw new IOException("Websocket to " + uri + " failed!"); this.field_12258_e = new Socket(var4);
}
} }
public void addToSendQueue(Packet var1) { public void addToSendQueue(Packet var1) {
@ -56,13 +58,13 @@ public class NetworkManager {
} else { } else {
this.dataPackets.add(var1); this.dataPackets.add(var1);
} }
this.sendPacket();
} }
} }
} }
private ByteArrayOutputStream sendBuffer;
ByteArrayOutputStream os;
private void sendPacket() { private void sendPacket() {
try { try {
boolean var1 = true; boolean var1 = true;
@ -76,12 +78,14 @@ public class NetworkManager {
this.sendQueueByteLength -= var2.getPacketSize() + 1; this.sendQueueByteLength -= var2.getPacketSize() + 1;
} }
sendBuffer = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream yee = new DataOutputStream(sendBuffer); DataOutputStream socketOutputStream = new DataOutputStream(baos);
Packet.writePacket(var2, yee); Packet.writePacket(var2, socketOutputStream);
yee.flush(); baos.flush();
GL11.EaglerAdapterImpl2.writePacket(sendBuffer.toByteArray()); socketOutputStream.flush();
sendBuffer.flush(); this.field_12258_e.write(baos.toByteArray());
baos.flush();
socketOutputStream.flush();
} }
if((var1 || this.chunkDataSendCounter-- <= 0) && !this.chunkDataPackets.isEmpty()) { if((var1 || this.chunkDataSendCounter-- <= 0) && !this.chunkDataPackets.isEmpty()) {
@ -92,12 +96,14 @@ public class NetworkManager {
this.sendQueueByteLength -= var2.getPacketSize() + 1; this.sendQueueByteLength -= var2.getPacketSize() + 1;
} }
sendBuffer = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream yee = new DataOutputStream(sendBuffer); DataOutputStream socketOutputStream = new DataOutputStream(baos);
Packet.writePacket(var2, yee); Packet.writePacket(var2, socketOutputStream);
yee.flush(); baos.flush();
GL11.EaglerAdapterImpl2.writePacket(sendBuffer.toByteArray()); socketOutputStream.flush();
sendBuffer.flush(); this.field_12258_e.write(baos.toByteArray());
baos.flush();
socketOutputStream.flush();
this.chunkDataSendCounter = 50; this.chunkDataSendCounter = 50;
} }
@ -112,82 +118,62 @@ public class NetworkManager {
} }
} }
private ByteBuffer oldChunkBuffer = null; private ByteBuffer oldChunkBuffer = null;
private LinkedList<ByteBuffer> readChunks = new LinkedList(); private LinkedList<ByteBuffer> readChunks = new LinkedList();
public void readPacket() { public void readPacket() {
if(this.sendQueueByteLength > 1048576) {
this.networkShutdown("Send buffer overflow");
}
readChunks.clear(); readChunks.clear();
if(oldChunkBuffer != null) { if(oldChunkBuffer != null) {
readChunks.add(oldChunkBuffer); readChunks.add(oldChunkBuffer);
} }
byte[] packet; if(this.field_12258_e.open()) {
while((packet = GL11.EaglerAdapterImpl2.readPacket()) != null) { byte[] packet;
readChunks.add(ByteBuffer.wrap(packet)); while((packet = this.field_12258_e.read()) != null) {
readChunks.add(ByteBuffer.wrap(packet));
}
} }
if(!readChunks.isEmpty()) { if(!readChunks.isEmpty()) {
this.timeSinceLastRead = 0;
int cap = 0; int cap = 0;
for(ByteBuffer b : readChunks) { for(ByteBuffer b : readChunks) {
cap += b.limit(); cap += b.limit();
} }
ByteBuffer stream = ByteBuffer.allocate(cap); ByteBuffer stream = ByteBuffer.allocate(cap);
for(ByteBuffer b : readChunks) { for(ByteBuffer b : readChunks) {
stream.put(b); stream.put(b);
} }
stream.flip(); stream.flip();
DataInputStream packetStream = new DataInputStream(new ByteBufferDirectInputStream(stream)); DataInputStream packetStream = new DataInputStream(new ByteBufferDirectInputStream(stream));
int var1 = 100; while(stream.hasRemaining()) {
while(stream.hasRemaining() && var1-- > 0) {
stream.mark(); stream.mark();
try { try {
Packet pkt = Packet.readPacket(packetStream); Packet var1 = Packet.readPacket(packetStream);
if(pkt == null) { if(var1 != null) {
this.networkShutdown("End of Stream"); this.readPackets.add(var1);
} else {
this.networkShutdown("End of stream");
} }
pkt.processPacket(this.netHandler); } catch(EOFException e) {
} catch (EOFException e) {
stream.reset(); stream.reset();
break; break;
} catch (IOException e) {
continue;
} catch(ArrayIndexOutOfBoundsException e) {
continue;
} catch(NullPointerException e) {
continue;
} catch(Exception e) { } catch(Exception e) {
continue; continue;
} catch(Throwable t) { } catch(Throwable t) {
continue; continue;
} }
} }
if(stream.hasRemaining()) { if(stream.hasRemaining()) {
oldChunkBuffer = stream.slice(); oldChunkBuffer = stream.slice();
}else { }else {
oldChunkBuffer = null; oldChunkBuffer = null;
} }
}
if(this.timeSinceLastRead++ == 1200) {
this.networkShutdown("Timed out");
}
if(!isConnectionOpen() && !this.isTerminating) {
this.networkShutdown("Lost connection!");
}
if(this.isTerminating && this.readChunks.isEmpty()) {
this.netHandler.handleErrorMessage(this.terminationReason);
} }
} }
@ -201,42 +187,55 @@ public class NetworkManager {
this.isTerminating = true; this.isTerminating = true;
this.terminationReason = var1; this.terminationReason = var1;
this.isRunning = false; this.isRunning = false;
if(GL11.EaglerAdapterImpl2.connectionOpen()) {
GL11.EaglerAdapterImpl2.endConnection(); try {
this.field_12258_e.close();
this.field_12258_e = null;
} catch (Throwable var3) {
} }
} }
} }
public void processReadPackets() {
if(this.sendQueueByteLength > 1048576) {
this.networkShutdown("Send buffer overflow");
}
if(this.readPackets.isEmpty()) {
if(this.timeSinceLastRead++ == 1200) {
this.networkShutdown("Timed out");
}
} else {
this.timeSinceLastRead = 0;
}
int var1 = 100;
while(!this.readPackets.isEmpty() && var1-- >= 0) {
Packet var2 = (Packet)this.readPackets.remove(0);
var2.processPacket(this.netHandler);
}
if(this.isTerminating && this.readPackets.isEmpty()) {
this.netHandler.handleErrorMessage(this.terminationReason);
}
}
static boolean isRunning(NetworkManager var0) { static boolean isRunning(NetworkManager var0) {
return var0.isRunning; return var0.isRunning;
} }
static boolean isConnectionOpen() {
return GL11.EaglerAdapterImpl2.connectionOpen();
}
static boolean isServerTerminating(NetworkManager var0) { static boolean isServerTerminating(NetworkManager var0) {
return var0.isServerTerminating; return var0.isServerTerminating;
} }
static void readNetworkPacket(NetworkManager var0) {
var0.readPacket();
}
static void sendNetworkPacket(NetworkManager var0) { static void sendNetworkPacket(NetworkManager var0) {
var0.sendPacket(); var0.sendPacket();
} }
}
private static class ByteBufferDirectInputStream extends InputStream {
private ByteBuffer buf;
private 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();
}
}
}