diff --git a/bukkit/pom.xml b/bukkit/pom.xml
index f4cb332ed..73494e248 100644
--- a/bukkit/pom.xml
+++ b/bukkit/pom.xml
@@ -5,7 +5,7 @@
viaversion-parent
us.myles
- 1.4.0-17w43b
+ 1.4.0-17w45a
4.0.0
diff --git a/bungee/pom.xml b/bungee/pom.xml
index 097fc68ba..eef022a1b 100644
--- a/bungee/pom.xml
+++ b/bungee/pom.xml
@@ -5,7 +5,7 @@
viaversion-parent
us.myles
- 1.4.0-17w43b
+ 1.4.0-17w45a
4.0.0
@@ -37,7 +37,7 @@
us.myles
viaversion-common
- 1.4.0-17w43b
+ 1.4.0-17w45a
\ No newline at end of file
diff --git a/common/pom.xml b/common/pom.xml
index b89a02afc..d68bcc32c 100644
--- a/common/pom.xml
+++ b/common/pom.xml
@@ -5,7 +5,7 @@
viaversion-parent
us.myles
- 1.4.0-17w43b
+ 1.4.0-17w45a
4.0.0
diff --git a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java
index 2f32dd5d5..b88afa618 100644
--- a/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java
+++ b/common/src/main/java/us/myles/ViaVersion/api/protocol/ProtocolVersion.java
@@ -62,7 +62,7 @@ public class ProtocolVersion {
register(v1_12 = new ProtocolVersion(335, "1.12"));
register(v1_12_1 = new ProtocolVersion(338, "1.12.1"));
register(v1_12_2 = new ProtocolVersion(340, "1.12.2"));
- register(v1_13 = new ProtocolVersion(342, "17w43b"));
+ register(v1_13 = new ProtocolVersion(343, "17w45a"));
register(unknown = new ProtocolVersion(-1, "UNKNOWN"));
}
diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12_1to1_12/Protocol1_12_1TO1_12.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12_1to1_12/Protocol1_12_1TO1_12.java
index a70891f8e..21812565a 100644
--- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12_1to1_12/Protocol1_12_1TO1_12.java
+++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12_1to1_12/Protocol1_12_1TO1_12.java
@@ -86,8 +86,6 @@ public class Protocol1_12_1TO1_12 extends Protocol {
});
}
});
-
-
}
@Override
diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_12_2/MetadataRewriter.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_12_2/MetadataRewriter.java
new file mode 100644
index 000000000..7cc0a487b
--- /dev/null
+++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_12_2/MetadataRewriter.java
@@ -0,0 +1,34 @@
+package us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2;
+
+import us.myles.ViaVersion.api.Via;
+import us.myles.ViaVersion.api.data.UserConnection;
+import us.myles.ViaVersion.api.entities.Entity1_12Types;
+import us.myles.ViaVersion.api.minecraft.metadata.Metadata;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class MetadataRewriter {
+ public static void handleMetadata(int entityId, Entity1_12Types.EntityType type, List metadatas, UserConnection connection) {
+
+ for (Metadata metadata : new ArrayList<>(metadatas)) {
+ try {
+ if (type.is(Entity1_12Types.EntityType.AREA_EFFECT_CLOUD)) {
+ if (metadata.getId() == 10 || metadata.getId() == 11) {
+ // TODO: AreaEffectCloud has lost 2 integers and gained "ef"
+ // Will be implemented when more info is known
+ metadata.setId(13);
+ }
+ }
+ } catch (Exception e) {
+ metadatas.remove(metadata);
+ if (!Via.getConfig().isSuppressMetadataErrors() || Via.getManager().isDebug()) {
+ Via.getPlatform().getLogger().warning("An error occurred with entity metadata handler");
+ Via.getPlatform().getLogger().warning("Metadata: " + metadata);
+ e.printStackTrace();
+ }
+ }
+ }
+
+ }
+}
diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_12_2/ProtocolSnapshotTo1_12_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_12_2/ProtocolSnapshotTo1_12_2.java
index 8a6e2dcef..fa15a4cff 100644
--- a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_12_2/ProtocolSnapshotTo1_12_2.java
+++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_12_2/ProtocolSnapshotTo1_12_2.java
@@ -1,16 +1,178 @@
package us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2;
+import com.google.common.base.Optional;
+import us.myles.ViaVersion.api.PacketWrapper;
import us.myles.ViaVersion.api.data.UserConnection;
+import us.myles.ViaVersion.api.entities.Entity1_12Types;
import us.myles.ViaVersion.api.protocol.Protocol;
+import us.myles.ViaVersion.api.remapper.PacketHandler;
+import us.myles.ViaVersion.api.remapper.PacketRemapper;
+import us.myles.ViaVersion.api.type.Type;
+import us.myles.ViaVersion.api.type.types.version.Types1_12;
+import us.myles.ViaVersion.packets.State;
+import us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.storage.EntityTracker;
// Development of 1.13 support!
public class ProtocolSnapshotTo1_12_2 extends Protocol {
@Override
protected void registerPackets() {
+ // Outgoing packets
+ // Spawn Object
+ registerOutgoing(State.PLAY, 0x00, 0x00, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.VAR_INT); // 0 - Entity id
+ map(Type.UUID); // 1 - UUID
+ map(Type.BYTE); // 2 - Type
+
+ // Track Entity
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+
+ int entityId = wrapper.get(Type.VAR_INT, 0);
+ byte type = wrapper.get(Type.BYTE, 0);
+
+ Entity1_12Types.EntityType entType = Entity1_12Types.getTypeFromId(type, true);
+
+ // Register Type ID
+ wrapper.user().get(EntityTracker.class).addEntity(entityId, entType);
+ }
+ });
+ }
+ });
+
+ // Spawn mob packet
+ registerOutgoing(State.PLAY, 0x03, 0x03, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.VAR_INT); // 0 - Entity ID
+ map(Type.UUID); // 1 - Entity UUID
+ map(Type.VAR_INT); // 2 - Entity Type
+ map(Type.DOUBLE); // 3 - X
+ map(Type.DOUBLE); // 4 - Y
+ map(Type.DOUBLE); // 5 - Z
+ map(Type.BYTE); // 6 - Yaw
+ map(Type.BYTE); // 7 - Pitch
+ map(Type.BYTE); // 8 - Head Pitch
+ map(Type.SHORT); // 9 - Velocity X
+ map(Type.SHORT); // 10 - Velocity Y
+ map(Type.SHORT); // 11 - Velocity Z
+ map(Types1_12.METADATA_LIST); // 12 - Metadata
+
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ int entityId = wrapper.get(Type.VAR_INT, 0);
+ // Change Type :)
+ int type = wrapper.get(Type.VAR_INT, 1);
+
+ Entity1_12Types.EntityType entType = Entity1_12Types.getTypeFromId(type, false);
+ // Register Type ID
+ wrapper.user().get(EntityTracker.class).addEntity(entityId, entType);
+ MetadataRewriter.handleMetadata(entityId, entType, wrapper.get(Types1_12.METADATA_LIST, 0), wrapper.user());
+ }
+ });
+ }
+ });
+
+ registerOutgoing(State.PLAY, 0xF, 0xE);
+ // 0xE Tab complete was removed
+ registerOutgoing(State.PLAY, 0xE, 0xE, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ wrapper.cancel();
+ }
+ });
+ }
+ });
+ registerOutgoing(State.PLAY, 0x10, 0xF);
+ // New packet 0x10, empty packet, possible placeholder for new command system?
+ // Destroy entities
+ registerOutgoing(State.PLAY, 0x32, 0x32, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.VAR_INT_ARRAY); // 0 - Entity IDS
+
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ for (int entity : wrapper.get(Type.VAR_INT_ARRAY, 0))
+ wrapper.user().get(EntityTracker.class).removeEntity(entity);
+ }
+ });
+ }
+ });
+ // Metadata packet
+ registerOutgoing(State.PLAY, 0x3c, 0x3c, new PacketRemapper() {
+ @Override
+ public void registerMap() {
+ map(Type.VAR_INT); // 0 - Entity ID
+ map(Types1_12.METADATA_LIST); // 1 - Metadata list
+ handler(new PacketHandler() {
+ @Override
+ public void handle(PacketWrapper wrapper) throws Exception {
+ int entityId = wrapper.get(Type.VAR_INT, 0);
+
+ Optional type = wrapper.user().get(EntityTracker.class).get(entityId);
+ if (!type.isPresent())
+ return;
+
+ MetadataRewriter.handleMetadata(entityId, type.get(), wrapper.get(Types1_12.METADATA_LIST, 0), wrapper.user());
+ }
+ });
+ }
+ });
+ // 0x49 - New packet, options 0-4 followed by enum / string (possibly new command system?)
+ registerOutgoing(State.PLAY, 0x49, 0x4A);
+ registerOutgoing(State.PLAY, 0x4A, 0x4B);
+ registerOutgoing(State.PLAY, 0x4B, 0x4C);
+ registerOutgoing(State.PLAY, 0x4C, 0x4D);
+ registerOutgoing(State.PLAY, 0x4D, 0x4E);
+ registerOutgoing(State.PLAY, 0x4E, 0x4F);
+ registerOutgoing(State.PLAY, 0x4F, 0x50);
+
+ // Incoming packets
+ registerIncoming(State.PLAY, 0x2, 0x1);
+ // 0x1 Tab complete was removed
+ registerIncoming(State.PLAY, 0x3, 0x2);
+ registerIncoming(State.PLAY, 0x4, 0x3);
+ registerIncoming(State.PLAY, 0x5, 0x4);
+ registerIncoming(State.PLAY, 0x6, 0x5);
+ registerIncoming(State.PLAY, 0x7, 0x6);
+ registerIncoming(State.PLAY, 0x8, 0x7);
+ registerIncoming(State.PLAY, 0x9, 0x8);
+ registerIncoming(State.PLAY, 0xA, 0x9);
+ registerIncoming(State.PLAY, 0xB, 0xA);
+ registerIncoming(State.PLAY, 0xC, 0xB);
+ registerIncoming(State.PLAY, 0xD, 0xC);
+ registerIncoming(State.PLAY, 0xE, 0xD);
+ registerIncoming(State.PLAY, 0xF, 0xE);
+ registerIncoming(State.PLAY, 0x10, 0xF);
+ registerIncoming(State.PLAY, 0x11, 0x10);
+ registerIncoming(State.PLAY, 0x12, 0x11);
+ registerIncoming(State.PLAY, 0x13, 0x12);
+ registerIncoming(State.PLAY, 0x14, 0x13);
+ registerIncoming(State.PLAY, 0x15, 0x14);
+ registerIncoming(State.PLAY, 0x16, 0x15);
+ registerIncoming(State.PLAY, 0x17, 0x16);
+ registerIncoming(State.PLAY, 0x18, 0x17);
+ registerIncoming(State.PLAY, 0x19, 0x18);
+ registerIncoming(State.PLAY, 0x1A, 0x19);
+ registerIncoming(State.PLAY, 0x1B, 0x1A);
+ registerIncoming(State.PLAY, 0x1C, 0x1B);
+ registerIncoming(State.PLAY, 0x1D, 0x1C);
+ registerIncoming(State.PLAY, 0x1E, 0x1D);
+ registerIncoming(State.PLAY, 0x1F, 0x1E);
+ registerIncoming(State.PLAY, 0x20, 0x1F);
+
}
@Override
public void init(UserConnection userConnection) {
-
+ userConnection.put(new EntityTracker(userConnection));
}
}
diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_12_2/storage/EntityTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_12_2/storage/EntityTracker.java
new file mode 100644
index 000000000..524ea80c7
--- /dev/null
+++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocolsnapshotto1_12_2/storage/EntityTracker.java
@@ -0,0 +1,36 @@
+package us.myles.ViaVersion.protocols.protocolsnapshotto1_12_2.storage;
+
+import com.google.common.base.Optional;
+import us.myles.ViaVersion.api.data.StoredObject;
+import us.myles.ViaVersion.api.data.UserConnection;
+import us.myles.ViaVersion.api.entities.Entity1_12Types;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class EntityTracker extends StoredObject {
+ private final Map clientEntityTypes = new ConcurrentHashMap<>();
+
+ public EntityTracker(UserConnection user) {
+ super(user);
+ }
+
+ public void removeEntity(int entityId) {
+ clientEntityTypes.remove(entityId);
+ }
+
+ public void addEntity(int entityId, Entity1_12Types.EntityType type) {
+ clientEntityTypes.put(entityId, type);
+ }
+
+ public boolean has(int entityId) {
+ return clientEntityTypes.containsKey(entityId);
+ }
+
+ public Optional get(int id) {
+ if (!has(id))
+ return Optional.absent();
+ return Optional.of(clientEntityTypes.get(id));
+ }
+
+}
diff --git a/jar/pom.xml b/jar/pom.xml
index 04ad3a60e..90f2ac9c5 100644
--- a/jar/pom.xml
+++ b/jar/pom.xml
@@ -5,7 +5,7 @@
viaversion-parent
us.myles
- 1.4.0-17w43b
+ 1.4.0-17w45a
4.0.0
viaversion-jar
diff --git a/pom.xml b/pom.xml
index db785d8a5..29f8d14fb 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
us.myles
viaversion-parent
- 1.4.0-17w43b
+ 1.4.0-17w45a
pom
viaversion-parent
diff --git a/sponge-legacy/pom.xml b/sponge-legacy/pom.xml
index ac2029173..88bef21fb 100644
--- a/sponge-legacy/pom.xml
+++ b/sponge-legacy/pom.xml
@@ -5,7 +5,7 @@
viaversion-parent
us.myles
- 1.4.0-17w43b
+ 1.4.0-17w45a
4.0.0
diff --git a/sponge/pom.xml b/sponge/pom.xml
index a1dd90e23..cae0506ac 100644
--- a/sponge/pom.xml
+++ b/sponge/pom.xml
@@ -5,7 +5,7 @@
viaversion-parent
us.myles
- 1.4.0-17w43b
+ 1.4.0-17w45a
4.0.0