diff --git a/README.md b/README.md index 8440ced50..50ced6ad7 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ViaVersion 2.1.3 - Spigot, Sponge, BungeeCord, Velocity +# ViaVersion 2.2.0 - Spigot, Sponge, BungeeCord, Velocity [![Build Status](https://travis-ci.com/ViaVersion/ViaVersion.svg?branch=master)](https://travis-ci.com/ViaVersion/ViaVersion) [![Discord](https://img.shields.io/badge/chat-on%20discord-blue.svg)](https://viaversion.com/discord) diff --git a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java index d56877e38..2b36c505c 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java +++ b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java @@ -18,10 +18,7 @@ import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.util.PipelineUtil; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedList; -import java.util.List; +import java.util.*; public class PacketWrapper { public static final int PASSTHROUGH_ID = 1000; @@ -326,13 +323,14 @@ public class PacketWrapper { // Other way if outgoing Collections.reverse(protocols); } - int index = 0; + int index = -1; for (int i = 0; i < protocols.size(); i++) { if (protocols.get(i).getClass().equals(packetProtocol)) { index = skipCurrentPipeline ? (i + 1) : (i); break; } } + if (index == -1) throw new NoSuchElementException(packetProtocol.getCanonicalName()); // Reset reader before we start resetReader(); 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 acc290e29..b52793bcb 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 @@ -77,7 +77,7 @@ public class ProtocolVersion { register(v1_14_2 = new ProtocolVersion(485, "1.14.2")); register(v1_14_3 = new ProtocolVersion(490, "1.14.3")); register(v1_14_4 = new ProtocolVersion(498, "1.14.4")); - register(v1_15 = new ProtocolVersion(571, "1.15")); + register(v1_15 = new ProtocolVersion(573, "1.15")); register(unknown = new ProtocolVersion(-1, "UNKNOWN")); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/FlowerPotHandler.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/FlowerPotHandler.java index c29917572..47fa806f9 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/FlowerPotHandler.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/providers/blockentities/FlowerPotHandler.java @@ -2,70 +2,73 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.providers.blockentiti import com.github.steveice10.opennbt.tag.builtin.CompoundTag; import us.myles.ViaVersion.api.Pair; -import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.providers.BlockEntityProvider; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; public class FlowerPotHandler implements BlockEntityProvider.BlockEntityHandler { - private static final Map, Integer> flowers = new HashMap<>(); - private static final Map, Integer> flowersNumberId = new HashMap<>(); + // Object -> string (id without namespace) or byte (numeric id) + private static final Map, Integer> flowers = new ConcurrentHashMap<>(); static { - register("minecraft:air", (byte) 0, (byte) 0, 5265); - register("minecraft:sapling", (byte) 6, (byte) 0, 5266); - register("minecraft:sapling", (byte) 6, (byte) 1, 5267); - register("minecraft:sapling", (byte) 6, (byte) 2, 5268); - register("minecraft:sapling", (byte) 6, (byte) 3, 5269); - register("minecraft:sapling", (byte) 6, (byte) 4, 5270); - register("minecraft:sapling", (byte) 6, (byte) 5, 5271); - register("minecraft:tallgrass", (byte) 31, (byte) 2, 5272); - register("minecraft:yellow_flower", (byte) 37, (byte) 0, 5273); - register("minecraft:red_flower", (byte) 38, (byte) 0, 5274); - register("minecraft:red_flower", (byte) 38, (byte) 1, 5275); - register("minecraft:red_flower", (byte) 38, (byte) 2, 5276); - register("minecraft:red_flower", (byte) 38, (byte) 3, 5277); - register("minecraft:red_flower", (byte) 38, (byte) 4, 5278); - register("minecraft:red_flower", (byte) 38, (byte) 5, 5279); - register("minecraft:red_flower", (byte) 38, (byte) 6, 5280); - register("minecraft:red_flower", (byte) 38, (byte) 7, 5281); - register("minecraft:red_flower", (byte) 38, (byte) 8, 5282); - register("minecraft:red_mushroom", (byte) 40, (byte) 0, 5283); - register("minecraft:brown_mushroom", (byte) 39, (byte) 0, 5284); - register("minecraft:deadbush", (byte) 32, (byte) 0, 5285); - register("minecraft:cactus", (byte) 81, (byte) 0, 5286); + register("air", (byte) 0, (byte) 0, 5265); + register("sapling", (byte) 6, (byte) 0, 5266); + register("sapling", (byte) 6, (byte) 1, 5267); + register("sapling", (byte) 6, (byte) 2, 5268); + register("sapling", (byte) 6, (byte) 3, 5269); + register("sapling", (byte) 6, (byte) 4, 5270); + register("sapling", (byte) 6, (byte) 5, 5271); + register("tallgrass", (byte) 31, (byte) 2, 5272); + register("yellow_flower", (byte) 37, (byte) 0, 5273); + register("red_flower", (byte) 38, (byte) 0, 5274); + register("red_flower", (byte) 38, (byte) 1, 5275); + register("red_flower", (byte) 38, (byte) 2, 5276); + register("red_flower", (byte) 38, (byte) 3, 5277); + register("red_flower", (byte) 38, (byte) 4, 5278); + register("red_flower", (byte) 38, (byte) 5, 5279); + register("red_flower", (byte) 38, (byte) 6, 5280); + register("red_flower", (byte) 38, (byte) 7, 5281); + register("red_flower", (byte) 38, (byte) 8, 5282); + register("red_mushroom", (byte) 40, (byte) 0, 5283); + register("brown_mushroom", (byte) 39, (byte) 0, 5284); + register("deadbush", (byte) 32, (byte) 0, 5285); + register("cactus", (byte) 81, (byte) 0, 5286); } public static void register(String identifier, byte numbericBlockId, byte blockData, int newId) { flowers.put(new Pair<>(identifier, blockData), newId); - flowersNumberId.put(new Pair<>(numbericBlockId, blockData), newId); + flowers.put(new Pair<>(numbericBlockId, blockData), newId); } @Override public int transform(UserConnection user, CompoundTag tag) { - Object item = tag.get("Item").getValue(); - byte data = ((Number) tag.get("Data").getValue()).byteValue(); + Object item = tag.contains("Item") ? tag.get("Item").getValue() : null; + Object data = tag.contains("Data") ? tag.get("Data").getValue() : null; - Pair pair = item instanceof Number - ? new Pair<>(((Number) item).byteValue(), data) - : new Pair<>((String) item, data); - - // Return air on empty string - if (item instanceof String && ((String) item).isEmpty()) - return 5265; - else if (flowers.containsKey(pair)) { - return flowers.get(pair); - } else if (flowersNumberId.containsKey(pair)) { - return flowersNumberId.get(pair); + // Convert item to String without namespace or to Byte + if (item instanceof String) { + item = ((String) item).replace("minecraft:", ""); + } else if (item instanceof Number) { + item = ((Number) item).byteValue(); } else { - if (!Via.getConfig().isSuppressConversionWarnings() || Via.getManager().isDebug()) { - Via.getPlatform().getLogger().warning("Could not find flowerpot content " + item + " for " + tag); - } + item = (byte) 0; } - return -1; + // Convert data to Byte + if (data instanceof Number) { + data = ((Number) data).byteValue(); + } else { + data = (byte) 0; + } + + Integer flower = flowers.get(new Pair<>(item, (byte) data)); + if (flower != null) return flower; + flower = flowers.get(new Pair<>(item, (byte) 0)); + if (flower != null) return flower; + + return 5265; // Fallback to empty pot } } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/Protocol1_15To1_14_4.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/Protocol1_15To1_14_4.java index 0089f1d32..b3e5f7fbf 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/Protocol1_15To1_14_4.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/Protocol1_15To1_14_4.java @@ -236,9 +236,6 @@ public class Protocol1_15To1_14_4 extends Protocol { registerOutgoing(State.PLAY, 0x58, 0x59); registerOutgoing(State.PLAY, 0x59, 0x5A); - - - registerOutgoing(State.PLAY, 0x5C, 0x08); } public static int getNewSoundId(int id) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/EntityPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/EntityPackets.java index acbb83214..1f517a8ba 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/EntityPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/EntityPackets.java @@ -2,6 +2,7 @@ package us.myles.ViaVersion.protocols.protocol1_15to1_14_4.packets; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.entities.Entity1_15Types; +import us.myles.ViaVersion.api.minecraft.metadata.Metadata; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.PacketHandler; import us.myles.ViaVersion.api.remapper.PacketRemapper; @@ -12,6 +13,7 @@ import us.myles.ViaVersion.protocols.protocol1_15to1_14_4.Protocol1_15To1_14_4; import us.myles.ViaVersion.protocols.protocol1_15to1_14_4.metadata.MetadataRewriter1_15To1_14_4; import us.myles.ViaVersion.protocols.protocol1_15to1_14_4.storage.EntityTracker1_15; +import java.util.List; import java.util.UUID; public class EntityPackets { @@ -73,7 +75,6 @@ public class EntityPackets { map(Type.SHORT); // 9 - Velocity X map(Type.SHORT); // 10 - Velocity Y map(Type.SHORT); // 11 - Velocity Z - map(Types1_14.METADATA_LIST, Type.NOTHING); // removed - probably sent in an update packet? handler(new PacketHandler() { @Override @@ -83,6 +84,13 @@ public class EntityPackets { Entity1_15Types.EntityType entityType = Entity1_15Types.getTypeFromId(getNewEntityId(typeId)); wrapper.user().get(EntityTracker1_15.class).addEntity(entityId, entityType); wrapper.set(Type.VAR_INT, 1, entityType.getId()); + + List metadata = wrapper.read(Types1_14.METADATA_LIST); + metadataRewriter.handleMetadata(entityId, metadata, wrapper.user()); + PacketWrapper metadataUpdate = wrapper.create(0x44); + metadataUpdate.write(Type.VAR_INT, entityId); + metadataUpdate.write(Types1_14.METADATA_LIST, metadata); + metadataUpdate.send(Protocol1_15To1_14_4.class); } }); } @@ -99,15 +107,20 @@ public class EntityPackets { map(Type.DOUBLE); // 4 - Z map(Type.BYTE); // 5 - Yaw map(Type.BYTE); // 6 - Pitch - map(Types1_14.METADATA_LIST, Type.NOTHING); // removed - probably sent in an update packet? handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception { int entityId = wrapper.get(Type.VAR_INT, 0); - Entity1_15Types.EntityType entityType = Entity1_15Types.EntityType.PLAYER; wrapper.user().get(EntityTracker1_15.class).addEntity(entityId, entityType); + + List metadata = wrapper.read(Types1_14.METADATA_LIST); + metadataRewriter.handleMetadata(entityId, metadata, wrapper.user()); + PacketWrapper metadataUpdate = wrapper.create(0x44); + metadataUpdate.write(Type.VAR_INT, entityId); + metadataUpdate.write(Types1_14.METADATA_LIST, metadata); + metadataUpdate.send(Protocol1_15To1_14_4.class); } }); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/InventoryPackets.java index 925d0699d..b05901268 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/InventoryPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/InventoryPackets.java @@ -48,6 +48,7 @@ public class InventoryPackets { wrapper.passthrough(Type.INT); wrapper.passthrough(Type.INT); wrapper.passthrough(Type.FLOAT); + wrapper.passthrough(Type.INT); } wrapper.passthrough(Type.VAR_INT); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/WorldPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/WorldPackets.java index 081ca09d7..77cd2cf22 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/WorldPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_15to1_14_4/packets/WorldPackets.java @@ -9,7 +9,6 @@ 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.packets.State; -import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.packets.InventoryPackets; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.types.Chunk1_14Type; import us.myles.ViaVersion.protocols.protocol1_15to1_14_4.Protocol1_15To1_14_4; import us.myles.ViaVersion.protocols.protocol1_15to1_14_4.types.Chunk1_15Type; @@ -18,6 +17,22 @@ import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; public class WorldPackets { public static void register(Protocol protocol) { + // Acknowledge player digging + protocol.registerOutgoing(State.PLAY, 0x5C, 0x08, new PacketRemapper() { + @Override + public void registerMap() { + map(Type.POSITION1_14); + map(Type.VAR_INT); + handler(new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { + int blockState = wrapper.get(Type.VAR_INT, 0); + wrapper.set(Type.VAR_INT, 0, Protocol1_15To1_14_4.getNewBlockStateId(blockState)); + } + }); + } + }); + // Block Action protocol.registerOutgoing(State.PLAY, 0x0A, 0x0B, new PacketRemapper() { @Override