Optimized Packet Writing (separate Thread for I/O operations)
This commit is contained in:
@@ -54,7 +54,7 @@ public class GuiReplayOverlay extends Gui {
|
|||||||
|
|
||||||
private int ppButtonX = 10;
|
private int ppButtonX = 10;
|
||||||
private int ppButtonY = 10;
|
private int ppButtonY = 10;
|
||||||
|
|
||||||
private int r_ppButtonX = 10;
|
private int r_ppButtonX = 10;
|
||||||
private int r_ppButtonY = realTimelineY+1;
|
private int r_ppButtonY = realTimelineY+1;
|
||||||
|
|
||||||
@@ -191,8 +191,10 @@ public class GuiReplayOverlay extends Gui {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
speedSlider.mouseReleased(mouseX, mouseY);
|
try {
|
||||||
mouseDown = false;
|
speedSlider.mouseReleased(mouseX, mouseY);
|
||||||
|
mouseDown = false;
|
||||||
|
} catch(Exception e) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -605,10 +607,10 @@ public class GuiReplayOverlay extends Gui {
|
|||||||
this.drawModalRectWithCustomSizedTexture((int)real_x, ry, dx, dy, 5, 5, 64, 64);
|
this.drawModalRectWithCustomSizedTexture((int)real_x, ry, dx, dy, 5, 5, 64, 64);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Draw Play/Pause Button
|
//Draw Play/Pause Button
|
||||||
//Play/Pause button
|
//Play/Pause button
|
||||||
|
|
||||||
int dx = 0;
|
int dx = 0;
|
||||||
int dy = 0;
|
int dy = 0;
|
||||||
|
|
||||||
@@ -633,7 +635,7 @@ public class GuiReplayOverlay extends Gui {
|
|||||||
|
|
||||||
GlStateManager.resetColor();
|
GlStateManager.resetColor();
|
||||||
this.drawModalRectWithCustomSizedTexture(r_ppButtonX, r_ppButtonY, dx, dy, 20, 20, 64, 64);
|
this.drawModalRectWithCustomSizedTexture(r_ppButtonX, r_ppButtonY, dx, dy, 20, 20, 64, 64);
|
||||||
|
|
||||||
//Handling the click on the Replay starter
|
//Handling the click on the Replay starter
|
||||||
if(hover && Mouse.isButtonDown(0) && isClick()) {
|
if(hover && Mouse.isButtonDown(0) && isClick()) {
|
||||||
if(ReplayHandler.isReplaying()) {
|
if(ReplayHandler.isReplaying()) {
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
package eu.crushedpixel.replaymod.unused;
|
package eu.crushedpixel.replaymod.holders;
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import net.minecraft.network.Packet;
|
import net.minecraft.network.Packet;
|
||||||
|
|
||||||
public class DataReciever {
|
public class PacketData {
|
||||||
|
|
||||||
private byte[] array;
|
private byte[] array;
|
||||||
private int timestamp;
|
private int timestamp;
|
||||||
|
|
||||||
public DataReciever(byte[] array, int timestamp) {
|
public PacketData(byte[] array, int timestamp) {
|
||||||
this.array = array;
|
this.array = array;
|
||||||
this.timestamp = timestamp;
|
this.timestamp = timestamp;
|
||||||
}
|
}
|
||||||
@@ -35,15 +35,15 @@ public class ConnectionEventHandler {
|
|||||||
|
|
||||||
private File currentFile;
|
private File currentFile;
|
||||||
private String fileName;
|
private String fileName;
|
||||||
|
|
||||||
private static PacketListener packetListener = null;
|
private static PacketListener packetListener = null;
|
||||||
|
|
||||||
private static boolean isRecording = false;
|
private static boolean isRecording = false;
|
||||||
|
|
||||||
public static boolean isRecording() {
|
public static boolean isRecording() {
|
||||||
return isRecording;
|
return isRecording;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void insertPacket(Packet packet) {
|
public static void insertPacket(Packet packet) {
|
||||||
if(!isRecording || packetListener == null) {
|
if(!isRecording || packetListener == null) {
|
||||||
System.out.println("Invalid attempt to insert Packet!");
|
System.out.println("Invalid attempt to insert Packet!");
|
||||||
@@ -55,7 +55,7 @@ public class ConnectionEventHandler {
|
|||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@SubscribeEvent
|
@SubscribeEvent
|
||||||
public void onConnectedToServerEvent(ClientConnectedToServerEvent event) {
|
public void onConnectedToServerEvent(ClientConnectedToServerEvent event) {
|
||||||
System.out.println("Connected to server");
|
System.out.println("Connected to server");
|
||||||
@@ -101,17 +101,10 @@ public class ConnectionEventHandler {
|
|||||||
|
|
||||||
PacketListener insert = null;
|
PacketListener insert = null;
|
||||||
|
|
||||||
if(event.isLocal) {
|
pipeline.addBefore(packetHandlerKey, "replay_recorder", insert = new PacketListener
|
||||||
pipeline.addBefore(packetHandlerKey, "replay_recorder", insert = new PacketListener(currentFile, fileName, worldName, System.currentTimeMillis(), maxFileSize));
|
(currentFile, fileName, worldName, System.currentTimeMillis(), maxFileSize, event.isLocal));
|
||||||
ChatMessageRequests.addChatMessage("Recording started!", ChatMessageType.INFORMATION);
|
ChatMessageRequests.addChatMessage("Recording started!", ChatMessageType.INFORMATION);
|
||||||
isRecording = true;
|
isRecording = true;
|
||||||
|
|
||||||
} else {
|
|
||||||
//pipeline.addBefore(decoderKey, "replay_recorder", insert = new DataListener(currentFile, fileName, worldName, System.currentTimeMillis(), maxFileSize));
|
|
||||||
pipeline.addBefore(packetHandlerKey, "replay_recorder", insert = new PacketListener(currentFile, fileName, worldName, System.currentTimeMillis(), maxFileSize));
|
|
||||||
ChatMessageRequests.addChatMessage("Recording started!", ChatMessageType.INFORMATION);
|
|
||||||
isRecording = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
final PacketListener listener = insert;
|
final PacketListener listener = insert;
|
||||||
|
|
||||||
@@ -139,7 +132,7 @@ public class ConnectionEventHandler {
|
|||||||
}
|
}
|
||||||
}).start();
|
}).start();
|
||||||
}
|
}
|
||||||
|
|
||||||
packetListener = listener;
|
packetListener = listener;
|
||||||
|
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ import java.io.FileInputStream;
|
|||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||||
import java.util.zip.ZipEntry;
|
import java.util.zip.ZipEntry;
|
||||||
import java.util.zip.ZipOutputStream;
|
import java.util.zip.ZipOutputStream;
|
||||||
|
|
||||||
@@ -20,23 +23,24 @@ import com.google.gson.Gson;
|
|||||||
|
|
||||||
import eu.crushedpixel.replaymod.chat.ChatMessageRequests;
|
import eu.crushedpixel.replaymod.chat.ChatMessageRequests;
|
||||||
import eu.crushedpixel.replaymod.chat.ChatMessageRequests.ChatMessageType;
|
import eu.crushedpixel.replaymod.chat.ChatMessageRequests.ChatMessageType;
|
||||||
|
import eu.crushedpixel.replaymod.holders.PacketData;
|
||||||
|
|
||||||
public class DataListener extends ChannelInboundHandlerAdapter {
|
public abstract class DataListener extends ChannelInboundHandlerAdapter {
|
||||||
|
|
||||||
protected File file;
|
protected File file;
|
||||||
protected long startTime;
|
protected Long startTime = null;
|
||||||
protected long maxSize;
|
protected long maxSize;
|
||||||
protected long totalBytes = 0;
|
protected long totalBytes = 0;
|
||||||
protected DataOutputStream out;
|
|
||||||
protected String name;
|
protected String name;
|
||||||
protected String worldName;
|
protected String worldName;
|
||||||
|
|
||||||
|
private boolean singleplayer;
|
||||||
|
|
||||||
protected long lastSentPacket = 0;
|
protected long lastSentPacket = 0;
|
||||||
|
|
||||||
protected boolean alive = true;
|
protected boolean alive = true;
|
||||||
protected boolean isPacketListener = false;
|
|
||||||
|
protected DataWriter dataWriter;
|
||||||
private boolean writeJoinPacket = false;
|
|
||||||
|
|
||||||
private Gson gson = new Gson();
|
private Gson gson = new Gson();
|
||||||
|
|
||||||
@@ -44,141 +48,136 @@ public class DataListener extends ChannelInboundHandlerAdapter {
|
|||||||
this.worldName = worldName;
|
this.worldName = worldName;
|
||||||
System.out.println(worldName);
|
System.out.println(worldName);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void insertPacket(Packet p) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public DataListener(File file, String name, String worldName, long startTime, int maxSize) throws FileNotFoundException {
|
public DataListener(File file, String name, String worldName, long startTime, int maxSize, boolean singleplayer) throws FileNotFoundException {
|
||||||
this.file = file;
|
this.file = file;
|
||||||
this.startTime = startTime;
|
this.startTime = startTime;
|
||||||
this.maxSize = maxSize*1024*1024;
|
this.maxSize = maxSize*1024*1024;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.worldName = worldName;
|
this.worldName = worldName;
|
||||||
|
this.singleplayer = singleplayer;
|
||||||
|
|
||||||
System.out.println(worldName);
|
System.out.println(worldName);
|
||||||
|
|
||||||
FileOutputStream fos = new FileOutputStream(file);
|
FileOutputStream fos = new FileOutputStream(file);
|
||||||
BufferedOutputStream bos = new BufferedOutputStream(fos);
|
BufferedOutputStream bos = new BufferedOutputStream(fos);
|
||||||
out = new DataOutputStream(bos);
|
DataOutputStream out = new DataOutputStream(bos);
|
||||||
|
dataWriter = new DataWriter(out);
|
||||||
writeJoinPacket = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
|
||||||
if(!alive || isPacketListener) {
|
|
||||||
lastSentPacket = System.currentTimeMillis();
|
|
||||||
super.channelRead(ctx, msg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
if(writeJoinPacket) {
|
|
||||||
writeJoinPacket = false;
|
|
||||||
S01PacketJoinGame p = new S01PacketJoinGame();
|
|
||||||
|
|
||||||
int timestamp = 0;
|
|
||||||
|
|
||||||
PacketSerializer ps = new PacketSerializer(EnumPacketDirection.CLIENTBOUND);
|
|
||||||
ByteBuf bb = Unpooled.buffer();
|
|
||||||
|
|
||||||
PacketBuffer pb = new PacketBuffer(bb);
|
|
||||||
pb.writeInt(new Random().nextInt(1000));
|
|
||||||
pb.writeByte(3);
|
|
||||||
pb.writeByte(-1);
|
|
||||||
pb.writeByte(0);
|
|
||||||
pb.writeByte(100);
|
|
||||||
pb.writeString("default");
|
|
||||||
pb.writeBoolean(false);
|
|
||||||
|
|
||||||
p.readPacketData(pb);
|
|
||||||
|
|
||||||
ByteBuf b2 = Unpooled.buffer();
|
|
||||||
ps.encode(ctx, p, b2);
|
|
||||||
|
|
||||||
b2.readerIndex(0);
|
|
||||||
|
|
||||||
byte[] array = new byte[b2.readableBytes()];
|
|
||||||
b2.readBytes(array);
|
|
||||||
|
|
||||||
b2.readerIndex(0);
|
|
||||||
|
|
||||||
out.writeInt(timestamp);
|
|
||||||
out.writeInt(array.length);
|
|
||||||
out.write(array);
|
|
||||||
out.flush();
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
int timestamp = (int)(System.currentTimeMillis() - startTime);
|
|
||||||
|
|
||||||
ByteBuf byteBuf = (ByteBuf)msg;
|
|
||||||
|
|
||||||
byteBuf.readerIndex(0);
|
|
||||||
byte[] array = new byte[byteBuf.readableBytes()];
|
|
||||||
byteBuf.readBytes(array);
|
|
||||||
|
|
||||||
totalBytes += (array.length + (2*4)); //two Integer values and the Packet size
|
|
||||||
if(totalBytes >= maxSize && maxSize > 0) {
|
|
||||||
ChatMessageRequests.addChatMessage("Maximum file size exceeded", ChatMessageType.WARNING);
|
|
||||||
ChatMessageRequests.addChatMessage("The Recording has been stopped", ChatMessageType.WARNING);
|
|
||||||
alive = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
byteBuf.readerIndex(0);
|
|
||||||
|
|
||||||
out.writeInt(timestamp);
|
|
||||||
out.writeInt(array.length);
|
|
||||||
out.write(array);
|
|
||||||
out.flush();
|
|
||||||
|
|
||||||
super.channelRead(ctx, msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
|
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
|
||||||
out.flush();
|
dataWriter.requestFinish();
|
||||||
out.close();
|
}
|
||||||
|
|
||||||
|
public class DataWriter {
|
||||||
|
|
||||||
byte[] buffer = new byte[1024];
|
private boolean active = true;
|
||||||
|
|
||||||
try {
|
private ConcurrentLinkedQueue<PacketData> queue = new ConcurrentLinkedQueue<PacketData>();
|
||||||
ReplayMetaData metaData = new ReplayMetaData(isPacketListener, worldName, (int) (lastSentPacket - startTime), startTime);
|
|
||||||
String json = gson.toJson(metaData);
|
|
||||||
|
|
||||||
File folder = new File("./replay_recordings/");
|
public void writeData(PacketData data) {
|
||||||
folder.mkdirs();
|
queue.add(data);
|
||||||
|
|
||||||
File archive = new File(folder, name+ConnectionEventHandler.ZIP_FILE_EXTENSION);
|
|
||||||
archive.createNewFile();
|
|
||||||
|
|
||||||
FileOutputStream fos = new FileOutputStream(archive);
|
|
||||||
ZipOutputStream zos = new ZipOutputStream(fos);
|
|
||||||
|
|
||||||
zos.putNextEntry(new ZipEntry("metaData.json"));
|
|
||||||
PrintWriter pw = new PrintWriter(zos);
|
|
||||||
pw.write(json);
|
|
||||||
pw.flush();
|
|
||||||
zos.closeEntry();
|
|
||||||
|
|
||||||
zos.putNextEntry(new ZipEntry("recording"+ConnectionEventHandler.TEMP_FILE_EXTENSION));
|
|
||||||
FileInputStream fis = new FileInputStream(file);
|
|
||||||
int len;
|
|
||||||
while((len = fis.read(buffer)) > 0) {
|
|
||||||
zos.write(buffer, 0, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
fis.close();
|
|
||||||
zos.closeEntry();
|
|
||||||
|
|
||||||
zos.close();
|
|
||||||
|
|
||||||
file.delete();
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Thread outputThread = new Thread(new Runnable() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
|
||||||
|
HashMap<Class, Integer> counts = new HashMap<Class, Integer>();
|
||||||
|
|
||||||
|
while(active) {
|
||||||
|
PacketData dataReciever = queue.poll();
|
||||||
|
if(dataReciever != null) {
|
||||||
|
//write the ByteBuf to the given OutputStream
|
||||||
|
|
||||||
|
byte[] array = dataReciever.getByteArray();
|
||||||
|
|
||||||
|
if(array != null) {
|
||||||
|
try {
|
||||||
|
stream.writeInt(dataReciever.getTimestamp()); //Timestamp
|
||||||
|
stream.writeInt(array.length); //Lenght
|
||||||
|
|
||||||
|
stream.write(array); //Content
|
||||||
|
stream.flush();
|
||||||
|
} catch(Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
//let the Thread sleep for 1/4 second and queue up new Packets
|
||||||
|
Thread.sleep(250L);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
stream.flush();
|
||||||
|
stream.close();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Entry<Class, Integer> entries : counts.entrySet()) {
|
||||||
|
System.out.println(entries.getKey()+ "| "+entries.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
private DataOutputStream stream;
|
||||||
|
|
||||||
|
public DataWriter(DataOutputStream stream) {
|
||||||
|
this.stream = stream;
|
||||||
|
outputThread.start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void requestFinish() {
|
||||||
|
active = false;
|
||||||
|
byte[] buffer = new byte[1024];
|
||||||
|
|
||||||
|
try {
|
||||||
|
ReplayMetaData metaData = new ReplayMetaData(singleplayer, worldName, (int) lastSentPacket, startTime);
|
||||||
|
String json = gson.toJson(metaData);
|
||||||
|
|
||||||
|
File folder = new File("./replay_recordings/");
|
||||||
|
folder.mkdirs();
|
||||||
|
|
||||||
|
File archive = new File(folder, name+ConnectionEventHandler.ZIP_FILE_EXTENSION);
|
||||||
|
archive.createNewFile();
|
||||||
|
|
||||||
|
FileOutputStream fos = new FileOutputStream(archive);
|
||||||
|
ZipOutputStream zos = new ZipOutputStream(fos);
|
||||||
|
|
||||||
|
zos.putNextEntry(new ZipEntry("metaData.json"));
|
||||||
|
PrintWriter pw = new PrintWriter(zos);
|
||||||
|
pw.write(json);
|
||||||
|
pw.flush();
|
||||||
|
zos.closeEntry();
|
||||||
|
|
||||||
|
zos.putNextEntry(new ZipEntry("recording"+ConnectionEventHandler.TEMP_FILE_EXTENSION));
|
||||||
|
FileInputStream fis = new FileInputStream(file);
|
||||||
|
int len;
|
||||||
|
while((len = fis.read(buffer)) > 0) {
|
||||||
|
zos.write(buffer, 0, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
fis.close();
|
||||||
|
zos.closeEntry();
|
||||||
|
|
||||||
|
zos.close();
|
||||||
|
|
||||||
|
file.delete();
|
||||||
|
} catch(Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,17 +15,19 @@ import net.minecraft.network.play.server.S0CPacketSpawnPlayer;
|
|||||||
import net.minecraft.network.play.server.S0FPacketSpawnMob;
|
import net.minecraft.network.play.server.S0FPacketSpawnMob;
|
||||||
import eu.crushedpixel.replaymod.chat.ChatMessageRequests;
|
import eu.crushedpixel.replaymod.chat.ChatMessageRequests;
|
||||||
import eu.crushedpixel.replaymod.chat.ChatMessageRequests.ChatMessageType;
|
import eu.crushedpixel.replaymod.chat.ChatMessageRequests.ChatMessageType;
|
||||||
|
import eu.crushedpixel.replaymod.holders.PacketData;
|
||||||
import eu.crushedpixel.replaymod.reflection.MCPNames;
|
import eu.crushedpixel.replaymod.reflection.MCPNames;
|
||||||
|
|
||||||
public class PacketListener extends DataListener {
|
public class PacketListener extends DataListener {
|
||||||
|
|
||||||
public PacketListener(File file, String name, String worldName, long startTime, int maxSize) throws FileNotFoundException {
|
public PacketListener(File file, String name, String worldName, long startTime, int maxSize, boolean singleplayer) throws FileNotFoundException {
|
||||||
super(file, name, worldName, startTime, maxSize);
|
super(file, name, worldName, startTime, maxSize, singleplayer);
|
||||||
isPacketListener = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private ChannelHandlerContext context = null;
|
private ChannelHandlerContext context = null;
|
||||||
|
|
||||||
|
private static final PacketSerializer packetSerializer = new PacketSerializer(EnumPacketDirection.CLIENTBOUND);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
||||||
if(ctx == null) {
|
if(ctx == null) {
|
||||||
@@ -44,12 +46,12 @@ public class PacketListener extends DataListener {
|
|||||||
try {
|
try {
|
||||||
Packet packet = (Packet)msg;
|
Packet packet = (Packet)msg;
|
||||||
|
|
||||||
|
if(startTime == null) startTime = System.currentTimeMillis();
|
||||||
|
|
||||||
int timestamp = (int)(System.currentTimeMillis() - startTime);
|
int timestamp = (int)(System.currentTimeMillis() - startTime);
|
||||||
|
|
||||||
//Converts the packet back to a ByteBuffer for correct saving
|
//Converts the packet back to a ByteBuffer for correct saving
|
||||||
|
|
||||||
PacketSerializer ps = new PacketSerializer(EnumPacketDirection.CLIENTBOUND);
|
|
||||||
|
|
||||||
ByteBuf bb = Unpooled.buffer();
|
ByteBuf bb = Unpooled.buffer();
|
||||||
if(packet instanceof S0FPacketSpawnMob) {
|
if(packet instanceof S0FPacketSpawnMob) {
|
||||||
Field field_149043_l = S0FPacketSpawnMob.class.getDeclaredField(MCPNames.field("field_149043_l"));
|
Field field_149043_l = S0FPacketSpawnMob.class.getDeclaredField(MCPNames.field("field_149043_l"));
|
||||||
@@ -71,13 +73,12 @@ public class PacketListener extends DataListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ps.encode(ctx, packet, bb);
|
packetSerializer.encode(ctx, packet, bb);
|
||||||
|
|
||||||
bb.readerIndex(0);
|
bb.readerIndex(0);
|
||||||
byte[] array = new byte[bb.readableBytes()];
|
byte[] array = new byte[bb.readableBytes()];
|
||||||
bb.readBytes(array);
|
bb.readBytes(array);
|
||||||
|
|
||||||
|
|
||||||
totalBytes += (array.length + (2*4)); //two Integer values and the Packet size
|
totalBytes += (array.length + (2*4)); //two Integer values and the Packet size
|
||||||
if(totalBytes >= maxSize && maxSize > 0) {
|
if(totalBytes >= maxSize && maxSize > 0) {
|
||||||
ChatMessageRequests.addChatMessage("Maximum file size exceeded", ChatMessageType.WARNING);
|
ChatMessageRequests.addChatMessage("Maximum file size exceeded", ChatMessageType.WARNING);
|
||||||
@@ -87,11 +88,9 @@ public class PacketListener extends DataListener {
|
|||||||
|
|
||||||
bb.readerIndex(0);
|
bb.readerIndex(0);
|
||||||
|
|
||||||
out.writeInt(timestamp); //Timestamp
|
dataWriter.writeData(new PacketData(array, timestamp));
|
||||||
out.writeInt(array.length); //Lenght
|
|
||||||
out.write(array);
|
|
||||||
out.flush();
|
|
||||||
|
|
||||||
|
lastSentPacket = timestamp;
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,88 +0,0 @@
|
|||||||
package eu.crushedpixel.replaymod.unused;
|
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
|
||||||
import io.netty.buffer.Unpooled;
|
|
||||||
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
|
||||||
|
|
||||||
import net.minecraft.network.PacketBuffer;
|
|
||||||
|
|
||||||
public class DataWriter {
|
|
||||||
|
|
||||||
private boolean active = true;
|
|
||||||
|
|
||||||
private ConcurrentLinkedQueue<DataReciever> queue = new ConcurrentLinkedQueue<DataReciever>();
|
|
||||||
|
|
||||||
Thread outputThread = new Thread(new Runnable() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
|
|
||||||
HashMap<Class, Integer> counts = new HashMap<Class, Integer>();
|
|
||||||
|
|
||||||
while(active) {
|
|
||||||
DataReciever dataReciever = queue.poll();
|
|
||||||
if(dataReciever != null) {
|
|
||||||
//write the ByteBuf to the given OutputStream
|
|
||||||
|
|
||||||
byte[] array = dataReciever.getByteArray();
|
|
||||||
|
|
||||||
if(array != null) {
|
|
||||||
try {
|
|
||||||
|
|
||||||
stream.writeInt(dataReciever.getTimestamp()); //Timestamp
|
|
||||||
stream.writeInt(array.length); //Lenght
|
|
||||||
|
|
||||||
stream.write(array); //Content
|
|
||||||
stream.flush();
|
|
||||||
} catch(Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
//let the Thread sleep for 1/2 second and queue up new Packets
|
|
||||||
Thread.sleep(500L);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
stream.close();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
for(Entry<Class, Integer> entries : counts.entrySet()) {
|
|
||||||
System.out.println(entries.getKey()+ "| "+entries.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
public ConcurrentLinkedQueue<DataReciever> getQueue() {
|
|
||||||
return queue;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setQueue(ConcurrentLinkedQueue<DataReciever> queue) {
|
|
||||||
this.queue = queue;
|
|
||||||
}
|
|
||||||
|
|
||||||
private DataOutputStream stream;
|
|
||||||
|
|
||||||
public DataWriter(DataOutputStream stream) {
|
|
||||||
this.stream = stream;
|
|
||||||
outputThread.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void requestFinish() {
|
|
||||||
active = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
package eu.crushedpixel.replaymod.unused;
|
|
||||||
|
|
||||||
import io.netty.buffer.Unpooled;
|
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
|
||||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
|
||||||
import net.minecraft.network.EnumConnectionState;
|
|
||||||
import net.minecraft.network.EnumPacketDirection;
|
|
||||||
import net.minecraft.network.NetworkManager;
|
|
||||||
import net.minecraft.network.Packet;
|
|
||||||
import net.minecraft.network.PacketBuffer;
|
|
||||||
|
|
||||||
public class PacketListener extends ChannelInboundHandlerAdapter {
|
|
||||||
|
|
||||||
private PacketWriter packetWriter;
|
|
||||||
private long startTime;
|
|
||||||
|
|
||||||
public PacketListener(PacketWriter packetWriter, long startTime) {
|
|
||||||
this.packetWriter = packetWriter;
|
|
||||||
this.startTime = startTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
|
||||||
super.channelRead(ctx, msg);
|
|
||||||
|
|
||||||
if(msg instanceof Packet) {
|
|
||||||
Packet packet = (Packet)msg;
|
|
||||||
int packetID = ((EnumConnectionState)ctx.channel()
|
|
||||||
.attr(NetworkManager.attrKeyConnectionState).get()).getPacketId(EnumPacketDirection.CLIENTBOUND, packet);
|
|
||||||
int timestamp = (int) (System.currentTimeMillis() - startTime);
|
|
||||||
PacketReciever reciever = new PacketReciever(packet, (short)packetID, timestamp);
|
|
||||||
packetWriter.getQueue().add(reciever);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
package eu.crushedpixel.replaymod.unused;
|
|
||||||
|
|
||||||
import net.minecraft.network.Packet;
|
|
||||||
|
|
||||||
public class PacketReciever {
|
|
||||||
|
|
||||||
private Packet packet;
|
|
||||||
private short packetID;
|
|
||||||
private int timestamp;
|
|
||||||
|
|
||||||
public PacketReciever(Packet packet, short packetID, int timestamp) {
|
|
||||||
this.packet = packet;
|
|
||||||
this.packetID = packetID;
|
|
||||||
this.timestamp = timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Packet getPacket() {
|
|
||||||
return packet;
|
|
||||||
}
|
|
||||||
public void setPacket(Packet packet) {
|
|
||||||
this.packet = packet;
|
|
||||||
}
|
|
||||||
public short getPacketID() {
|
|
||||||
return packetID;
|
|
||||||
}
|
|
||||||
public void setPacketID(short packetID) {
|
|
||||||
this.packetID = packetID;
|
|
||||||
}
|
|
||||||
public int getTimestamp() {
|
|
||||||
return timestamp;
|
|
||||||
}
|
|
||||||
public void setTimestamp(int timestamp) {
|
|
||||||
this.timestamp = timestamp;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
package eu.crushedpixel.replaymod.unused;
|
|
||||||
|
|
||||||
import io.netty.buffer.ByteBuf;
|
|
||||||
import io.netty.buffer.Unpooled;
|
|
||||||
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
|
||||||
|
|
||||||
import net.minecraft.network.PacketBuffer;
|
|
||||||
|
|
||||||
public class PacketWriter {
|
|
||||||
|
|
||||||
private boolean active = true;
|
|
||||||
|
|
||||||
private ConcurrentLinkedQueue<PacketReciever> queue = new ConcurrentLinkedQueue<PacketReciever>();
|
|
||||||
|
|
||||||
Thread outputThread = new Thread(new Runnable() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
|
|
||||||
HashMap<Class, Integer> counts = new HashMap<Class, Integer>();
|
|
||||||
|
|
||||||
while(active) {
|
|
||||||
PacketReciever packetReciever = queue.poll();
|
|
||||||
if(packetReciever != null) {
|
|
||||||
ByteBuf bb = Unpooled.buffer();
|
|
||||||
PacketBuffer packetBuffer = new PacketBuffer(bb);
|
|
||||||
//write the Packet to the given OutputStream
|
|
||||||
|
|
||||||
if(packetReciever.getPacket() != null) {
|
|
||||||
try {
|
|
||||||
packetReciever.getPacket().writePacketData(packetBuffer);
|
|
||||||
|
|
||||||
bb.readerIndex(0);
|
|
||||||
byte[] array = new byte[bb.readableBytes()];
|
|
||||||
bb.readBytes(array);
|
|
||||||
|
|
||||||
stream.writeInt(packetReciever.getTimestamp()); //Timestamp
|
|
||||||
stream.writeInt(array.length); //Lenght
|
|
||||||
|
|
||||||
if(counts.containsKey(packetReciever.getPacket().getClass())) {
|
|
||||||
counts.put(packetReciever.getPacket().getClass(), counts.get(packetReciever.getPacket().getClass())+array.length);
|
|
||||||
} else {
|
|
||||||
counts.put(packetReciever.getPacket().getClass(), array.length);
|
|
||||||
}
|
|
||||||
|
|
||||||
stream.writeShort(packetReciever.getPacketID()); //Packet ID
|
|
||||||
stream.write(array); //Content
|
|
||||||
stream.flush();
|
|
||||||
} catch(Exception e) {
|
|
||||||
System.out.println(packetReciever.getPacket().getClass());
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
//let the Thread sleep for 1/2 second and queue up new Packets
|
|
||||||
Thread.sleep(500L);
|
|
||||||
} catch (InterruptedException e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
stream.close();
|
|
||||||
} catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
|
|
||||||
for(Entry<Class, Integer> entries : counts.entrySet()) {
|
|
||||||
System.out.println(entries.getKey()+ "| "+entries.getValue());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
public ConcurrentLinkedQueue<PacketReciever> getQueue() {
|
|
||||||
return queue;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setQueue(ConcurrentLinkedQueue<PacketReciever> queue) {
|
|
||||||
this.queue = queue;
|
|
||||||
}
|
|
||||||
|
|
||||||
private DataOutputStream stream;
|
|
||||||
|
|
||||||
public PacketWriter(DataOutputStream stream) {
|
|
||||||
this.stream = stream;
|
|
||||||
outputThread.start();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void requestFinish() {
|
|
||||||
active = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user