2025-01-29 13:20:04 -05:00
|
|
|
package kamkeel.npcs.network;
|
2025-01-29 13:28:14 -05:00
|
|
|
import cpw.mods.fml.common.network.internal.FMLProxyPacket;
|
2025-01-28 18:14:18 -05:00
|
|
|
import io.netty.buffer.ByteBuf;
|
|
|
|
|
import io.netty.buffer.Unpooled;
|
|
|
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
import java.util.HashMap;
|
2025-01-29 13:28:14 -05:00
|
|
|
import java.util.List;
|
2025-01-28 18:14:18 -05:00
|
|
|
import java.util.Map;
|
2025-01-28 18:25:30 -05:00
|
|
|
import java.util.UUID;
|
2025-01-29 13:28:14 -05:00
|
|
|
import java.util.ArrayList;
|
2025-01-28 18:14:18 -05:00
|
|
|
|
|
|
|
|
public abstract class LargeAbstractPacket extends AbstractPacket {
|
2025-01-28 18:25:30 -05:00
|
|
|
private static final int CHUNK_SIZE = 10000;
|
|
|
|
|
private static final Map<UUID, ByteBuf> packetChunks = new HashMap<>();
|
|
|
|
|
private static final Map<UUID, Integer> receivedChunks = new HashMap<>();
|
2025-01-28 18:14:18 -05:00
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void sendData(ByteBuf out) throws IOException {
|
|
|
|
|
ByteBuf data = Unpooled.buffer();
|
|
|
|
|
writeData(data);
|
|
|
|
|
int totalSize = data.readableBytes();
|
2025-01-28 18:25:30 -05:00
|
|
|
UUID packetId = UUID.randomUUID(); // Unique ID for this packet
|
2025-01-28 18:14:18 -05:00
|
|
|
int totalChunks = (int) Math.ceil((double) totalSize / CHUNK_SIZE);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < totalSize; i += CHUNK_SIZE) {
|
|
|
|
|
int chunkSize = Math.min(CHUNK_SIZE, totalSize - i);
|
|
|
|
|
ByteBuf chunk = data.readBytes(chunkSize);
|
2025-01-28 18:25:30 -05:00
|
|
|
out.writeLong(packetId.getMostSignificantBits());
|
|
|
|
|
out.writeLong(packetId.getLeastSignificantBits());
|
2025-01-28 18:14:18 -05:00
|
|
|
out.writeInt(totalSize);
|
|
|
|
|
out.writeInt(i);
|
|
|
|
|
out.writeInt(totalChunks);
|
|
|
|
|
out.writeBytes(chunk);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void receiveData(ByteBuf in, EntityPlayer player) throws IOException {
|
2025-01-28 18:25:30 -05:00
|
|
|
long mostSigBits = in.readLong();
|
|
|
|
|
long leastSigBits = in.readLong();
|
|
|
|
|
UUID packetId = new UUID(mostSigBits, leastSigBits);
|
2025-01-28 18:14:18 -05:00
|
|
|
int totalSize = in.readInt();
|
|
|
|
|
int offset = in.readInt();
|
|
|
|
|
int totalChunks = in.readInt();
|
|
|
|
|
ByteBuf chunk = in.readBytes(in.readableBytes());
|
|
|
|
|
|
|
|
|
|
ByteBuf data = packetChunks.computeIfAbsent(packetId, k -> Unpooled.buffer(totalSize));
|
|
|
|
|
data.setBytes(offset, chunk);
|
|
|
|
|
|
|
|
|
|
int receivedChunkCount = receivedChunks.compute(packetId, (k, v) -> (v == null) ? 1 : v + 1);
|
|
|
|
|
|
|
|
|
|
if (receivedChunkCount == totalChunks) {
|
|
|
|
|
packetChunks.remove(packetId);
|
|
|
|
|
receivedChunks.remove(packetId);
|
|
|
|
|
handleData(data, player);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-29 13:28:14 -05:00
|
|
|
public final List<FMLProxyPacket> generatePacketChunks() {
|
|
|
|
|
List<FMLProxyPacket> chunks = new ArrayList<>();
|
|
|
|
|
ByteBuf data = Unpooled.buffer();
|
|
|
|
|
try {
|
|
|
|
|
writeData(data);
|
|
|
|
|
int totalSize = data.readableBytes();
|
|
|
|
|
UUID packetId = UUID.randomUUID();
|
|
|
|
|
int totalChunks = (int) Math.ceil((double) totalSize / CHUNK_SIZE);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < totalSize; i += CHUNK_SIZE) {
|
|
|
|
|
int chunkSize = Math.min(CHUNK_SIZE, totalSize - i);
|
|
|
|
|
ByteBuf chunk = data.readBytes(chunkSize);
|
|
|
|
|
ByteBuf out = Unpooled.buffer();
|
|
|
|
|
out.writeLong(packetId.getMostSignificantBits());
|
|
|
|
|
out.writeLong(packetId.getLeastSignificantBits());
|
|
|
|
|
out.writeInt(totalSize);
|
|
|
|
|
out.writeInt(i);
|
|
|
|
|
out.writeInt(totalChunks);
|
|
|
|
|
out.writeBytes(chunk);
|
|
|
|
|
chunks.add(new FMLProxyPacket(out, getChannel().getChannelName()));
|
|
|
|
|
}
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
return chunks;
|
|
|
|
|
}
|
|
|
|
|
|
2025-01-28 18:14:18 -05:00
|
|
|
public abstract void writeData(ByteBuf out) throws IOException;
|
2025-01-28 18:25:30 -05:00
|
|
|
|
|
|
|
|
public abstract void handleData(ByteBuf data, EntityPlayer player) throws IOException;
|
2025-01-28 18:14:18 -05:00
|
|
|
}
|