From 304f9b34fd597347d51c96b0fdd00e88d0488946 Mon Sep 17 00:00:00 2001 From: Matsv Date: Tue, 15 Nov 2016 18:10:14 +0100 Subject: [PATCH] Send empty metadata flags on server switch to prevent an Elytra glitch on 1.8 fixes #555 --- .../bungee/handlers/BungeeServerHandler.java | 3 +- .../bungee/listeners/ElytraPatch.java | 45 +++++++++++++++++++ .../bungee/platform/BungeeViaLoader.java | 2 + 3 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 bungee/src/main/java/us/myles/ViaVersion/bungee/listeners/ElytraPatch.java diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeServerHandler.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeServerHandler.java index 88d5ba08e..7e77b9b6e 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeServerHandler.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/handlers/BungeeServerHandler.java @@ -5,6 +5,7 @@ import net.md_5.bungee.api.event.ServerConnectEvent; import net.md_5.bungee.api.event.ServerConnectedEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; import us.myles.ViaVersion.api.Pair; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; @@ -67,7 +68,7 @@ public class BungeeServerHandler implements Listener { } } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void onServerConnected(ServerConnectedEvent e) { try { checkServerChange(e, Via.getManager().getConnection(e.getPlayer().getUniqueId())); diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/listeners/ElytraPatch.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/listeners/ElytraPatch.java new file mode 100644 index 000000000..68e5583ce --- /dev/null +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/listeners/ElytraPatch.java @@ -0,0 +1,45 @@ +package us.myles.ViaVersion.bungee.listeners; + +import net.md_5.bungee.api.event.ServerConnectedEvent; +import net.md_5.bungee.api.plugin.Listener; +import net.md_5.bungee.event.EventHandler; +import net.md_5.bungee.event.EventPriority; +import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.minecraft.metadata.Metadata; +import us.myles.ViaVersion.api.minecraft.metadata.types.MetaType1_9; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.api.type.types.version.Types1_9; +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.storage.EntityTracker; + +import java.util.Collections; + +/* + * This patches https://github.com/MylesIsCool/ViaVersion/issues/555 + */ +public class ElytraPatch implements Listener { + + @EventHandler(priority = EventPriority.HIGH) + public void onServerConnected(ServerConnectedEvent event) { + UserConnection user = Via.getManager().getConnection(event.getPlayer().getUniqueId()); + if (user == null) return; + + try { + if (user.get(ProtocolInfo.class).getPipeline().contains(Protocol1_9TO1_8.class)) { + int entityId = user.get(EntityTracker.class).getProvidedEntityId(); + + PacketWrapper wrapper = new PacketWrapper(0x39, null, user); + + wrapper.write(Type.VAR_INT, entityId); + wrapper.write(Types1_9.METADATA_LIST, Collections.singletonList(new Metadata(0, MetaType1_9.Byte, (byte) 0))); + + wrapper.send(Protocol1_9TO1_8.class); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java index e89cd22bf..e721f3eb2 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaLoader.java @@ -6,6 +6,7 @@ import us.myles.ViaVersion.BungeePlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; import us.myles.ViaVersion.bungee.handlers.BungeeServerHandler; +import us.myles.ViaVersion.bungee.listeners.ElytraPatch; import us.myles.ViaVersion.bungee.listeners.MainHandPatch; import us.myles.ViaVersion.bungee.listeners.UpdateListener; import us.myles.ViaVersion.bungee.providers.BungeeEntityIdProvider; @@ -29,6 +30,7 @@ public class BungeeViaLoader implements ViaPlatformLoader { ProxyServer.getInstance().getPluginManager().registerListener(plugin, new UpdateListener()); ProxyServer.getInstance().getPluginManager().registerListener(plugin, new BungeeServerHandler()); ProxyServer.getInstance().getPluginManager().registerListener(plugin, new MainHandPatch()); + ProxyServer.getInstance().getPluginManager().registerListener(plugin, new ElytraPatch()); // Providers Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BungeeMovementTransmitter());