diff --git a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java index 4d2bb6559..a8ebd365d 100644 --- a/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java +++ b/src/main/java/us/myles/ViaVersion/ViaVersionPlugin.java @@ -423,7 +423,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI, ViaVe } public boolean isUnknownEntitiesSuppressed() { - return getConfig().getBoolean("suppress-entityid-errors", false); + return false; } public double getHologramYOffset() { @@ -431,7 +431,7 @@ public class ViaVersionPlugin extends JavaPlugin implements ViaVersionAPI, ViaVe } public boolean isBlockBreakPatch() { - return getConfig().getBoolean("block-break-patch", true); + return false; } @Override diff --git a/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java b/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java index 726673793..46d6271b9 100644 --- a/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java +++ b/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java @@ -78,6 +78,7 @@ public interface ViaVersionConfig { * * @return true if boss bar patching is enabled */ + @Deprecated boolean isUnknownEntitiesSuppressed(); /** @@ -99,6 +100,7 @@ public interface ViaVersionConfig { * * @return true if it is enabled. */ + @Deprecated boolean isBlockBreakPatch(); /** diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java index 9dd041fb0..0fd0b03eb 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/EntityPackets.java @@ -184,9 +184,10 @@ public class EntityPackets { EntityTracker tracker = wrapper.user().get(EntityTracker.class); if (tracker.getClientEntityTypes().containsKey(entityID)) { MetadataRewriter.transform(tracker.getClientEntityTypes().get(entityID), metadataList); - } else if (!ViaVersion.getConfig().isUnknownEntitiesSuppressed() || ViaVersion.getInstance().isDebug()) { - System.out.println("Unable to find entity for metadata, entity ID: " + entityID); - metadataList.clear(); + } else { + // Buffer + tracker.addMetadataToBuffer(entityID, metadataList); + wrapper.cancel(); } } }); @@ -207,8 +208,9 @@ public class EntityPackets { @Override public void handle(PacketWrapper wrapper) throws Exception { List metadataList = wrapper.get(Protocol1_9TO1_8.METADATA_LIST, 0); - if (metadataList.size() == 0) + if (metadataList.size() == 0) { wrapper.cancel(); + } } }); } @@ -243,9 +245,6 @@ public class EntityPackets { handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception { -// int id = wrapper.read(Type.VAR_INT); -// CompoundTag tag = wrapper.read(Type.NBT); -// System.out.println(id + " - " + tag); wrapper.cancel(); } }); diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java index 0ccfff9b9..8ff3d4a35 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/packets/SpawnPackets.java @@ -55,6 +55,7 @@ public class SpawnPackets { int typeID = wrapper.get(Type.BYTE, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); tracker.getClientEntityTypes().put(entityID, EntityUtil.getTypeFromID(typeID, true)); + tracker.sendMetadataBuffer(entityID); } }); @@ -129,6 +130,7 @@ public class SpawnPackets { int entityID = wrapper.get(Type.VAR_INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); tracker.getClientEntityTypes().put(entityID, EntityType.EXPERIENCE_ORB); + tracker.sendMetadataBuffer(entityID); } }); @@ -154,6 +156,7 @@ public class SpawnPackets { int entityID = wrapper.get(Type.VAR_INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); tracker.getClientEntityTypes().put(entityID, EntityType.LIGHTNING); + tracker.sendMetadataBuffer(entityID); } }); @@ -187,6 +190,7 @@ public class SpawnPackets { int typeID = wrapper.get(Type.UNSIGNED_BYTE, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); tracker.getClientEntityTypes().put(entityID, EntityUtil.getTypeFromID(typeID, false)); + tracker.sendMetadataBuffer(entityID); } }); @@ -243,6 +247,7 @@ public class SpawnPackets { int entityID = wrapper.get(Type.VAR_INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); tracker.getClientEntityTypes().put(entityID, EntityType.PAINTING); + tracker.sendMetadataBuffer(entityID); } }); @@ -276,6 +281,7 @@ public class SpawnPackets { int entityID = wrapper.get(Type.VAR_INT, 0); EntityTracker tracker = wrapper.user().get(EntityTracker.class); tracker.getClientEntityTypes().put(entityID, EntityType.PLAYER); + tracker.sendMetadataBuffer(entityID); } }); diff --git a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java index bf5a6c28e..a53cf33d0 100644 --- a/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java +++ b/src/main/java/us/myles/ViaVersion/protocols/protocol1_9to1_8/storage/EntityTracker.java @@ -21,7 +21,9 @@ import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.minecraft.metadata.Metadata; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.Protocol1_9TO1_8; import us.myles.ViaVersion.protocols.protocol1_9to1_8.chat.GameMode; +import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.MetadataRewriter; import us.myles.ViaVersion.protocols.protocol1_9to1_8.metadata.NewType; import java.util.*; @@ -32,6 +34,7 @@ import java.util.concurrent.TimeUnit; public class EntityTracker extends StoredObject { private final Map uuidMap = new ConcurrentHashMap<>(); private final Map clientEntityTypes = new ConcurrentHashMap<>(); + private final Map> metadataBuffer = new ConcurrentHashMap<>(); private final Map vehicleMap = new ConcurrentHashMap<>(); private final Map bossBarMap = new ConcurrentHashMap<>(); private final Set validBlocking = Sets.newConcurrentHashSet(); @@ -87,6 +90,7 @@ public class EntityTracker extends StoredObject { uuidMap.remove(entityID); validBlocking.remove(entityID); knownHolograms.remove(entityID); + metadataBuffer.remove(entityID); BossBar bar = bossBarMap.remove(entityID); if (bar != null) { @@ -113,7 +117,9 @@ public class EntityTracker extends StoredObject { } public void handleMetadata(int entityID, List metadataList) { - if (!clientEntityTypes.containsKey(entityID)) return; + if (!clientEntityTypes.containsKey(entityID)) { + return; + } EntityType type = clientEntityTypes.get(entityID); for (Metadata metadata : new ArrayList<>(metadataList)) { @@ -251,4 +257,30 @@ public class EntityTracker extends StoredObject { e.printStackTrace(); } } + + public void addMetadataToBuffer(int entityID, List metadataList) { + if (metadataBuffer.containsKey(entityID)) { + metadataBuffer.get(entityID).addAll(metadataList); + } else { + metadataBuffer.put(entityID, metadataList); + } + } + + public void sendMetadataBuffer(int entityID) { + if (metadataBuffer.containsKey(entityID)) { + PacketWrapper wrapper = new PacketWrapper(0x39, null, getUser()); + wrapper.write(Type.VAR_INT, entityID); + wrapper.write(Protocol1_9TO1_8.METADATA_LIST, metadataBuffer.get(entityID)); + MetadataRewriter.transform(getClientEntityTypes().get(entityID), metadataBuffer.get(entityID)); + handleMetadata(entityID, metadataBuffer.get(entityID)); + if (metadataBuffer.get(entityID).size() > 0) { + try { + wrapper.send(); + } catch (Exception e) { + e.printStackTrace(); + } + } + metadataBuffer.remove(entityID); + } + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index ebde21677..64313c2b4 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -67,11 +67,6 @@ bossbar-anti-flicker: false use-new-effect-indicator: true # Show the new death messages for 1.9 on the death screen use-new-deathmessages: false -# This will suppress the following error: 'Unable to get entity for ID: xxxx' -# This error message means one of you plugins is sending bad packets! -suppress-entityid-errors: false -# Our patch for block breaking issue, if you have issues with block updates then disable this. -block-break-patch: true # Should we cache our items, this will prevent server from being lagged out, however the cost is a constant task caching items item-cache: true # Patch the Anti xray to work on 1.9 (If your server is 1.8) This can cost more performance, so disable it if you don't use it.