Added D2S serialization to Connection packet

This commit is contained in:
Collin Smith
2019-12-30 00:14:48 -08:00
parent cf180ee496
commit 65e58e8bbe
5 changed files with 43 additions and 13 deletions

View File

@ -2,10 +2,11 @@
package com.riiablo.net.packet.d2gs; package com.riiablo.net.packet.d2gs;
import java.nio.*; import com.google.flatbuffers.FlatBufferBuilder;
import java.lang.*; import com.google.flatbuffers.Table;
import java.util.*;
import com.google.flatbuffers.*; import java.nio.ByteBuffer;
import java.nio.ByteOrder;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final class Connection extends Table { 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 int cofAlphasLength() { int o = __offset(12); return o != 0 ? __vector_len(o) : 0; }
public ByteBuffer cofAlphasAsByteBuffer() { return __vector_as_bytebuffer(12, 4); } public ByteBuffer cofAlphasAsByteBuffer() { return __vector_as_bytebuffer(12, 4); }
public ByteBuffer cofAlphasInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 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, public static int createConnection(FlatBufferBuilder builder,
int charClass, int charClass,
@ -38,9 +43,11 @@ public final class Connection extends Table {
int cofComponentsOffset, int cofComponentsOffset,
int cofTransformsOffset, int cofTransformsOffset,
int cofAlphasOffset, int cofAlphasOffset,
int d2sOffset,
int entityId) { int entityId) {
builder.startObject(6); builder.startObject(7);
Connection.addEntityId(builder, entityId); Connection.addEntityId(builder, entityId);
Connection.addD2s(builder, d2sOffset);
Connection.addCofAlphas(builder, cofAlphasOffset); Connection.addCofAlphas(builder, cofAlphasOffset);
Connection.addCofTransforms(builder, cofTransformsOffset); Connection.addCofTransforms(builder, cofTransformsOffset);
Connection.addCofComponents(builder, cofComponentsOffset); Connection.addCofComponents(builder, cofComponentsOffset);
@ -49,7 +56,7 @@ public final class Connection extends Table {
return Connection.endConnection(builder); 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 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 addCharName(FlatBufferBuilder builder, int charNameOffset) { builder.addOffset(1, charNameOffset, 0); }
public static void addCofComponents(FlatBufferBuilder builder, int cofComponentsOffset) { builder.addOffset(2, cofComponentsOffset, 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 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 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 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) { public static int endConnection(FlatBufferBuilder builder) {
int o = builder.endObject(); int o = builder.endObject();
return o; return o;

View File

@ -125,6 +125,15 @@ public class D2S {
return new D2S(file, header); 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 { public static class Header {
static final int SIZE = 0x14F; static final int SIZE = 0x14F;

View File

@ -11,6 +11,7 @@ import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.net.Socket; import com.badlogic.gdx.net.Socket;
import com.riiablo.Riiablo; import com.riiablo.Riiablo;
import com.riiablo.codec.D2S;
import com.riiablo.engine.server.component.Angle; import com.riiablo.engine.server.component.Angle;
import com.riiablo.engine.server.component.CofAlphas; import com.riiablo.engine.server.component.CofAlphas;
import com.riiablo.engine.server.component.CofComponents; import com.riiablo.engine.server.component.CofComponents;
@ -74,8 +75,10 @@ public class ClientNetworkSyncronizer extends IntervalSystem {
init = true; init = true;
try { try {
D2S d2s = Riiablo.charData.getD2S();
FlatBufferBuilder builder = new FlatBufferBuilder(); 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 entityId = Riiablo.game.player;
int[] component = mCofComponents.get(entityId).component; int[] component = mCofComponents.get(entityId).component;
@ -89,12 +92,15 @@ public class ClientNetworkSyncronizer extends IntervalSystem {
byte[] transforms = mCofTransforms.get(entityId).transform; byte[] transforms = mCofTransforms.get(entityId).transform;
int transformsOffset = Connection.createCofTransformsVector(builder, transforms); int transformsOffset = Connection.createCofTransformsVector(builder, transforms);
int d2sOffset = Connection.createD2sVector(builder, d2s.file.readBytes());
Connection.startConnection(builder); Connection.startConnection(builder);
Connection.addCharClass(builder, Riiablo.charData.getD2S().header.charClass); Connection.addCharClass(builder, d2s.header.charClass);
Connection.addCharName(builder, charNameOffset); Connection.addCharName(builder, charNameOffset);
Connection.addCofComponents(builder, componentsOffset); Connection.addCofComponents(builder, componentsOffset);
Connection.addCofAlphas(builder, alphasOffset); Connection.addCofAlphas(builder, alphasOffset);
Connection.addCofTransforms(builder, transformsOffset); Connection.addCofTransforms(builder, transformsOffset);
Connection.addD2s(builder, d2sOffset);
int connectionOffset = Connection.endConnection(builder); int connectionOffset = Connection.endConnection(builder);
int offset = D2GS.createD2GS(builder, D2GSData.Connection, connectionOffset); int offset = D2GS.createD2GS(builder, D2GSData.Connection, connectionOffset);
D2GS.finishSizePrefixedD2GSBuffer(builder, offset); D2GS.finishSizePrefixedD2GSBuffer(builder, offset);

View File

@ -7,6 +7,7 @@ table Connection {
cofComponents:[uint8]; cofComponents:[uint8];
cofTransforms:[uint8]; cofTransforms:[uint8];
cofAlphas:[float32]; cofAlphas:[float32];
d2s:[ubyte];
// response // response
entityId:int32; entityId:int32;

View File

@ -28,6 +28,7 @@ import com.riiablo.Riiablo;
import com.riiablo.audio.ServerAudio; import com.riiablo.audio.ServerAudio;
import com.riiablo.codec.Animation; import com.riiablo.codec.Animation;
import com.riiablo.codec.D2; import com.riiablo.codec.D2;
import com.riiablo.codec.D2S;
import com.riiablo.codec.StringTBLs; import com.riiablo.codec.StringTBLs;
import com.riiablo.engine.Engine; import com.riiablo.engine.Engine;
import com.riiablo.engine.EntityFactory; 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.VelocityAdder;
import com.riiablo.engine.server.WarpInteractor; import com.riiablo.engine.server.WarpInteractor;
import com.riiablo.engine.server.component.Networked; import com.riiablo.engine.server.component.Networked;
import com.riiablo.engine.server.component.Player;
import com.riiablo.map.Act1MapBuilder; import com.riiablo.map.Act1MapBuilder;
import com.riiablo.map.DS1; import com.riiablo.map.DS1;
import com.riiablo.map.DS1Loader; import com.riiablo.map.DS1Loader;
@ -392,10 +392,15 @@ public class D2GS extends ApplicationAdapter {
connection.cofTransformsAsByteBuffer().get(cofTransforms); connection.cofTransformsAsByteBuffer().get(cofTransforms);
Gdx.app.log(TAG, " " + DebugUtils.toByteArray(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); 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.TOWN_ENTRY_2);
if (origin == null) origin = map.find(Map.ID.TP_LOCATION); 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); player.put(packet.id, entityId);
Gdx.app.log(TAG, " entityId=" + entityId); Gdx.app.log(TAG, " entityId=" + entityId);
@ -410,7 +415,6 @@ public class D2GS extends ApplicationAdapter {
Synchronize(packet.id, entityId); Synchronize(packet.id, entityId);
CharData charData = world.getMapper(Player.class).get(entityId).data;
BroadcastConnect(packet.id, connection, charData, entityId); BroadcastConnect(packet.id, connection, charData, entityId);
} }