From ce6cac38a6d5f5e23f1332bdfdd2cd0110e7c2b5 Mon Sep 17 00:00:00 2001 From: Waverunner Date: Sun, 5 Jul 2015 09:04:56 -0400 Subject: [PATCH] Refactored Encodable interface to include decode(ByteBuffer) method --- src/network/packets/Packet.java | 65 +++++++++++++++++-- src/network/packets/swg/SWGPacket.java | 18 +---- .../login/creation/ClientCreateCharacter.java | 8 +-- .../packets/swg/zone/baselines/CREO3.java | 2 +- .../swg/zone/chat/ChatOnDestroyRoom.java | 13 ++-- .../swg/zone/chat/ChatOnEnteredRoom.java | 19 +++--- .../swg/zone/chat/ChatOnLeaveRoom.java | 15 ++--- .../chat/ChatPersistentMessageToServer.java | 19 +++--- .../zone/chat/ChatRemoveAvatarFromRoom.java | 7 +- .../swg/zone/chat/ChatRoomMessage.java | 12 ++-- .../packets/swg/zone/chat/ChatSendToRoom.java | 8 +-- .../swg/zone/insertion/ChatRoomList.java | 17 ++--- src/resources/chat/ChatAvatar.java | 17 +++-- src/resources/chat/ChatRoom.java | 48 +++++++------- src/resources/collections/SWGBitSet.java | 19 ++++-- src/resources/collections/SWGList.java | 51 +++++++++++++-- src/resources/collections/SWGMap.java | 38 ++++++++--- src/resources/encodables/Encodable.java | 38 +++++++++++ src/resources/encodables/OutOfBandData.java | 7 +- .../encodables/OutOfBandPackage.java | 34 +++++----- src/resources/encodables/ProsePackage.java | 45 ++++++++----- src/resources/encodables/StringId.java | 14 ++-- .../encodables/player/Equipment.java | 40 ++++++++---- src/resources/encodables/player/Mail.java | 23 +++++-- src/resources/network/BaselineBuilder.java | 22 ++----- .../objects/waypoint/WaypointObject.java | 10 ++- .../objects/weapon/WeaponObject.java | 14 +++- src/services/map/MapLocation.java | 37 +++++++---- src/utilities/Encoder.java | 4 +- 29 files changed, 417 insertions(+), 247 deletions(-) create mode 100644 src/resources/encodables/Encodable.java diff --git a/src/network/packets/Packet.java b/src/network/packets/Packet.java index e6bda3a4a..231ee4661 100644 --- a/src/network/packets/Packet.java +++ b/src/network/packets/Packet.java @@ -28,12 +28,14 @@ package network.packets; import resources.common.CRC; -import resources.network.BaselineBuilder; +import resources.encodables.Encodable; import java.net.InetAddress; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; @@ -77,9 +79,9 @@ public class Packet { return opcode; } - public static void addList(ByteBuffer bb, List list) { + public static void addList(ByteBuffer bb, Collection list) { addInt(bb, list.size()); - for (BaselineBuilder.Encodable encodable : list) { + for (Encodable encodable : list) { addData(bb, encodable.encode()); } } @@ -90,7 +92,7 @@ public class Packet { public static void addAscii(ByteBuffer bb, String s) { bb.order(ByteOrder.LITTLE_ENDIAN); - bb.putShort((short)s.length()); + bb.putShort((short) s.length()); bb.put(s.getBytes(ascii)); } @@ -136,11 +138,19 @@ public class Packet { bb.put(data); } - public static void addArray(ByteBuffer bb, byte [] b) { + public static void addArray(ByteBuffer bb, byte[] b) { + bb.put(b); + } + + public static void addArrayList(ByteBuffer bb, byte[] b) { addShort(bb, b.length); bb.put(b); } + public static void addEncodable(ByteBuffer data, Encodable encodable) { + data.put(encodable.encode()); + } + public static void addCrc(ByteBuffer bb, String crcString) { addInt(bb, CRC.getCrc(crcString)); } @@ -212,7 +222,50 @@ public class Packet { bb.get(data); return data; } - + + /** + * Decodes the ByteBuffer stream into the passed List using the given listType instance for creating elements + * for the list from the buffer. + * @param bb ByteBuffer + * @param type Top-most class for the elements that are to be added to the list + * @param Class type that implements {@link Encodable} + * @return Amount of bytes that are read + */ + public static List getList(ByteBuffer bb, Class type) { + List list = new ArrayList<>(); + + int size = getInt(bb); + + if (size <= 0) + return null; + + try { + for (int i = 0; i < size; i++) { + T instance = type.newInstance(); + instance.decode(bb); + list.add(instance); + } + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + + if (size != list.size()) + System.err.println("Expected list size " + size + " but only have " + list.size() + " elements in the list"); + return list; + } + + public static T getEncodable(ByteBuffer bb, Class type) { + T instance = null; + try { + instance = type.newInstance(); + instance.decode(bb); + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + + return instance; + } + public void decode(ByteBuffer data) { data.position(0); this.data = data; diff --git a/src/network/packets/swg/SWGPacket.java b/src/network/packets/swg/SWGPacket.java index c6cf18d5e..ae3e392cf 100644 --- a/src/network/packets/swg/SWGPacket.java +++ b/src/network/packets/swg/SWGPacket.java @@ -27,13 +27,11 @@ ***********************************************************************************/ package network.packets.swg; -import java.nio.ByteBuffer; - -import resources.Location; import network.PacketType; import network.packets.Packet; -import resources.encodables.OutOfBandPackage; -import resources.network.BaselineBuilder; +import resources.Location; + +import java.nio.ByteBuffer; public class SWGPacket extends Packet { @@ -101,14 +99,4 @@ public class SWGPacket extends Packet { public ByteBuffer getData() { return data; } - - public static OutOfBandPackage getOutOfBand(ByteBuffer data) { - OutOfBandPackage outOfBandPackage = new OutOfBandPackage(); - outOfBandPackage.decode(data); - return outOfBandPackage; - } - - public static void addEncodable(ByteBuffer data, BaselineBuilder.Encodable encodable) { - data.put(encodable.encode()); - } } diff --git a/src/network/packets/swg/login/creation/ClientCreateCharacter.java b/src/network/packets/swg/login/creation/ClientCreateCharacter.java index a96357eb4..420ecea2a 100644 --- a/src/network/packets/swg/login/creation/ClientCreateCharacter.java +++ b/src/network/packets/swg/login/creation/ClientCreateCharacter.java @@ -27,10 +27,10 @@ ***********************************************************************************/ package network.packets.swg.login.creation; -import java.nio.ByteBuffer; - import network.packets.swg.SWGPacket; +import java.nio.ByteBuffer; + public class ClientCreateCharacter extends SWGPacket { @@ -81,12 +81,12 @@ public class ClientCreateCharacter extends SWGPacket { ByteBuffer data = ByteBuffer.allocate(36+extraSize); addShort (data, 2); addInt (data, CRC); - addArray (data, charCustomization); + addArrayList(data, charCustomization); addUnicode(data, name); addAscii (data, race); addAscii (data, start); addAscii (data, hair); - addArray (data, hairCustomization); + addArrayList(data, hairCustomization); addAscii (data, clothes); addBoolean(data, jedi); addFloat (data, height); diff --git a/src/network/packets/swg/zone/baselines/CREO3.java b/src/network/packets/swg/zone/baselines/CREO3.java index 574451af7..c21e19d20 100644 --- a/src/network/packets/swg/zone/baselines/CREO3.java +++ b/src/network/packets/swg/zone/baselines/CREO3.java @@ -86,7 +86,7 @@ public class CREO3 extends Baseline { addUnicode(data, cName); // Custom Name addInt( data, 0x000F4240); // Unknown addLong( data, 0); // Unknown - addArray( data, customization); // Object Customization Data + addArrayList(data, customization); // Object Customization Data addInt( data, 1); // Unknown addInt( data, 0); // Unknown addInt( data, 0); // Unknown diff --git a/src/network/packets/swg/zone/chat/ChatOnDestroyRoom.java b/src/network/packets/swg/zone/chat/ChatOnDestroyRoom.java index 4b99fc002..abd9128f5 100644 --- a/src/network/packets/swg/zone/chat/ChatOnDestroyRoom.java +++ b/src/network/packets/swg/zone/chat/ChatOnDestroyRoom.java @@ -27,11 +27,11 @@ ***********************************************************************************/ package network.packets.swg.zone.chat; -import java.nio.ByteBuffer; - import network.packets.swg.SWGPacket; import resources.chat.ChatAvatar; +import java.nio.ByteBuffer; + public class ChatOnDestroyRoom extends SWGPacket { public static final int CRC = 0xE8EC5877; @@ -55,11 +55,10 @@ public class ChatOnDestroyRoom extends SWGPacket { public void decode(ByteBuffer data) { if (!super.decode(data, CRC)) return; - owner = new ChatAvatar(); - owner.decode(data); - result = getInt(data); - roomId = getInt(data); - sequence = getInt(data); + owner = getEncodable(data, ChatAvatar.class); + result = getInt(data); + roomId = getInt(data); + sequence = getInt(data); } public ByteBuffer encode() { diff --git a/src/network/packets/swg/zone/chat/ChatOnEnteredRoom.java b/src/network/packets/swg/zone/chat/ChatOnEnteredRoom.java index 0fe731ca9..1ce54edde 100644 --- a/src/network/packets/swg/zone/chat/ChatOnEnteredRoom.java +++ b/src/network/packets/swg/zone/chat/ChatOnEnteredRoom.java @@ -27,11 +27,10 @@ ***********************************************************************************/ package network.packets.swg.zone.chat; -import java.nio.ByteBuffer; - import network.packets.swg.SWGPacket; import resources.chat.ChatAvatar; -import resources.chat.ChatResult; + +import java.nio.ByteBuffer; public class ChatOnEnteredRoom extends SWGPacket { @@ -62,19 +61,17 @@ public class ChatOnEnteredRoom extends SWGPacket { public void decode(ByteBuffer data) { if (!super.decode(data, CRC)) return; - avatar = new ChatAvatar(); - avatar.decode(data); - result = getInt(data); - chatRoomId = getInt(data); - sequence = getInt(data); + avatar = getEncodable(data, ChatAvatar.class); + result = getInt(data); + chatRoomId = getInt(data); + sequence = getInt(data); } public ByteBuffer encode() { - byte[] avatarData = avatar.encode(); - ByteBuffer data = ByteBuffer.allocate(avatarData.length + 18); + ByteBuffer data = ByteBuffer.allocate(avatar.getSize() + 18); addShort(data, 5); addInt (data, CRC); - data.put(avatarData); + addEncodable(data, avatar); addInt(data, result); addInt (data, chatRoomId); addInt (data, sequence); diff --git a/src/network/packets/swg/zone/chat/ChatOnLeaveRoom.java b/src/network/packets/swg/zone/chat/ChatOnLeaveRoom.java index c495a17a5..d7146d3fb 100644 --- a/src/network/packets/swg/zone/chat/ChatOnLeaveRoom.java +++ b/src/network/packets/swg/zone/chat/ChatOnLeaveRoom.java @@ -27,11 +27,11 @@ ***********************************************************************************/ package network.packets.swg.zone.chat; -import java.nio.ByteBuffer; - import network.packets.swg.SWGPacket; import resources.chat.ChatAvatar; +import java.nio.ByteBuffer; + public class ChatOnLeaveRoom extends SWGPacket { public static final int CRC = resources.common.CRC.getCrc("ChatOnLeaveRoom"); @@ -54,15 +54,14 @@ public class ChatOnLeaveRoom extends SWGPacket { public void decode(ByteBuffer data) { if (!super.decode(data, CRC)) return; - avatar = new ChatAvatar(); - avatar.decode(data); - result = getInt(data); - chatRoomId = getInt(data); - sequence = getInt(data); + avatar = getEncodable(data, ChatAvatar.class); + result = getInt(data); + chatRoomId = getInt(data); + sequence = getInt(data); } public ByteBuffer encode() { - ByteBuffer data = ByteBuffer.allocate(18 + avatar.encode().length); + ByteBuffer data = ByteBuffer.allocate(18 + avatar.getSize()); addShort(data, 5); addInt( data, CRC); addEncodable(data, avatar); diff --git a/src/network/packets/swg/zone/chat/ChatPersistentMessageToServer.java b/src/network/packets/swg/zone/chat/ChatPersistentMessageToServer.java index c5287e046..a7ed8911e 100644 --- a/src/network/packets/swg/zone/chat/ChatPersistentMessageToServer.java +++ b/src/network/packets/swg/zone/chat/ChatPersistentMessageToServer.java @@ -27,12 +27,11 @@ ***********************************************************************************/ package network.packets.swg.zone.chat; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - import network.packets.swg.SWGPacket; import resources.encodables.OutOfBandPackage; +import java.nio.ByteBuffer; + public class ChatPersistentMessageToServer extends SWGPacket { public static final int CRC = 0x25A29FA6; @@ -55,13 +54,13 @@ public class ChatPersistentMessageToServer extends SWGPacket { public void decode(ByteBuffer data) { if (!super.decode(data, CRC)) return; - message = getUnicode(data); - outOfBandPackage.decode(data); - counter = getInt(data); - subject = getUnicode(data); + message = getUnicode(data); + outOfBandPackage = getEncodable(data, OutOfBandPackage.class); + counter = getInt(data); + subject = getUnicode(data); getAscii(data); // "SWG" - galaxy = getAscii(data); - recipient = getAscii(data); + galaxy = getAscii(data); + recipient = getAscii(data); } @Override @@ -70,7 +69,7 @@ public class ChatPersistentMessageToServer extends SWGPacket { int dataLength = 31 + message.length()*2+oob.length+subject.length()*2+galaxy.length()+recipient.length(); ByteBuffer data = ByteBuffer.allocate(dataLength); addUnicode(data, message); - data.put(oob); + addArray(data, oob); addInt(data, counter); addUnicode(data, subject); addAscii(data, "SWG"); diff --git a/src/network/packets/swg/zone/chat/ChatRemoveAvatarFromRoom.java b/src/network/packets/swg/zone/chat/ChatRemoveAvatarFromRoom.java index 05e06727d..f9e46c094 100644 --- a/src/network/packets/swg/zone/chat/ChatRemoveAvatarFromRoom.java +++ b/src/network/packets/swg/zone/chat/ChatRemoveAvatarFromRoom.java @@ -46,14 +46,13 @@ public class ChatRemoveAvatarFromRoom extends SWGPacket { if (!super.decode(data, CRC)) return; - avatar = new ChatAvatar(); - avatar.decode(data); - path = getAscii(data); + avatar = getEncodable(data, ChatAvatar.class); + path = getAscii(data); } @Override public ByteBuffer encode() { - ByteBuffer bb = ByteBuffer.allocate(6 + path.length() + avatar.encode().length); + ByteBuffer bb = ByteBuffer.allocate(6 + path.length() + avatar.getSize()); addShort(bb, 3); addInt(bb, CRC); addEncodable(bb, avatar); diff --git a/src/network/packets/swg/zone/chat/ChatRoomMessage.java b/src/network/packets/swg/zone/chat/ChatRoomMessage.java index 2bf864fd1..e563ef2cc 100644 --- a/src/network/packets/swg/zone/chat/ChatRoomMessage.java +++ b/src/network/packets/swg/zone/chat/ChatRoomMessage.java @@ -27,12 +27,12 @@ ***********************************************************************************/ package network.packets.swg.zone.chat; -import java.nio.ByteBuffer; - import network.packets.swg.SWGPacket; import resources.chat.ChatAvatar; import resources.encodables.OutOfBandPackage; +import java.nio.ByteBuffer; + public class ChatRoomMessage extends SWGPacket { public static final int CRC = resources.common.CRC.getCrc("ChatRoomMessage"); @@ -51,10 +51,10 @@ public class ChatRoomMessage extends SWGPacket { public void decode(ByteBuffer data) { if (!super.decode(data, CRC)) return; - avatar.decode(data); - roomId = getInt(data); - message = getUnicode(data); - outOfBandPackage.decode(data); + avatar = getEncodable(data, ChatAvatar.class); + roomId = getInt(data); + message = getUnicode(data); + outOfBandPackage = getEncodable(data, OutOfBandPackage.class); } public ByteBuffer encode() { diff --git a/src/network/packets/swg/zone/chat/ChatSendToRoom.java b/src/network/packets/swg/zone/chat/ChatSendToRoom.java index ed691d500..f4d1dace6 100644 --- a/src/network/packets/swg/zone/chat/ChatSendToRoom.java +++ b/src/network/packets/swg/zone/chat/ChatSendToRoom.java @@ -48,10 +48,10 @@ public class ChatSendToRoom extends SWGPacket { if (!super.decode(data, CRC)) return; - message = getUnicode(data); - outOfBandPackage = getOutOfBand(data); - roomId = getInt(data); - sequence = getInt(data); + message = getUnicode(data); + outOfBandPackage = getEncodable(data, OutOfBandPackage.class); + roomId = getInt(data); + sequence = getInt(data); } @Override diff --git a/src/network/packets/swg/zone/insertion/ChatRoomList.java b/src/network/packets/swg/zone/insertion/ChatRoomList.java index 2aa2caa4e..975727c0b 100644 --- a/src/network/packets/swg/zone/insertion/ChatRoomList.java +++ b/src/network/packets/swg/zone/insertion/ChatRoomList.java @@ -27,13 +27,13 @@ ***********************************************************************************/ package network.packets.swg.zone.insertion; +import network.packets.swg.SWGPacket; +import resources.chat.ChatRoom; + import java.nio.ByteBuffer; import java.util.Arrays; import java.util.Collection; -import network.packets.swg.SWGPacket; -import resources.chat.ChatRoom; - public class ChatRoomList extends SWGPacket { public static final int CRC = resources.common.CRC.getCrc("ChatRoomList"); @@ -50,11 +50,7 @@ public class ChatRoomList extends SWGPacket { public void decode(ByteBuffer data) { if (!super.decode(data, CRC)) return; - int chatroomCount = getInt(data); - for (int i = 0; i < chatroomCount; i++) { - ChatRoom room = new ChatRoom(); - room.decode(data); - } + rooms = getList(data, ChatRoom.class); } public ByteBuffer encode() { @@ -65,10 +61,7 @@ public class ChatRoomList extends SWGPacket { ByteBuffer data = ByteBuffer.allocate(length); addShort(data, 2); addInt( data, CRC); - addInt(data, rooms.size()); - for (ChatRoom room : rooms) { - data.put(room.encode()); - } + addList(data, rooms); return data; } } diff --git a/src/resources/chat/ChatAvatar.java b/src/resources/chat/ChatAvatar.java index 07113eab9..862f56377 100644 --- a/src/resources/chat/ChatAvatar.java +++ b/src/resources/chat/ChatAvatar.java @@ -28,16 +28,18 @@ package resources.chat; import network.packets.Packet; -import resources.network.BaselineBuilder; -import resources.objects.creature.CreatureObject; +import resources.encodables.Encodable; import resources.player.Player; +import java.io.Serializable; import java.nio.ByteBuffer; /** * @author Waverunner */ -public class ChatAvatar implements BaselineBuilder.Encodable, BaselineBuilder.Decodable { +public class ChatAvatar implements Encodable, Serializable { + private static final long serialVersionUID = 1L; + private long networkId; private String name; private String game = "SWG"; @@ -115,14 +117,15 @@ public class ChatAvatar implements BaselineBuilder.Encodable, BaselineBuilder.De @Override public void decode(ByteBuffer data) { - game = Packet.getAscii(data); - galaxy = Packet.getAscii(data); - name = Packet.getAscii(data); + game = Packet.getAscii(data); + galaxy = Packet.getAscii(data); + name = Packet.getAscii(data); } @Override public String toString() { - return "ChatAvatar:" + getNetworkId() + "[" + getGame() + "." + getGalaxy() + "." + getName() + "]"; + return "ChatAvatar[networkId=" + networkId + + ", name='" + name + '\'' + ", game='" + game + '\'' + ", galaxy='" + galaxy + "']"; } @Override diff --git a/src/resources/chat/ChatRoom.java b/src/resources/chat/ChatRoom.java index abc545727..33d94bcb8 100644 --- a/src/resources/chat/ChatRoom.java +++ b/src/resources/chat/ChatRoom.java @@ -30,21 +30,20 @@ package resources.chat; import network.packets.Packet; import network.packets.swg.SWGPacket; import network.packets.swg.zone.chat.ChatRoomMessage; +import resources.encodables.Encodable; import resources.encodables.OutOfBandPackage; -import resources.network.BaselineBuilder; import resources.player.Player; import services.player.PlayerManager; import java.io.Serializable; import java.nio.ByteBuffer; -import java.nio.ByteOrder; import java.util.ArrayList; import java.util.List; /** * @author Waverunner */ -public class ChatRoom implements Serializable, BaselineBuilder.Encodable, BaselineBuilder.Decodable { +public class ChatRoom implements Encodable, Serializable { private static final long serialVersionUID = 1L; private int id; @@ -67,6 +66,8 @@ public class ChatRoom implements Serializable, BaselineBuilder.Encodable, Baseli private transient byte[] data; public ChatRoom() { + owner = new ChatAvatar(); + creator = new ChatAvatar(); moderators = new ArrayList<>(); invited = new ArrayList<>(); members = new ArrayList<>(); @@ -192,7 +193,17 @@ public class ChatRoom implements Serializable, BaselineBuilder.Encodable, Baseli } @Override - public void decode(ByteBuffer data) {} + public void decode(ByteBuffer data) { + id = Packet.getInt(data); + type = Packet.getInt(data); + muted = Packet.getBoolean(data); + path = Packet.getAscii(data); + owner = Packet.getEncodable(data, ChatAvatar.class); + creator = Packet.getEncodable(data, ChatAvatar.class); + title = Packet.getUnicode(data); + moderators = Packet.getList(data, ChatAvatar.class); + invited = Packet.getList(data, ChatAvatar.class); + } @Override public byte[] encode() { @@ -209,22 +220,16 @@ public class ChatRoom implements Serializable, BaselineBuilder.Encodable, Baseli } avatarIdSize += owner.encode().length + creator.encode().length; - ByteBuffer bb = ByteBuffer.allocate(23 + path.length() + (title.length() * 2) + avatarIdSize).order(ByteOrder.LITTLE_ENDIAN); - bb.putInt(id); - bb.putInt(type); - bb.put(muted ? (byte) 1 : (byte) 0); + ByteBuffer bb = ByteBuffer.allocate(23 + path.length() + (title.length() * 2) + avatarIdSize); + Packet.addInt(bb, id); + Packet.addInt(bb, type); + Packet.addBoolean(bb, muted); Packet.addAscii(bb, path); - bb.put(owner.encode()); - bb.put(creator.encode()); + Packet.addEncodable(bb, owner); + Packet.addEncodable(bb, creator); Packet.addUnicode(bb, title); - bb.putInt(moderators.size()); - for (ChatAvatar moderator : moderators) { - bb.put(moderator.encode()); - } - bb.putInt(invited.size()); - for (ChatAvatar invitee : invited) { - bb.put(invitee.encode()); - } + Packet.addList(bb, moderators); + Packet.addList(bb, invited); data = bb.array(); modified = false; @@ -234,10 +239,7 @@ public class ChatRoom implements Serializable, BaselineBuilder.Encodable, Baseli @Override public String toString() { - return "ChatRoom{" + - "id=" + id + - ", path='" + path + '\'' + - ", title='" + title + '\'' + - '}'; + return "ChatRoom[id=" + id + ", type=" + type + ", path='" + path + "', title='" + title + '\'' + + ", owner=" + owner + ", isPublic=" + isPublic + "]"; } } diff --git a/src/resources/collections/SWGBitSet.java b/src/resources/collections/SWGBitSet.java index cec9109fe..779b4fd7a 100644 --- a/src/resources/collections/SWGBitSet.java +++ b/src/resources/collections/SWGBitSet.java @@ -28,11 +28,13 @@ package resources.collections; import network.packets.swg.zone.baselines.Baseline; -import resources.network.BaselineBuilder; +import resources.encodables.Encodable; import resources.network.DeltaBuilder; import resources.objects.SWGObject; import resources.player.PlayerState; +import sun.reflect.generics.reflectiveObjects.NotImplementedException; +import java.io.Serializable; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.BitSet; @@ -41,15 +43,13 @@ import java.util.BitSet; /** * @author Waverunner */ -public class SWGBitSet extends BitSet implements BaselineBuilder.Encodable { - +public class SWGBitSet extends BitSet implements Encodable, Serializable { private static final long serialVersionUID = 200L; private final Baseline.BaselineType baseline; private int view; private int updateType; - /** * Creates a new {@link SWGBitSet} for the defined baseline with the given view and update. * Note that this is an extension of {@link BitSet} @@ -70,13 +70,19 @@ public class SWGBitSet extends BitSet implements BaselineBuilder.Encodable { ByteBuffer buffer = ByteBuffer.allocate(4 + (list.length * 4)).order(ByteOrder.LITTLE_ENDIAN); buffer.putInt(list.length); - for (int i = 0; i < list.length; i++) { - buffer.putInt(list[i]); + for (int bits : list) { + buffer.putInt(bits); } return buffer.array(); } + @Override + public void decode(ByteBuffer data) { + // TODO: Decode method for SWGBitSet + throw new NotImplementedException(); + } + public void sendDeltaMessage(SWGObject target) { if (target.getOwner() == null || target.getOwner().getPlayerState() != PlayerState.ZONED_IN) { return; @@ -87,6 +93,7 @@ public class SWGBitSet extends BitSet implements BaselineBuilder.Encodable { } public int[] toList() { + // TODO: This is working somehow, but position is wrong... int[] integers = new int[4]; int count = 0; int position = 0; // Position within the bit set diff --git a/src/resources/collections/SWGList.java b/src/resources/collections/SWGList.java index e66fee37f..942b97212 100644 --- a/src/resources/collections/SWGList.java +++ b/src/resources/collections/SWGList.java @@ -27,17 +27,22 @@ ***********************************************************************************/ package resources.collections; +import network.packets.Packet; import network.packets.swg.zone.baselines.Baseline.BaselineType; -import resources.network.BaselineBuilder.Encodable; +import resources.encodables.Encodable; import resources.network.DeltaBuilder; import resources.objects.SWGObject; import resources.player.PlayerState; import utilities.Encoder; import utilities.Encoder.StringType; +import java.io.Serializable; import java.nio.ByteBuffer; import java.nio.ByteOrder; -import java.util.*; +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; /** * Supports a list of elements which automatically sends data as a delta when changed for baselines. @@ -45,7 +50,7 @@ import java.util.*; * * @param Element that implements {@link Encodable} in order for data to be sent, or a basic type. */ -public class SWGList extends AbstractList implements Encodable { +public class SWGList extends AbstractList implements Encodable, Serializable { private static final long serialVersionUID = 1L; private BaselineType baseline; @@ -210,13 +215,45 @@ public class SWGList extends AbstractList implements Encodable { buffer.putInt(size); buffer.putInt(updateCount); - for (byte[] bytes : data) { - buffer.put(bytes); - } + data.forEach(buffer::put); return buffer.array(); } - + + @Override + public void decode(ByteBuffer data) { +/* Not sure how to do decoding for an SWGList because of generics, won't know what specific type to decode as + One possible workaround is to refactor decode to create new object instead of directly initializing the variables + During compile time, a List is just a List due to type erasure. + */ + try { + throw new Exception("This is not a supported operation. Use decode(ByteBuffer data, Class elementType) instead"); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void decode(ByteBuffer data, Class elementType) { + // TODO: Decode other instance types besides encodable for SWGList + int size = Packet.getInt(data); + updateCount = Packet.getInt(data); + + try { + for (int i = 0; i < size; i++) { + E instance = elementType.newInstance(); + if (instance instanceof Encodable) + ((Encodable) instance).decode(data); + else { + System.out.println("No decode support for the type " + elementType.getName()); + break; + } + list.add(instance); + } + } catch (InstantiationException | IllegalAccessException e) { + e.printStackTrace(); + } + } + public void sendDeltaMessage(SWGObject target) { if (deltas.size() == 0) return; diff --git a/src/resources/collections/SWGMap.java b/src/resources/collections/SWGMap.java index 698b48106..1c9275075 100644 --- a/src/resources/collections/SWGMap.java +++ b/src/resources/collections/SWGMap.java @@ -27,6 +27,15 @@ ***********************************************************************************/ package resources.collections; +import network.packets.swg.zone.baselines.Baseline.BaselineType; +import resources.encodables.Encodable; +import resources.network.DeltaBuilder; +import resources.objects.SWGObject; +import resources.player.PlayerState; +import utilities.Encoder; +import utilities.Encoder.StringType; + +import java.io.Serializable; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.AbstractMap; @@ -35,15 +44,7 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import network.packets.swg.zone.baselines.Baseline.BaselineType; -import resources.network.DeltaBuilder; -import resources.network.BaselineBuilder.Encodable; -import resources.objects.SWGObject; -import resources.player.PlayerState; -import utilities.Encoder; -import utilities.Encoder.StringType; - -public class SWGMap extends AbstractMap implements Encodable { +public class SWGMap extends AbstractMap implements Encodable, Serializable { private static final long serialVersionUID = 1L; private BaselineType baseline; @@ -177,7 +178,24 @@ public class SWGMap extends AbstractMap implements Encodable { return buffer.array(); } - + + @Override + public void decode(ByteBuffer data) { + + //throw new NotImplementedException(); +/* Not sure how to do decoding for an SWGMap because of generics, won't know what specific type to decode as + One possible workaround is to refactor decode to create new object instead of directly initializing the variables + + int size = Packet.getInt(data); + updateCount = Packet.getInt(data); + + for (int i = 0; i < size; i++) { + + } + + return 0;*/ + } + public void sendDeltaMessage(SWGObject target) { if (!(deltas.size() > 0)) return; diff --git a/src/resources/encodables/Encodable.java b/src/resources/encodables/Encodable.java new file mode 100644 index 000000000..9a497a6ed --- /dev/null +++ b/src/resources/encodables/Encodable.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * Copyright (c) 2015 /// Project SWG /// www.projectswg.com + * + * ProjectSWG is the first NGE emulator for Star Wars Galaxies founded on + * July 7th, 2011 after SOE announced the official shutdown of Star Wars Galaxies. + * Our goal is to create an emulator which will provide a server for players to + * continue playing a game similar to the one they used to play. We are basing + * it on the final publish of the game prior to end-game events. + * + * This file is part of Holocore. + * + * -------------------------------------------------------------------------------- + * + * Holocore is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * Holocore 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with Holocore. If not, see + ******************************************************************************/ + +package resources.encodables; + +import java.nio.ByteBuffer; + +/** + * @author Waverunner + */ +public interface Encodable { + byte [] encode(); + void decode(ByteBuffer data); +} diff --git a/src/resources/encodables/OutOfBandData.java b/src/resources/encodables/OutOfBandData.java index 7ede67dc7..e43c43820 100644 --- a/src/resources/encodables/OutOfBandData.java +++ b/src/resources/encodables/OutOfBandData.java @@ -27,15 +27,10 @@ package resources.encodables; -import resources.network.BaselineBuilder; - -import java.nio.ByteBuffer; - /** * @author Waverunner */ -public interface OutOfBandData extends BaselineBuilder.Encodable{ - int decodeOutOfBandData(ByteBuffer data); // TODO: Remove with Encodable refactor +public interface OutOfBandData extends Encodable{ OutOfBandPackage.Type getOobType(); int getOobPosition(); } diff --git a/src/resources/encodables/OutOfBandPackage.java b/src/resources/encodables/OutOfBandPackage.java index 0b73ef130..406591783 100644 --- a/src/resources/encodables/OutOfBandPackage.java +++ b/src/resources/encodables/OutOfBandPackage.java @@ -27,17 +27,17 @@ ***********************************************************************************/ package resources.encodables; +import network.packets.Packet; +import resources.objects.waypoint.WaypointObject; + +import java.io.Serializable; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import network.packets.Packet; -import resources.network.BaselineBuilder.Encodable; -import resources.objects.waypoint.WaypointObject; - -public class OutOfBandPackage implements Encodable { +public class OutOfBandPackage implements Encodable, Serializable { private static final long serialVersionUID = 1L; private List packages; @@ -81,45 +81,45 @@ public class OutOfBandPackage implements Encodable { return bb.array(); } + @Override public void decode(ByteBuffer data) { int size = data.getInt() * 2; - for (int read = 0; read < size; read+= 3) { - int padding = data.getShort(); - read += unpackOutOfBandData(data, Type.valueOf(data.get())); + int padding; + int start; + for (int read = 0; read < size; read++) { + start = data.position(); + padding = data.getShort(); + unpackOutOfBandData(data, Type.valueOf(data.get())); data.position(data.position() + padding); - read += padding; + read += data.position() - start; } } - private int unpackOutOfBandData(ByteBuffer data, Type type) { + private void unpackOutOfBandData(ByteBuffer data, Type type) { // Position doesn't seem to be reflective of it's spot in the package list, not sure if this can be automated // as the client will send -3 for multiple waypoints in a mail, so could be static for each OutOfBandData // If that's the case, then we can move the position variable to the Type enum instead of a method return statement /* int position =*/ data.getInt(); - int read = 4; switch(type) { case PROSE_PACKAGE: - ProsePackage prose = new ProsePackage(); - read += prose.decodeOutOfBandData(data); + ProsePackage prose = Packet.getEncodable(data, ProsePackage.class); packages.add(prose); break; case WAYPOINT: WaypointObject waypoint = new WaypointObject(-1); - read += waypoint.decodeOutOfBandData(data); + waypoint.decode(data); packages.add(waypoint); break; case STRING_ID: - StringId stringId = new StringId(); - read += stringId.decodeOutOfBandData(data); + StringId stringId = Packet.getEncodable(data, StringId.class); packages.add(stringId); break; default: System.err.println("Tried to decode an unsupported OutOfBandData Type: " + type); break; } - return read; } private byte[] packOutOfBandData(OutOfBandData data) { diff --git a/src/resources/encodables/ProsePackage.java b/src/resources/encodables/ProsePackage.java index 8e7369366..3c319c1a6 100644 --- a/src/resources/encodables/ProsePackage.java +++ b/src/resources/encodables/ProsePackage.java @@ -27,14 +27,15 @@ ***********************************************************************************/ package resources.encodables; +import network.packets.Packet; + +import java.io.Serializable; import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.Charset; -import resources.network.BaselineBuilder.Encodable; - -public class ProsePackage implements OutOfBandData { +public class ProsePackage implements OutOfBandData, Serializable { private static final long serialVersionUID = 1L; private StringId base = new StringId("", ""); @@ -197,26 +198,27 @@ public class ProsePackage implements OutOfBandData { byte[] targetData = target.encode(); byte[] otherData = other.encode(); - ByteBuffer bb = ByteBuffer.allocate(16 + stringData.length + actorData.length + targetData.length + otherData.length).order(ByteOrder.LITTLE_ENDIAN); - bb.putShort((short) 0); // ?? - bb.put(OutOfBandPackage.Type.PROSE_PACKAGE.getType()); - bb.putInt(-1); // ?? - bb.put(stringData); - bb.put(actorData); - bb.put(targetData); - bb.put(otherData); + ByteBuffer bb = ByteBuffer.allocate(9 + stringData.length + actorData.length + targetData.length + otherData.length); + Packet.addArray(bb, stringData); + Packet.addArray(bb, actorData); + Packet.addArray(bb, targetData); + Packet.addArray(bb, otherData); + Packet.addInt(bb, di); + Packet.addFloat(bb, df); + Packet.addBoolean(bb, grammarFlag); - // Decimals - bb.putInt(di); - bb.putFloat(df); - - bb.put((byte) (grammarFlag ? 1 : 0)); // Grammar flag return bb.array(); } @Override - public int decodeOutOfBandData(ByteBuffer data) { - return 0; + public void decode(ByteBuffer data) { + base = Packet.getEncodable(data, StringId.class); + actor = Packet.getEncodable(data, Prose.class); + target = Packet.getEncodable(data, Prose.class); + other = Packet.getEncodable(data, Prose.class); + di = Packet.getInt(data); + df = Packet.getInt(data); + grammarFlag = Packet.getBoolean(data); } @Override @@ -276,6 +278,13 @@ public class ProsePackage implements OutOfBandData { return bb.array(); } + @Override + public void decode(ByteBuffer data) { + objectId = Packet.getLong(data); + stringId = Packet.getEncodable(data, StringId.class); + text = Packet.getUnicode(data); + } + @Override public String toString() { return "Prose[objectId=" + objectId + ", stringId=" + stringId + ", text='" + text + "']"; diff --git a/src/resources/encodables/StringId.java b/src/resources/encodables/StringId.java index 719bb9522..f03c4cf21 100644 --- a/src/resources/encodables/StringId.java +++ b/src/resources/encodables/StringId.java @@ -27,12 +27,12 @@ ***********************************************************************************/ package resources.encodables; +import network.packets.Packet; + +import java.io.Serializable; import java.nio.ByteBuffer; -import network.packets.Packet; -import resources.network.BaselineBuilder.Encodable; - -public class StringId implements Encodable, OutOfBandData { +public class StringId implements OutOfBandData, Serializable { private static final long serialVersionUID = 1L; private String key = ""; @@ -72,8 +72,10 @@ public class StringId implements Encodable, OutOfBandData { } @Override - public int decodeOutOfBandData(ByteBuffer data) { - return 0; + public void decode(ByteBuffer data) { + file = Packet.getAscii(data); + Packet.getInt(data); + key = Packet.getAscii(data); } @Override diff --git a/src/resources/encodables/player/Equipment.java b/src/resources/encodables/player/Equipment.java index 6fd7f17d6..3f741c801 100644 --- a/src/resources/encodables/player/Equipment.java +++ b/src/resources/encodables/player/Equipment.java @@ -27,15 +27,17 @@ ***********************************************************************************/ package resources.encodables.player; -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - +import network.packets.Packet; import resources.common.CRC; -import resources.network.BaselineBuilder.Encodable; +import resources.encodables.Encodable; import resources.objects.SWGObject; import resources.objects.weapon.WeaponObject; -public class Equipment implements Encodable { +import java.io.Serializable; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class Equipment implements Encodable, Serializable { private static final long serialVersionUID = 1L; private WeaponObject weapon; @@ -56,34 +58,46 @@ public class Equipment implements Encodable { @Override public byte[] encode() { + // TODO: This is not working for weapons (crashes w/ a weapon), needs to be refactored ByteBuffer buffer; - byte[] weaponData = null; + //byte[] weaponData = null; - if (weapon != null) { +/* if (weapon != null) { weaponData = weapon.encode(); buffer = ByteBuffer.allocate(19 + weaponData.length).order(ByteOrder.LITTLE_ENDIAN); - } else { + } else {*/ buffer = ByteBuffer.allocate(19).order(ByteOrder.LITTLE_ENDIAN); - } +/* }*/ - if (customizationString == null) buffer.putShort((short) 0); + if (customizationString == null) buffer.putShort((short) 0); // TODO: Create encodable class for customization string else buffer.put(customizationString); buffer.putInt(arrangementId); buffer.putLong(objectId); buffer.putInt(CRC.getCrc(template)); - if (weapon != null) { +/* if (weapon != null) { buffer.put((byte) 0x01); buffer.put(weaponData); - } else { + } else {*/ buffer.put((byte) 0x00); - } +/* }*/ return buffer.array(); } + @Override + public void decode(ByteBuffer data) { + customizationString = Packet.getArray(data); // TODO: Create encodable class for customization string + arrangementId = Packet.getInt(data); + objectId = Packet.getLong(data); +/* template =*/Packet.getInt(data); + + // TODO: Re-do when weapon encode for Equipment is fixed +/* boolean weapon =*/Packet.getBoolean(data); + } + public byte[] getCustomizationString() {return customizationString;} public void setCustomizationString(byte[] customizationString) { this.customizationString = customizationString; } diff --git a/src/resources/encodables/player/Mail.java b/src/resources/encodables/player/Mail.java index 4766fa67f..c682237e7 100644 --- a/src/resources/encodables/player/Mail.java +++ b/src/resources/encodables/player/Mail.java @@ -27,14 +27,16 @@ ***********************************************************************************/ package resources.encodables.player; +import network.packets.Packet; +import resources.encodables.Encodable; import resources.encodables.OutOfBandPackage; -import resources.network.BaselineBuilder.Encodable; import utilities.Encoder; +import java.io.Serializable; import java.nio.ByteBuffer; import java.nio.ByteOrder; -public class Mail implements Encodable { +public class Mail implements Encodable, Serializable { private static final long serialVersionUID = 1L; private int id; @@ -105,13 +107,22 @@ public class Mail implements Encodable { @Override public byte[] encode() { byte[] oob = outOfBandPackage.encode(); - ByteBuffer bb = ByteBuffer.allocate(8 + (message.length() * 2) + (subject.length() * 2) + oob.length).order(ByteOrder.LITTLE_ENDIAN); - bb.put(Encoder.encodeUnicode(message)); - bb.put(Encoder.encodeUnicode(subject)); - bb.put(oob); + + ByteBuffer bb = ByteBuffer.allocate(8 + (message.length() * 2) + (subject.length() * 2) + oob.length); + Packet.addUnicode(bb, message); + Packet.addUnicode(bb, subject); + Packet.addArray(bb, oob); + return bb.array(); } + @Override + public void decode(ByteBuffer data) { + message = Packet.getUnicode(data); + subject = Packet.getUnicode(data); + outOfBandPackage = Packet.getEncodable(data, OutOfBandPackage.class); + } + public byte[] encodeHeader() { ByteBuffer bb = ByteBuffer.allocate(12 + subject.length() * 2).order(ByteOrder.LITTLE_ENDIAN); bb.putInt(0); diff --git a/src/resources/network/BaselineBuilder.java b/src/resources/network/BaselineBuilder.java index 53fc48f98..441974ec9 100644 --- a/src/resources/network/BaselineBuilder.java +++ b/src/resources/network/BaselineBuilder.java @@ -27,17 +27,17 @@ ***********************************************************************************/ package resources.network; -import java.io.Serializable; +import network.packets.swg.zone.baselines.Baseline; +import network.packets.swg.zone.baselines.Baseline.BaselineType; +import resources.encodables.Encodable; +import resources.objects.SWGObject; +import resources.player.Player; + import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.Charset; import java.util.LinkedList; -import network.packets.swg.zone.baselines.Baseline; -import network.packets.swg.zone.baselines.Baseline.BaselineType; -import resources.objects.SWGObject; -import resources.player.Player; - public class BaselineBuilder { public static final Charset ASCII = Charset.forName("UTF-8"); @@ -161,14 +161,4 @@ public class BaselineBuilder { public int incrementOperandCount(int operands) { return opCount+=operands; } - - public interface Encodable extends Serializable { - byte [] encode(); - // TODO: int decode(ByteBuffer data); - } - - // TODO: move into Encodable - public interface Decodable { - void decode(ByteBuffer data); - } } diff --git a/src/resources/objects/waypoint/WaypointObject.java b/src/resources/objects/waypoint/WaypointObject.java index b42db8f67..ece1fc0d4 100644 --- a/src/resources/objects/waypoint/WaypointObject.java +++ b/src/resources/objects/waypoint/WaypointObject.java @@ -27,8 +27,6 @@ ***********************************************************************************/ package resources.objects.waypoint; -import java.nio.ByteBuffer; - import network.packets.Packet; import network.packets.swg.zone.baselines.Baseline.BaselineType; import resources.Location; @@ -38,6 +36,8 @@ import resources.encodables.OutOfBandPackage; import resources.objects.intangible.IntangibleObject; import resources.player.Player; +import java.nio.ByteBuffer; + public class WaypointObject extends IntangibleObject implements OutOfBandData { private static final long serialVersionUID = 1L; @@ -105,17 +105,15 @@ public class WaypointObject extends IntangibleObject implements OutOfBandData { } @Override - public int decodeOutOfBandData(ByteBuffer data) { + public void decode(ByteBuffer data) { data.getInt(); setLocation(data.getFloat(), data.getFloat(), data.getFloat()); - cellId = data.getLong(); + cellId = Packet.getLong(data); getLocation().setTerrain(Terrain.getTerrainFromCrc(data.getInt())); - System.out.println(getLocation()); name = Packet.getUnicode(data); Packet.getLong(data); // objectId color = WaypointColor.valueOf(data.get()); active = Packet.getBoolean(data); - return 42 + name.length() * 2; } @Override diff --git a/src/resources/objects/weapon/WeaponObject.java b/src/resources/objects/weapon/WeaponObject.java index c29691483..3f0692570 100644 --- a/src/resources/objects/weapon/WeaponObject.java +++ b/src/resources/objects/weapon/WeaponObject.java @@ -28,12 +28,14 @@ package resources.objects.weapon; import network.packets.swg.zone.baselines.Baseline.BaselineType; +import resources.encodables.Encodable; import resources.network.BaselineBuilder; -import resources.network.BaselineBuilder.Encodable; import resources.objects.tangible.TangibleObject; import resources.player.Player; -public class WeaponObject extends TangibleObject implements Encodable{ +import java.nio.ByteBuffer; + +public class WeaponObject extends TangibleObject implements Encodable { private static final long serialVersionUID = 1L; @@ -128,6 +130,7 @@ public class WeaponObject extends TangibleObject implements Encodable{ @Override public byte[] encode() { + // TODO: Refactor, causes crashes BaselineBuilder bb = new BaselineBuilder(this, BaselineType.WEAO, 3); createBaseline3(null, bb); byte[] data3 = bb.buildAsBaselinePacket(); @@ -142,5 +145,10 @@ public class WeaponObject extends TangibleObject implements Encodable{ return ret; } - + + @Override + public void decode(ByteBuffer data) { + // TODO: Implement decode method in WeaponObject + } + } diff --git a/src/services/map/MapLocation.java b/src/services/map/MapLocation.java index b0bb2ea73..6f9394f52 100644 --- a/src/services/map/MapLocation.java +++ b/src/services/map/MapLocation.java @@ -27,14 +27,13 @@ package services.map; -import resources.network.BaselineBuilder; -import utilities.Encoder; +import network.packets.Packet; +import resources.encodables.Encodable; +import java.io.Serializable; import java.nio.ByteBuffer; -import java.nio.ByteOrder; -public class MapLocation implements BaselineBuilder.Encodable{ - +public class MapLocation implements Encodable, Serializable { private static final long serialVersionUID = 1L; private long id; @@ -121,18 +120,30 @@ public class MapLocation implements BaselineBuilder.Encodable{ if (data != null) return data; - ByteBuffer bb = ByteBuffer.allocate((name.length() * 2) + 23).order(ByteOrder.LITTLE_ENDIAN); - bb.putLong(id); - bb.put(Encoder.encodeUnicode(name)); - bb.putFloat(x); - bb.putFloat(y); - bb.put(category); - bb.put(subcategory); - bb.put((byte) (isActive ? 1 : 0)); + ByteBuffer bb = ByteBuffer.allocate((name.length() * 2) + 23); + Packet.addLong(bb, id); + Packet.addUnicode(bb, name); + Packet.addFloat(bb, x); + Packet.addFloat(bb, y); + Packet.addByte(bb, category); + Packet.addByte(bb, subcategory); + Packet.addBoolean(bb, isActive); + data = bb.array(); return data; } + @Override + public void decode(ByteBuffer data) { + id = Packet.getLong(data); + name = Packet.getUnicode(data); + x = Packet.getFloat(data); + y = Packet.getFloat(data); + category = Packet.getByte(data); + subcategory = Packet.getByte(data); + isActive = Packet.getBoolean(data); + } + @Override public String toString() { return name + " x: " + x + "y: " + y; diff --git a/src/utilities/Encoder.java b/src/utilities/Encoder.java index 83c3fcce1..d273624b1 100644 --- a/src/utilities/Encoder.java +++ b/src/utilities/Encoder.java @@ -27,12 +27,12 @@ ***********************************************************************************/ package utilities; +import resources.encodables.Encodable; + import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.Charset; -import resources.network.BaselineBuilder.Encodable; - public class Encoder { public static byte[] encode(Object object) {