Added support for creating entities for preexisting characters on new client instances

This commit is contained in:
Collin Smith 2019-12-15 02:06:35 -08:00
parent c14a8fcb18
commit 3669ffc57b
8 changed files with 159 additions and 26 deletions

View File

@ -0,0 +1,34 @@
// automatically generated by the FlatBuffers compiler, do not modify
package com.riiablo.net.packet.d2gs;
import com.google.flatbuffers.FlatBufferBuilder;
import com.google.flatbuffers.Table;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
@SuppressWarnings("unused")
public final class Class extends Table {
public static Class getRootAsClass(ByteBuffer _bb) { return getRootAsClass(_bb, new Class()); }
public static Class getRootAsClass(ByteBuffer _bb, Class obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { bb_pos = _i; bb = _bb; vtable_start = bb_pos - bb.getInt(bb_pos); vtable_size = bb.getShort(vtable_start); }
public Class __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
public int type() { int o = __offset(4); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 0; }
public static int createClass(FlatBufferBuilder builder,
int type) {
builder.startObject(1);
Class.addType(builder, type);
return Class.endClass(builder);
}
public static void startClass(FlatBufferBuilder builder) { builder.startObject(1); }
public static void addType(FlatBufferBuilder builder, int type) { builder.addByte(0, (byte)type, (byte)0); }
public static int endClass(FlatBufferBuilder builder) {
int o = builder.endObject();
return o;
}
}

View File

@ -0,0 +1,40 @@
// automatically generated by the FlatBuffers compiler, do not modify
package com.riiablo.net.packet.d2gs;
import com.google.flatbuffers.FlatBufferBuilder;
import com.google.flatbuffers.Table;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
@SuppressWarnings("unused")
public final class Player extends Table {
public static Player getRootAsPlayer(ByteBuffer _bb) { return getRootAsPlayer(_bb, new Player()); }
public static Player getRootAsPlayer(ByteBuffer _bb, Player obj) { _bb.order(ByteOrder.LITTLE_ENDIAN); return (obj.__assign(_bb.getInt(_bb.position()) + _bb.position(), _bb)); }
public void __init(int _i, ByteBuffer _bb) { bb_pos = _i; bb = _bb; vtable_start = bb_pos - bb.getInt(bb_pos); vtable_size = bb.getShort(vtable_start); }
public Player __assign(int _i, ByteBuffer _bb) { __init(_i, _bb); return this; }
public int charClass() { int o = __offset(4); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 0; }
public String charName() { int o = __offset(6); return o != 0 ? __string(o + bb_pos) : null; }
public ByteBuffer charNameAsByteBuffer() { return __vector_as_bytebuffer(6, 1); }
public ByteBuffer charNameInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 6, 1); }
public static int createPlayer(FlatBufferBuilder builder,
int charClass,
int charNameOffset) {
builder.startObject(2);
Player.addCharName(builder, charNameOffset);
Player.addCharClass(builder, charClass);
return Player.endPlayer(builder);
}
public static void startPlayer(FlatBufferBuilder builder) { builder.startObject(2); }
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 int endPlayer(FlatBufferBuilder builder) {
int o = builder.endObject();
return o;
}
}

View File

@ -5,14 +5,16 @@ package com.riiablo.net.packet.d2gs;
public final class SyncData {
private SyncData() { }
public static final byte NONE = 0;
public static final byte CofComponents = 1;
public static final byte CofTransforms = 2;
public static final byte CofAlphas = 3;
public static final byte Position = 4;
public static final byte Velocity = 5;
public static final byte Angle = 6;
public static final byte Class = 1;
public static final byte CofComponents = 2;
public static final byte CofTransforms = 3;
public static final byte CofAlphas = 4;
public static final byte Position = 5;
public static final byte Velocity = 6;
public static final byte Angle = 7;
public static final byte Player = 8;
public static final String[] names = { "NONE", "CofComponents", "CofTransforms", "CofAlphas", "Position", "Velocity", "Angle", };
public static final String[] names = { "NONE", "Class", "CofComponents", "CofTransforms", "CofAlphas", "Position", "Velocity", "Angle", "Player", };
public static String name(int e) { return names[e]; }
}

View File

@ -94,6 +94,18 @@ public class Class extends Component {
public int getComponent(String comp) {
return COMPS.get(comp.toLowerCase(), -1);
}
public static Type valueOf(int i) {
switch (i) {
case 0: return OBJ;
case 1: return MON;
case 2: return PLR;
case 3: return ITM;
case 4: return WRP;
case 5: return MIS;
default: throw new AssertionError("Unknown type id: " + i);
}
}
}
public Type type;

View File

