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;
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;

View File

@ -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;

View File

@ -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);

View File

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

View File

@ -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);
}