diff --git a/core/gen/com/riiablo/net/packet/d2gs/EntitySync.java b/core/gen/com/riiablo/net/packet/d2gs/EntitySync.java index b50a8e7e..83d4caa5 100644 --- a/core/gen/com/riiablo/net/packet/d2gs/EntitySync.java +++ b/core/gen/com/riiablo/net/packet/d2gs/EntitySync.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 EntitySync extends Table { @@ -16,33 +17,37 @@ public final class EntitySync extends Table { public int entityId() { int o = __offset(4); return o != 0 ? bb.getInt(o + bb_pos) : 0; } public int type() { int o = __offset(6); return o != 0 ? bb.get(o + bb_pos) & 0xFF : 0; } - public byte componentType(int j) { int o = __offset(8); return o != 0 ? bb.get(__vector(o) + j * 1) : 0; } - public int componentTypeLength() { int o = __offset(8); return o != 0 ? __vector_len(o) : 0; } - public ByteBuffer componentTypeAsByteBuffer() { return __vector_as_bytebuffer(8, 1); } - public ByteBuffer componentTypeInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 8, 1); } - public Table component(Table obj, int j) { int o = __offset(10); return o != 0 ? __union(obj, __vector(o) + j * 4 - bb_pos) : null; } - public int componentLength() { int o = __offset(10); return o != 0 ? __vector_len(o) : 0; } + public boolean delete() { int o = __offset(8); return o != 0 ? 0!=bb.get(o + bb_pos) : false; } + public byte componentType(int j) { int o = __offset(10); return o != 0 ? bb.get(__vector(o) + j * 1) : 0; } + public int componentTypeLength() { int o = __offset(10); return o != 0 ? __vector_len(o) : 0; } + public ByteBuffer componentTypeAsByteBuffer() { return __vector_as_bytebuffer(10, 1); } + public ByteBuffer componentTypeInByteBuffer(ByteBuffer _bb) { return __vector_in_bytebuffer(_bb, 10, 1); } + public Table component(Table obj, int j) { int o = __offset(12); return o != 0 ? __union(obj, __vector(o) + j * 4 - bb_pos) : null; } + public int componentLength() { int o = __offset(12); return o != 0 ? __vector_len(o) : 0; } public static int createEntitySync(FlatBufferBuilder builder, int entityId, int type, + boolean delete, int component_typeOffset, int componentOffset) { - builder.startObject(4); + builder.startObject(5); EntitySync.addComponent(builder, componentOffset); EntitySync.addComponentType(builder, component_typeOffset); EntitySync.addEntityId(builder, entityId); + EntitySync.addDelete(builder, delete); EntitySync.addType(builder, type); return EntitySync.endEntitySync(builder); } - public static void startEntitySync(FlatBufferBuilder builder) { builder.startObject(4); } + public static void startEntitySync(FlatBufferBuilder builder) { builder.startObject(5); } public static void addEntityId(FlatBufferBuilder builder, int entityId) { builder.addInt(0, entityId, 0); } public static void addType(FlatBufferBuilder builder, int type) { builder.addByte(1, (byte)type, (byte)0); } - public static void addComponentType(FlatBufferBuilder builder, int componentTypeOffset) { builder.addOffset(2, componentTypeOffset, 0); } + public static void addDelete(FlatBufferBuilder builder, boolean delete) { builder.addBoolean(2, delete, false); } + public static void addComponentType(FlatBufferBuilder builder, int componentTypeOffset) { builder.addOffset(3, componentTypeOffset, 0); } public static int createComponentTypeVector(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 startComponentTypeVector(FlatBufferBuilder builder, int numElems) { builder.startVector(1, numElems, 1); } - public static void addComponent(FlatBufferBuilder builder, int componentOffset) { builder.addOffset(3, componentOffset, 0); } + public static void addComponent(FlatBufferBuilder builder, int componentOffset) { builder.addOffset(4, componentOffset, 0); } public static int createComponentVector(FlatBufferBuilder builder, int[] data) { builder.startVector(4, data.length, 4); for (int i = data.length - 1; i >= 0; i--) builder.addOffset(data[i]); return builder.endVector(); } public static void startComponentVector(FlatBufferBuilder builder, int numElems) { builder.startVector(4, numElems, 4); } public static int endEntitySync(FlatBufferBuilder builder) { diff --git a/core/src/com/riiablo/engine/client/ClientNetworkReceiver.java b/core/src/com/riiablo/engine/client/ClientNetworkReceiver.java index aeda47dd..42de0702 100644 --- a/core/src/com/riiablo/engine/client/ClientNetworkReceiver.java +++ b/core/src/com/riiablo/engine/client/ClientNetworkReceiver.java @@ -337,6 +337,14 @@ public class ClientNetworkReceiver extends IntervalSystem { private void Synchronize(EntitySync entityData) { int entityId = syncIds.get(entityData.entityId()); + if (entityData.delete()) { + if (entityId != Engine.INVALID_ENTITY) { + world.delete(entityId); + } + + return; + } + if (entityId == Engine.INVALID_ENTITY) { syncIds.put(entityData.entityId(), entityId = createEntity(entityData)); } diff --git a/core/src/com/riiablo/engine/server/SerializationManager.java b/core/src/com/riiablo/engine/server/SerializationManager.java index 3f86dc3e..c7f6593e 100644 --- a/core/src/com/riiablo/engine/server/SerializationManager.java +++ b/core/src/com/riiablo/engine/server/SerializationManager.java @@ -15,6 +15,7 @@ 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.DS1ObjectWrapper; +import com.riiablo.engine.server.component.Deleted; import com.riiablo.engine.server.component.Item; import com.riiablo.engine.server.component.Monster; import com.riiablo.engine.server.component.Player; @@ -42,6 +43,8 @@ import com.riiablo.net.packet.d2gs.EntitySync; import net.mostlyoriginal.api.system.core.PassiveSystem; +import org.apache.commons.lang3.ArrayUtils; + public class SerializationManager extends PassiveSystem { private static final String TAG = "SerializationManager"; private static final boolean DEBUG = true; @@ -56,6 +59,8 @@ public class SerializationManager extends PassiveSystem { private Class[] deserializers; private final EntitySync sync = new EntitySync(); + protected ComponentMapper mDeleted; + protected ComponentMapper mClass; protected ComponentMapper mCofComponents; protected ComponentMapper mCofTransforms; @@ -122,6 +127,14 @@ public class SerializationManager extends PassiveSystem { components.clear(); int type = mClass.get(entityId).type.ordinal(); + + boolean deleted = mDeleted.has(entityId); + if (deleted) { + int dataTypeOffset = EntitySync.createComponentTypeVector(builder, ArrayUtils.EMPTY_BYTE_ARRAY); + int dataOffset = EntitySync.createComponentVector(builder, ArrayUtils.EMPTY_INT_ARRAY); + return EntitySync.createEntitySync(builder, entityId, type, deleted, dataTypeOffset, dataOffset); + } + componentManager.getComponentsFor(entityId, components); for (Component c : components) { FlatBuffersSerializer serializer = serializers.get(c.getClass()); @@ -144,7 +157,7 @@ public class SerializationManager extends PassiveSystem { for (int i = 0; i < dataSize; i++) builder.addOffset(data[i]); int dataOffset = builder.endVector(); - return EntitySync.createEntitySync(builder, entityId, type, dataTypeOffset, dataOffset); + return EntitySync.createEntitySync(builder, entityId, type, deleted, dataTypeOffset, dataOffset); } public void deserialize(int entityId, D2GS packet) { diff --git a/core/src/com/riiablo/net/d2gs/Sync.fbs b/core/src/com/riiablo/net/d2gs/Sync.fbs index 7e8660a5..6ba936d4 100644 --- a/core/src/com/riiablo/net/d2gs/Sync.fbs +++ b/core/src/com/riiablo/net/d2gs/Sync.fbs @@ -18,6 +18,7 @@ union ComponentP { table EntitySync { entityId:int32; type:uint8; + delete:bool = false; component:[ComponentP]; } diff --git a/server/d2gs/src/com/riiablo/server/d2gs/NetworkSynchronizer.java b/server/d2gs/src/com/riiablo/server/d2gs/NetworkSynchronizer.java index 6e63866f..8943457e 100644 --- a/server/d2gs/src/com/riiablo/server/d2gs/NetworkSynchronizer.java +++ b/server/d2gs/src/com/riiablo/server/d2gs/NetworkSynchronizer.java @@ -3,12 +3,15 @@ package com.riiablo.server.d2gs; import com.google.flatbuffers.FlatBufferBuilder; import com.artemis.BaseEntitySystem; +import com.artemis.ComponentMapper; import com.artemis.annotations.All; import com.artemis.annotations.Wire; import com.artemis.utils.IntBag; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.utils.IntIntMap; import com.riiablo.engine.server.SerializationManager; +import com.riiablo.engine.server.component.Class; +import com.riiablo.engine.server.component.Deleted; import com.riiablo.engine.server.component.Networked; import com.riiablo.net.packet.d2gs.D2GS; import com.riiablo.net.packet.d2gs.D2GSData; @@ -27,11 +30,28 @@ public class NetworkSynchronizer extends BaseEntitySystem { @Wire(name = "player") protected IntIntMap players; + protected ComponentMapper mClass; + protected ComponentMapper mDeleted; + @Override protected boolean checkProcessing() { return players.size > 0; } + // FIXME: this assumes that removing Networked component implies deletion -- may not always be case + @Override + protected void removed(int entityId) { + Class.Type type = mClass.get(entityId).type; + switch (type) { + case PLR: + // TODO: handled by disconnection packet, need to handle here also + break; + default: + mDeleted.create(entityId); + process(entityId); + } + } + @Override protected void processSystem() { IntBag entities = subscription.getEntities();