@ -1,12 +1,14 @@
namespace com.riiablo.net.packet.d2gs;
union SyncData {
Class,
CofComponents,
CofTransforms,
CofAlphas,
Position,
Velocity,
Angle,
Player,
}
table Sync {
@ -14,6 +16,10 @@ table Sync {
data:[SyncData];
}
table Class {
type:uint8;
}
table CofComponents {
component:[uint8];
}
@ -39,4 +45,9 @@ table Velocity {
table Angle {
x:float32;
y:float32;
}
table Player {
charClass:uint8;
charName:string;
}

View File

@ -170,10 +170,32 @@ public class NetworkedGameScreen extends GameScreen {
engine.delete(entityId);
}
private com.riiablo.net.packet.d2gs.Player findPlayer(Sync s) {
for (int i = 0, len = s.dataTypeLength(); i < len; i++) {
if (s.dataType(i) == SyncData.Player) {
return (com.riiablo.net.packet.d2gs.Player) s.data(new com.riiablo.net.packet.d2gs.Player(), i);
}
}
return null;
}
private void Synchronize(D2GS packet) {
Sync s = (Sync) packet.data(new Sync());
int entityId = sync.get(s.entityId());
if (entityId == Engine.INVALID_ENTITY) return;
if (entityId == Engine.INVALID_ENTITY) {
com.riiablo.net.packet.d2gs.Player player = findPlayer(s);
CharData charData = new CharData().createD2S(player.charName(), CharacterClass.get(player.charClass()));
// TODO: assert entity id is player
// TODO: add support for other entity types
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);
Map.Zone zone = map.getZone(origin);
entityId = factory.createPlayer(map, zone, charData, origin);
sync.put(s.entityId(), entityId);
}
int flags1 = Dirty.NONE;
int flags2 = Dirty.NONE;

View File

@ -378,6 +378,10 @@ public class D2GS extends ApplicationAdapter {
BroadcastConnect(packet.id, connection, charData, entityId);
}
private void Synchronize(int id, int entityId) {
}
private void BroadcastConnect(int id, Connection connection, CharData charData, int entityId) {
FlatBufferBuilder builder = new FlatBufferBuilder();
int charNameOffset = builder.createString(charData.getD2S().header.name);
@ -437,10 +441,6 @@ public class D2GS extends ApplicationAdapter {
sync.sync(entityId, (Sync) packet.data.data(new Sync()));
}
private void Synchronize(int id, int entityId) {
}
static String generateClientName() {
return String.format("Client-%08X", MathUtils.random(1, Integer.MAX_VALUE - 1));
}

View File

@ -9,12 +9,15 @@ import com.artemis.systems.IteratingSystem;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.IntIntMap;
import com.riiablo.CharData;
import com.riiablo.engine.server.CofManager;
import com.riiablo.engine.server.component.Angle;
import com.riiablo.engine.server.component.Class;
import com.riiablo.engine.server.component.CofAlphas;
import com.riiablo.engine.server.component.CofComponents;
import com.riiablo.engine.server.component.CofTransforms;
import com.riiablo.engine.server.component.Networked;
import com.riiablo.engine.server.component.Player;
import com.riiablo.engine.server.component.Position;
import com.riiablo.engine.server.component.Velocity;
import com.riiablo.net.packet.d2gs.D2GSData;
@ -36,6 +39,8 @@ public class NetworkSynchronizer extends IteratingSystem {
protected ComponentMapper<Position> mPosition;
protected ComponentMapper<Velocity> mVelocity;
protected ComponentMapper<Angle> mAngle;
protected ComponentMapper<Class> mClass;
protected ComponentMapper<Player> mPlayer;
protected CofManager cofs;
@ -76,22 +81,29 @@ public class NetworkSynchronizer extends IteratingSystem {
Vector2 velocity = mVelocity.get(entityId).velocity;
Vector2 angle = mAngle.get(entityId).target;
byte[] dataTypes = new byte[6];
dataTypes[0] = SyncData.CofComponents;
dataTypes[1] = SyncData.CofTransforms;
dataTypes[2] = SyncData.CofAlphas;
dataTypes[3] = SyncData.Position;
dataTypes[4] = SyncData.Velocity;
dataTypes[5] = SyncData.Angle;
CharData charData = mPlayer.get(entityId).data;
int charNameOffset = builder.createString(charData.getD2S().header.name);
byte[] dataTypes = new byte[8];
dataTypes[0] = SyncData.Class;
dataTypes[1] = SyncData.CofComponents;
dataTypes[2] = SyncData.CofTransforms;
dataTypes[3] = SyncData.CofAlphas;
dataTypes[4] = SyncData.Position;
dataTypes[5] = SyncData.Velocity;
dataTypes[6] = SyncData.Angle;
dataTypes[7] = SyncData.Player;
int dataTypesOffset = Sync.createDataTypeVector(builder, dataTypes);
int[] data = new int[6];
data[0] = cofComponents;
data[1] = cofTransforms;
data[2] = cofAlphas;
data[3] = com.riiablo.net.packet.d2gs.Position.createPosition(builder, position.x, position.y);
data[4] = com.riiablo.net.packet.d2gs.Velocity.createVelocity(builder, velocity.x, velocity.y);
data[5] = com.riiablo.net.packet.d2gs.Angle.createAngle(builder, angle.x, angle.y);
int[] data = new int[8];
data[0] = com.riiablo.net.packet.d2gs.Class.createClass(builder, mClass.get(entityId).type.ordinal());
data[1] = cofComponents;
data[2] = cofTransforms;
data[3] = cofAlphas;
data[4] = com.riiablo.net.packet.d2gs.Position.createPosition(builder, position.x, position.y);
data[5] = com.riiablo.net.packet.d2gs.Velocity.createVelocity(builder, velocity.x, velocity.y);
data[6] = com.riiablo.net.packet.d2gs.Angle.createAngle(builder, angle.x, angle.y);
data[7] = com.riiablo.net.packet.d2gs.Player.createPlayer(builder, charData.getD2S().header.charClass, charNameOffset);
int dataOffset = Sync.createDataVector(builder, data);
Sync.startSync(builder);