From 1c2dbfd6a37db7be42f324d73b215918edf087fd Mon Sep 17 00:00:00 2001 From: Waverunner Date: Fri, 24 Jul 2015 18:07:58 -0400 Subject: [PATCH] Made Point3D, Quaternion, and Location classes Encodables removing the need for getLocation and addLocation methods in SWGPacket class --- src/network/packets/swg/SWGPacket.java | 22 ------------- .../swg/zone/SceneCreateObjectByCrc.java | 7 ++--- .../zone/object_controller/DataTransform.java | 10 ++---- .../DataTransformWithParent.java | 2 +- src/resources/Location.java | 28 +++++++++++++++-- src/resources/Point3D.java | 28 ++++++++++++++--- src/resources/Quaternion.java | 31 ++++++++++++++++--- src/resources/client_info/ServerFactory.java | 3 ++ 8 files changed, 85 insertions(+), 46 deletions(-) diff --git a/src/network/packets/swg/SWGPacket.java b/src/network/packets/swg/SWGPacket.java index 60d5e07b..5653f6e6 100644 --- a/src/network/packets/swg/SWGPacket.java +++ b/src/network/packets/swg/SWGPacket.java @@ -40,28 +40,6 @@ public class SWGPacket extends Packet { private ByteBuffer data = null; private int opcode = 0; private PacketType type = PacketType.UNKNOWN; - - protected void addLocation(ByteBuffer data, Location l) { - addFloat(data, (float) (Double.isNaN(l.getOrientationX()) ? 0 : l.getOrientationX())); - addFloat(data, (float) (Double.isNaN(l.getOrientationY()) ? 0 : l.getOrientationY())); - addFloat(data, (float) (Double.isNaN(l.getOrientationZ()) ? 0 : l.getOrientationZ())); - addFloat(data, (float) (Double.isNaN(l.getOrientationW()) ? 1 : l.getOrientationW())); - addFloat(data, (float) (Double.isNaN(l.getX()) ? 0 : l.getX())); - addFloat(data, (float) (Double.isNaN(l.getY()) ? 0 : l.getY())); - addFloat(data, (float) (Double.isNaN(l.getZ()) ? 0 : l.getZ())); - } - - protected Location getLocation(ByteBuffer data) { - Location l = new Location(); - l.setOrientationX(getFloat(data)); - l.setOrientationY(getFloat(data)); - l.setOrientationZ(getFloat(data)); - l.setOrientationW(getFloat(data)); - l.setX(getFloat(data)); - l.setY(getFloat(data)); - l.setZ(getFloat(data)); - return l; - } public void setSWGOpcode(int opcode) { this.opcode = opcode; diff --git a/src/network/packets/swg/zone/SceneCreateObjectByCrc.java b/src/network/packets/swg/zone/SceneCreateObjectByCrc.java index 85d36921..09969496 100644 --- a/src/network/packets/swg/zone/SceneCreateObjectByCrc.java +++ b/src/network/packets/swg/zone/SceneCreateObjectByCrc.java @@ -53,18 +53,17 @@ public class SceneCreateObjectByCrc extends SWGPacket { if (!super.decode(data, CRC)) return; objId = getLong(data); - l = getLocation(); + l = getEncodable(data, Location.class); objCrc = getInt(data); getByte(data); // Unknown Byte } public ByteBuffer encode() { - int length = 47; - ByteBuffer data = ByteBuffer.allocate(length); + ByteBuffer data = ByteBuffer.allocate(47); addShort(data, 5); addInt( data, CRC); addLong( data, objId); - addLocation(data, l); + addEncodable(data, l); addInt( data, objCrc); addByte( data, 0); // Unknown Byte return data; diff --git a/src/network/packets/swg/zone/object_controller/DataTransform.java b/src/network/packets/swg/zone/object_controller/DataTransform.java index 396d1d63..1a3b3c52 100644 --- a/src/network/packets/swg/zone/object_controller/DataTransform.java +++ b/src/network/packets/swg/zone/object_controller/DataTransform.java @@ -60,13 +60,7 @@ public class DataTransform extends ObjectController { decodeHeader(data); timestamp = getInt(data); updateCounter = getInt(data); - l.setOrientationX(getFloat(data)); - l.setOrientationY(getFloat(data)); - l.setOrientationZ(getFloat(data)); - l.setOrientationW(getFloat(data)); - l.setX(getFloat(data)); - l.setY(getFloat(data)); - l.setZ(getFloat(data)); + l = getEncodable(data, Location.class); speed = getFloat(data); lookAtYaw = getFloat(data); useLookAtYaw = getBoolean(data); @@ -77,7 +71,7 @@ public class DataTransform extends ObjectController { encodeHeader(data); addInt(data, timestamp); addInt(data, updateCounter); - addLocation(data, l); + addEncodable(data, l); addFloat(data, speed); addFloat(data, lookAtYaw); addBoolean(data, useLookAtYaw); diff --git a/src/network/packets/swg/zone/object_controller/DataTransformWithParent.java b/src/network/packets/swg/zone/object_controller/DataTransformWithParent.java index 0933c6f6..ab1d8818 100644 --- a/src/network/packets/swg/zone/object_controller/DataTransformWithParent.java +++ b/src/network/packets/swg/zone/object_controller/DataTransformWithParent.java @@ -33,7 +33,7 @@ public class DataTransformWithParent extends ObjectController { timestamp = getInt(data); // Timestamp counter = getInt(data); cellId = getLong(data); - l = getLocation(data); + l = getEncodable(data, Location.class); speed = getFloat(data); lookAtYaw = getFloat(data); useLookAtYaw = getBoolean(data); diff --git a/src/resources/Location.java b/src/resources/Location.java index 7de53b4a..a58b87cf 100644 --- a/src/resources/Location.java +++ b/src/resources/Location.java @@ -27,10 +27,15 @@ ***********************************************************************************/ package resources; +import network.packets.Packet; +import resources.encodables.Encodable; + import java.io.Serializable; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; -public class Location implements Serializable { +public class Location implements Encodable, Serializable { private static final long serialVersionUID = 1L; @@ -238,7 +243,26 @@ public class Location implements Serializable { return false; return x == y; } - + + @Override + public byte[] encode() { + ByteBuffer bb = ByteBuffer.allocate(28).order(ByteOrder.LITTLE_ENDIAN); + Packet.addFloat(bb, (float) (Double.isNaN(orientation.getX()) ? 0 : orientation.getX())); + Packet.addFloat(bb, (float) (Double.isNaN(orientation.getY()) ? 0 : orientation.getY())); + Packet.addFloat(bb, (float) (Double.isNaN(orientation.getZ()) ? 0 : orientation.getZ())); + Packet.addFloat(bb, (float) (Double.isNaN(orientation.getW()) ? 1 : orientation.getW())); + Packet.addFloat(bb, (float) (Double.isNaN(point.getX()) ? 0 : point.getX())); + Packet.addFloat(bb, (float) (Double.isNaN(point.getY()) ? 0 : point.getY())); + Packet.addFloat(bb, (float) (Double.isNaN(point.getZ()) ? 0 : point.getZ())); + return bb.array(); + } + + @Override + public void decode(ByteBuffer data) { + orientation.decode(data); + point.decode(data); + } + public String toString() { return String.format("Location[TRN=%s, %s %s]", terrain, point, orientation); } diff --git a/src/resources/Point3D.java b/src/resources/Point3D.java index c0bd7116..98494437 100644 --- a/src/resources/Point3D.java +++ b/src/resources/Point3D.java @@ -1,8 +1,12 @@ package resources; -import java.io.Serializable; +import network.packets.Packet; +import resources.encodables.Encodable; -public class Point3D implements Serializable { +import java.io.Serializable; +import java.nio.ByteBuffer; + +public class Point3D implements Encodable, Serializable { private static final long serialVersionUID = 1L; @@ -62,9 +66,25 @@ public class Point3D implements Serializable { double nZ = z + 2*oX*oZ*getX() + 2*oY*oZ*getY() + oZ*oZ*getZ() - 2*oW*oY*getX() - oY*oY*getZ() + 2*oW*oX*getY() - oX*oX*getZ() + oW*oW*getZ(); set(nX, nY, nZ); } - + + + @Override + public byte[] encode() { + ByteBuffer bb = ByteBuffer.allocate(12); + Packet.addFloat(bb, (float) x); + Packet.addFloat(bb, (float) y); + Packet.addFloat(bb, (float) z); + return bb.array(); + } + + @Override + public void decode(ByteBuffer data) { + x = Packet.getFloat(data); + y = Packet.getFloat(data); + z = Packet.getFloat(data); + } + public String toString() { return String.format("Point3D[%.2f, %.2f, %.2f]", x, y, z); } - } diff --git a/src/resources/Quaternion.java b/src/resources/Quaternion.java index 38408de5..a43f285e 100644 --- a/src/resources/Quaternion.java +++ b/src/resources/Quaternion.java @@ -1,8 +1,12 @@ package resources; -import java.io.Serializable; +import network.packets.Packet; +import resources.encodables.Encodable; -public class Quaternion implements Serializable { +import java.io.Serializable; +import java.nio.ByteBuffer; + +public class Quaternion implements Encodable, Serializable { private static final long serialVersionUID = 1L; @@ -98,15 +102,32 @@ public class Quaternion implements Serializable { } public void normalize() { - double mag = Math.sqrt(x*x + y*y + z*z + w*w); + double mag = Math.sqrt(x * x + y * y + z * z + w * w); x /= mag; y /= mag; z /= mag; w /= mag; } - + + @Override + public byte[] encode() { + ByteBuffer bb = ByteBuffer.allocate(16); + Packet.addFloat(bb, (float) x); + Packet.addFloat(bb, (float) y); + Packet.addFloat(bb, (float) z); + Packet.addFloat(bb, (float) w); + return bb.array(); + } + + @Override + public void decode(ByteBuffer data) { + x = Packet.getFloat(data); + y = Packet.getFloat(data); + z = Packet.getFloat(data); + w = Packet.getFloat(data); + } + public String toString() { return String.format("Quaternion[%.3f, %.3f, %.3f, %.3f]", x, y, z, w); } - } diff --git a/src/resources/client_info/ServerFactory.java b/src/resources/client_info/ServerFactory.java index 097e0e30..f899c1c1 100644 --- a/src/resources/client_info/ServerFactory.java +++ b/src/resources/client_info/ServerFactory.java @@ -28,6 +28,7 @@ package resources.client_info; import resources.client_info.visitors.DatatableData; +import resources.server_info.Log; import java.io.File; import java.io.IOException; @@ -73,11 +74,13 @@ public final class ServerFactory extends DataFactory { if (!iff.exists()) { convertSif(path, name); System.out.println("Created Server Datatable: " + name); + Log.i("ServerFactory", "Created Server Datatable: %s", name); } else { File sif = path.toFile(); if (sif.lastModified() > iff.lastModified()) { convertSif(path, name); System.out.println("Updated Server Datatable: " + name); + Log.i("ServerFactory", "Updated Server Datatable: %s", name); } } }