diff --git a/core/gen/com/riiablo/net/packet/d2gs/Connection.java b/core/gen/com/riiablo/net/packet/d2gs/Connection.java index 8d70aed2..b08100f0 100644 --- a/core/gen/com/riiablo/net/packet/d2gs/Connection.java +++ b/core/gen/com/riiablo/net/packet/d2gs/Connection.java @@ -2,10 +2,11 @@ package com.riiablo.net.packet.d2gs; -import java.nio.*; -import java.lang.*; -import java.util.*; -import com.google.flatbuffers.*; +import com.google.flatbuffers.FlatBufferBuilder; +import com.google.flatbuffers.Table; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; @SuppressWarnings("unused") public final class Connection extends Table { @@ -30,7 +31,11 @@ public final class Connection extends Table { public int cofAlphasLength() { int o = __offset(12); return o != 0 ? __vector_len(o) : 0; } public ByteBuffer cofAlphasAsByteBuffer() { return __vector_as_bytebuffer(12, 4); } public ByteBuffer cofAlphasInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 12, 4); } - public int entityId() { int o = __offset(14); return o != 0 ? bb.getInt(o + bb_pos) : 0; } + public int d2s(int j) { int o = __offset(14); return o != 0 ? bb.get(__vector(o) + j * 1) & 0xFF : 0; } + public int d2sLength() { int o = __offset(14); return o != 0 ? __vector_len(o) : 0; } + public ByteBuffer d2sAsByteBuffer() { return __vector_as_bytebuffer(14, 1); } + public ByteBuffer d2sInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 14, 1); } + public int entityId() { int o = __offset(16); return o != 0 ? bb.getInt(o + bb_pos) : 0; } public static int createConnection(FlatBufferBuilder builder, int charClass, @@ -38,9 +43,11 @@ public final class Connection extends Table { int cofComponentsOffset, int cofTransformsOffset, int cofAlphasOffset, + int d2sOffset, int entityId) { - builder.startObject(6); + builder.startObject(7); Connection.addEntityId(builder, entityId); + Connection.addD2s(builder, d2sOffset); Connection.addCofAlphas(builder, cofAlphasOffset); Connection.addCofTransforms(builder, cofTransformsOffset); Connection.addCofComponents(builder, cofComponentsOffset); @@ -49,7 +56,7 @@ public final class Connection extends Table { return Connection.endConnection(builder); } - public static void startConnection(FlatBufferBuilder builder) { builder.startObject(6); } + public static void startConnection(FlatBufferBuilder builder) { builder.startObject(7); } public static void addCharClass(FlatBufferBuilder builder, int charClass) { builder.addByte(0, (byte)charClass, (byte)0); } public static void addCharName(FlatBufferBuilder builder, int charNameOffset) { builder.addOffset(1, charNameOffset, 0); } public static void addCofComponents(FlatBufferBuilder builder, int cofComponentsOffset) { builder.addOffset(2, cofComponentsOffset, 0); } @@ -61,7 +68,10 @@ public final class Connection extends Table { public static void addCofAlphas(FlatBufferBuilder builder, int cofAlphasOffset) { builder.addOffset(4, cofAlphasOffset, 0); } public static int createCofAlphasVector(FlatBufferBuilder builder, float[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addFloat(data[i]); return builder.endVector(); } public static void startCofAlphasVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); } - public static void addEntityId(FlatBufferBuilder builder, int entityId) { builder.addInt(5, entityId, 0); } + public static void addD2s(FlatBufferBuilder builder, int d2sOffset) { builder.addOffset(5, d2sOffset, 0); } + public static int createD2sVector(FlatBufferBuilder builder, byte[] data) { builder.startVector(1, data.length, 1); for (int i = data.length - 1; i >= 0; i--) builder.addByte(data[i]); return builder.endVector(); } + public static void startD2sVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); } + public static void addEntityId(FlatBufferBuilder builder, int entityId) { builder.addInt(6, entityId, 0); } public static int endConnection(FlatBufferBuilder builder) { int o = builder.endObject(); return o; diff --git a/core/src/com/riiablo/codec/D2S.java b/core/src/com/riiablo/codec/D2S.java index c83b6938..bfd0168f 100644 --- a/core/src/com/riiablo/codec/D2S.java +++ b/core/src/com/riiablo/codec/D2S.java @@ -125,6 +125,15 @@ public class D2S { return new D2S(file, header); } + public static D2S loadFromBuffer(ByteBuffer buffer) { + buffer.order(ByteOrder.LITTLE_ENDIAN); + Header header = Header.obtain(buffer); + if (DEBUG_HEADER) Gdx.app.debug(TAG, header.toString()); + if (header.magicNumber != MAGIC_NUMBER) throw new GdxRuntimeException("Magic number doesn't match " + String.format("0x%08X", MAGIC_NUMBER) + ": " + String.format("0x%08X", header.magicNumber)); + if (header.version != VERSION_110) throw new GdxRuntimeException("Unsupported D2S version: " + header.version + " -- Only supports " + header.getVersionString(VERSION_110)); + return new D2S(null, header); + } + public static class Header { static final int SIZE = 0x14F; diff --git a/core/src/com/riiablo/engine/client/ClientNetworkSyncronizer.java b/core/src/com/riiablo/engine/client/ClientNetworkSyncronizer.java index 66b40d27..f30e07ff 100644 --- a/core/src/com/riiablo/engine/client/ClientNetworkSyncronizer.java +++ b/core/src/com/riiablo/engine/client/ClientNetworkSyncronizer.java @@ -11,6 +11,7 @@ import com.badlogic.gdx.Gdx; import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.net.Socket; import com.riiablo.Riiablo; +import com.riiablo.codec.D2S; import com.riiablo.engine.server.component.Angle; import com.riiablo.engine.server.component.CofAlphas; import com.riiablo.engine.server.component.CofComponents; @@ -74,8 +75,10 @@ public class ClientNetworkSyncronizer extends IntervalSystem { init = true; try { + D2S d2s = Riiablo.charData.getD2S(); + FlatBufferBuilder builder = new FlatBufferBuilder(); - int charNameOffset = builder.createString(Riiablo.charData.getD2S().header.name); + int charNameOffset = builder.createString(d2s.header.name); int entityId = Riiablo.game.player; int[] component = mCofComponents.get(entityId).component; @@ -89,12 +92,15 @@ public class ClientNetworkSyncronizer extends IntervalSystem { byte[] transforms = mCofTransforms.get(entityId).transform; int transformsOffset = Connection.createCofTransformsVector(builder, transforms); + int d2sOffset = Connection.createD2sVector(builder, d2s.file.readBytes()); + Connection.startConnection(builder); - Connection.addCharClass(builder, Riiablo.charData.getD2S().header.charClass); + Connection.addCharClass(builder, d2s.header.charClass); Connection.addCharName(builder, charNameOffset); Connection.addCofComponents(builder, componentsOffset); Connection.addCofAlphas(builder, alphasOffset); Connection.addCofTransforms(builder, transformsOffset); + Connection.addD2s(builder, d2sOffset); int connectionOffset = Connection.endConnection(builder); int offset = D2GS.createD2GS(builder, D2GSData.Connection, connectionOffset); D2GS.finishSizePrefixedD2GSBuffer(builder, offset); diff --git a/core/src/com/riiablo/net/d2gs/Connection.fbs b/core/src/com/riiablo/net/d2gs/Connection.fbs index e1d2fdf5..01f3a243 100644 --- a/core/src/com/riiablo/net/d2gs/Connection.fbs +++ b/core/src/com/riiablo/net/d2gs/Connection.fbs @@ -7,6 +7,7 @@ table Connection { cofComponents:[uint8]; cofTransforms:[uint8]; cofAlphas:[float32]; + d2s:[ubyte]; // response entityId:int32; diff --git a/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java b/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java index 3b765aae..245e6146 100644 --- a/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java +++ b/server/d2gs/src/com/riiablo/server/d2gs/D2GS.java @@ -28,6 +28,7 @@ import com.riiablo.Riiablo; import com.riiablo.audio.ServerAudio; import com.riiablo.codec.Animation; import com.riiablo.codec.D2; +import com.riiablo.codec.D2S; import com.riiablo.codec.StringTBLs; import com.riiablo.engine.Engine; import com.riiablo.engine.EntityFactory; @@ -44,7 +45,6 @@ import com.riiablo.engine.server.ServerNetworkIdManager; import com.riiablo.engine.server.VelocityAdder; import com.riiablo.engine.server.WarpInteractor; import com.riiablo.engine.server.component.Networked; -import com.riiablo.engine.server.component.Player; import com.riiablo.map.Act1MapBuilder; import com.riiablo.map.DS1; import com.riiablo.map.DS1Loader; @@ -392,10 +392,15 @@ public class D2GS extends ApplicationAdapter { connection.cofTransformsAsByteBuffer().get(cofTransforms); Gdx.app.log(TAG, " " + DebugUtils.toByteArray(cofTransforms)); + ByteBuffer d2sData = connection.d2sAsByteBuffer(); + D2S d2s = D2S.loadFromBuffer(d2sData); + CharData charData = new CharData().setD2S(d2s); + Gdx.app.log(TAG, " " + d2s); + Vector2 origin = map.find(Map.ID.TOWN_ENTRY_1); if (origin == null) origin = map.find(Map.ID.TOWN_ENTRY_2); if (origin == null) origin = map.find(Map.ID.TP_LOCATION); - int entityId = factory.createPlayer(charName, charClass, origin.x, origin.y); + int entityId = factory.createPlayer(charData, origin); player.put(packet.id, entityId); Gdx.app.log(TAG, " entityId=" + entityId); @@ -410,7 +415,6 @@ public class D2GS extends ApplicationAdapter { Synchronize(packet.id, entityId); - CharData charData = world.getMapper(Player.class).get(entityId).data; BroadcastConnect(packet.id, connection, charData, entityId); }