summaryrefslogtreecommitdiff
path: root/YWD/src/main/java/fyresmodjam/handlers/BasicPacket.java
diff options
context:
space:
mode:
Diffstat (limited to 'YWD/src/main/java/fyresmodjam/handlers/BasicPacket.java')
-rw-r--r--YWD/src/main/java/fyresmodjam/handlers/BasicPacket.java211
1 files changed, 211 insertions, 0 deletions
diff --git a/YWD/src/main/java/fyresmodjam/handlers/BasicPacket.java b/YWD/src/main/java/fyresmodjam/handlers/BasicPacket.java
new file mode 100644
index 0000000..dcf9fd8
--- /dev/null
+++ b/YWD/src/main/java/fyresmodjam/handlers/BasicPacket.java
@@ -0,0 +1,211 @@
+package fyresmodjam.handlers;
+
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+
+import io.netty.buffer.ByteBuf;
+import net.minecraft.entity.player.EntityPlayer;
+
+public class BasicPacket implements IPacket {
+ public static Class<?>[] validClassArray = { Integer.class, Boolean.class, String.class, Character.class,
+ Byte.class, Float.class, Double.class, int[].class, int[][].class };
+ public static ArrayList<Class<?>> validClasses = new ArrayList<Class<?>>();
+ static {
+ for (Class<?> c : validClassArray) {
+ validClasses.add(c);
+ }
+ }
+
+ public Object[] data = null;
+ public byte type;
+
+ public BasicPacket() {
+ }
+
+ public BasicPacket(int type) {
+ if (type == 0 || NewPacketHandler.packetTypes[type] != null) {
+ throw new RuntimeException("Packet slot " + type + " already in use.");
+ }
+
+ NewPacketHandler.packetTypes[type] = this;
+
+ this.type = (byte) type;
+ }
+
+ public BasicPacket(BasicPacket packet, Object... data) {
+ if (isValidPacketType(packet)) {
+ type = packet.type;
+ } else {
+ throw new RuntimeException("Must supply valid packet type.");
+ }
+
+ Class<?>[] classes = getExpectedClasses();
+
+ if (classes != null) {
+ for (Class<?> c : classes) {
+ if (!validClasses.contains(c)) {
+ throw new RuntimeException("Argument class not valid. (" + c + ")");
+ }
+ }
+
+ if (data == null || data.length != classes.length) {
+ throw new RuntimeException("Wrong number of arguments provided.");
+ } else {
+ for (int i = 0; i < data.length; i++) {
+ if (data[i].getClass() != classes[i]) {
+ throw new RuntimeException("Wrong argument class provided. (" + data[i].getClass()
+ + ", expected " + classes[i] + ")");
+ }
+ }
+ }
+ }
+
+ this.data = data;
+ }
+
+ private boolean isValidPacketType(BasicPacket packet) {
+ boolean packetTypeInBounds = packet.type > 0 && packet.type < NewPacketHandler.packetTypes.length;
+ boolean packetTypeMatches = packet == NewPacketHandler.packetTypes[packet.type];
+
+ return packetTypeInBounds && packetTypeMatches;
+ }
+
+ @Override
+ public void readBytes(ByteBuf bytes) {
+ type = bytes.readByte();
+
+ Class<?>[] classes = getExpectedClasses();
+
+ if (classes != null) {
+ data = new Object[classes.length];
+
+ for (int i = 0; i < classes.length; i++) {
+ if (classes[i] == Integer.class) {
+ data[i] = bytes.readInt();
+ }
+ if (classes[i] == int[].class) {
+ int[] array = new int[bytes.readInt()];
+ for (int i2 = 0; i2 < array.length; i2++) {
+ array[i2] = bytes.readInt();
+ }
+ data[i] = array;
+ }
+ if (classes[i] == int[][].class) {
+ int[][] array = new int[bytes.readInt()][];
+
+ for (int i2 = 0; i2 < array.length; i2++) {
+ array[i2] = new int[bytes.readInt()];
+ for (int i3 = 0; i3 < array[i2].length; i3++) {
+ array[i2][i3] = bytes.readInt();
+ }
+ }
+
+ data[i] = array;
+ } else if (classes[i] == Boolean.class) {
+ data[i] = bytes.readBoolean();
+ } else if (classes[i] == String.class) {
+ int length = bytes.readInt();
+ try {
+ byte[] stringBytes = new byte[length];
+ bytes.readBytes(stringBytes);
+ data[i] = new String(stringBytes, "UTF-8");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ } else if (classes[i] == Byte.class) {
+ data[i] = bytes.readByte();
+ } else if (classes[i] == Float.class) {
+ data[i] = bytes.readDouble();
+ } else if (classes[i] == Double.class) {
+ data[i] = bytes.readFloat();
+ } else if (classes[i] == Character.class) {
+ data[i] = bytes.readChar();
+ }
+ }
+ }
+ }
+
+ @Override
+ public void writeBytes(ByteBuf bytes) {
+ bytes.writeByte(type);
+
+ if (data != null) {
+ for (int i = 0; i < data.length; i++) {
+ if (data[i] instanceof Integer) {
+ bytes.writeInt((Integer) data[i]);
+ } else if (data[i] instanceof int[]) {
+ bytes.writeInt(((int[]) data[i]).length);
+ for (int i2 = 0; i2 < ((int[]) data[i]).length; i2++) {
+ bytes.writeInt(((int[]) data[i])[i2]);
+ }
+ } else if (data[i] instanceof int[][]) {
+ int[][] values = (int[][]) data[i];
+
+ bytes.writeInt(values.length);
+
+ for (int i2 = 0; i2 < values.length; i2++) {
+ bytes.writeInt(values[i2].length);
+ for (int i3 = 0; i3 < values[i2].length; i3++) {
+ bytes.writeInt(values[i2][i3]);
+ }
+ }
+ } else if (data[i] instanceof Boolean) {
+ bytes.writeBoolean((Boolean) data[i]);
+ } else if (data[i] instanceof String) {
+ byte[] stringBytes = ((String) data[i]).getBytes(Charset.forName("UTF-8"));
+ bytes.writeInt(stringBytes.length);
+ bytes.writeBytes(stringBytes);
+ } else if (data[i] instanceof Byte) {
+ bytes.writeByte((Byte) data[i]);
+ } else if (data[i] instanceof Float) {
+ bytes.writeDouble((Double) data[i]);
+ } else if (data[i] instanceof Double) {
+ bytes.writeFloat((Float) data[i]);
+ } else if (data[i] instanceof Character) {
+ bytes.writeChar((Character) data[i]);
+ }
+ }
+ }
+ }
+
+ @Override
+ public void executeClient(EntityPlayer player) {
+ if (NewPacketHandler.packetTypes[type] != this) {
+ NewPacketHandler.packetTypes[type].executeClient(player);
+ }
+ }
+
+ @Override
+ public void executeServer(EntityPlayer player) {
+ if (NewPacketHandler.packetTypes[type] != this) {
+ NewPacketHandler.packetTypes[type].executeServer(player);
+ }
+ }
+
+ @Override
+ public void executeBoth(EntityPlayer player) {
+ if (NewPacketHandler.packetTypes[type] != this) {
+ NewPacketHandler.packetTypes[type].executeBoth(player);
+ }
+ }
+
+ public Class<?>[] getExpectedClasses() {
+ if (NewPacketHandler.packetTypes[type] != this) {
+ return NewPacketHandler.packetTypes[type].getExpectedClasses();
+ } else {
+ return null;
+ }
+ }
+
+ public void sendToPlayer(EntityPlayer player, Object... data) {
+ NewPacketHandler.sendPacketToPlayer(new BasicPacket(this, data), player);
+ }
+
+ public void sendToAllPlayers(Object... data) {
+ NewPacketHandler.sendPacketToAllPlayers(new BasicPacket(this, data));
+ }
+
+ public void sendToServer(Object... data) {
+ NewPacketHandler.sendPacketToServer(new BasicPacket(this, data));
+ }
+}