From bce35931102b552573024acfb9bc56278dfe7385 Mon Sep 17 00:00:00 2001 From: creeper123123321 Date: Wed, 23 Jan 2019 17:25:08 -0200 Subject: [PATCH 1/2] Tab delaying (cherry picked from commit 386de52b9db1454e0fcec56ef9bfcd2c3a0f8d4a) --- .../bukkit/platform/BukkitViaConfig.java | 5 ++++ .../bungee/platform/BungeeViaConfig.java | 5 ++++ .../ViaVersion/api/ViaVersionConfig.java | 6 +++++ .../Protocol1_13To1_12_2.java | 26 ++++++++++++++++++- .../storage/TabCompleteTracker.java | 22 +++++----------- .../resources/assets/viaversion/config.yml | 2 ++ .../sponge/platform/SpongeViaConfig.java | 5 ++++ .../velocity/platform/VelocityViaConfig.java | 5 ++++ 8 files changed, 59 insertions(+), 17 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaConfig.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaConfig.java index de078d58b..8a66a7c41 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaConfig.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaConfig.java @@ -244,4 +244,9 @@ public class BukkitViaConfig extends Config implements ViaVersionConfig { public boolean isSnowCollisionFix() { return getBoolean("fix-low-snow-collision", false); } + + @Override + public int get1_13TabCompleteDelay() { + return getInt("1_13-tab-complete-delay", 0); + } } diff --git a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaConfig.java b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaConfig.java index 014bc6ea9..e58044525 100644 --- a/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaConfig.java +++ b/bungee/src/main/java/us/myles/ViaVersion/bungee/platform/BungeeViaConfig.java @@ -297,4 +297,9 @@ public class BungeeViaConfig extends Config implements ViaVersionConfig { public boolean isSnowCollisionFix() { return getBoolean("fix-low-snow-collision", false); } + + @Override + public int get1_13TabCompleteDelay() { + return getInt("1_13-tab-complete-delay", 0); + } } diff --git a/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java b/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java index a228963bd..1cc3ad3e2 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java +++ b/common/src/main/java/us/myles/ViaVersion/api/ViaVersionConfig.java @@ -302,4 +302,10 @@ public interface ViaVersionConfig { * @return True if enabled */ boolean isSnowCollisionFix(); + + /** + * When greater than 0, enables tab complete request delaying by x ticks + * @return the delay in ticks + */ + int get1_13TabCompleteDelay(); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java index 0792f2546..eef8cb93d 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java @@ -852,9 +852,33 @@ public class Protocol1_13To1_12_2 extends Protocol { // Fake the end of the packet create(new ValueCreator() { @Override - public void write(PacketWrapper wrapper) { + public void write(PacketWrapper wrapper) throws Exception { wrapper.write(Type.BOOLEAN, false); wrapper.write(Type.OPTIONAL_POSITION, null); + if (!wrapper.isCancelled() && Via.getConfig().get1_13TabCompleteDelay() > 0) { + TabCompleteTracker tracker = wrapper.user().get(TabCompleteTracker.class); + if (tracker.getLastTabCompleteTask() != null) { + Via.getPlatform().cancelTask(tracker.getLastTabCompleteTask()); + } + wrapper.cancel(); + wrapper.resetReader(); + final PacketWrapper delayedPacket = wrapper.create(0x1); + delayedPacket.write(Type.STRING, wrapper.read(Type.STRING)); + delayedPacket.write(Type.BOOLEAN, false); + delayedPacket.write(Type.OPTIONAL_POSITION, null); + tracker.setLastTabCompleteTask( + Via.getPlatform().runSync(new Runnable() { + @Override + public void run() { + try { + delayedPacket.sendToServer(Protocol1_13To1_12_2.class); + } catch (Exception e) { + e.printStackTrace(); + } + } + }, (long) Via.getConfig().get1_13TabCompleteDelay()) + ); + } } }); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/TabCompleteTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/TabCompleteTracker.java index 4f5d4eaac..24748c718 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/TabCompleteTracker.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/TabCompleteTracker.java @@ -1,29 +1,19 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.storage; +import lombok.Getter; +import lombok.Setter; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.platform.TaskId; +@Getter +@Setter public class TabCompleteTracker extends StoredObject { private int transactionId; private String input; + private TaskId lastTabCompleteTask; public TabCompleteTracker(UserConnection user) { super(user); } - - public int getTransactionId() { - return transactionId; - } - - public void setTransactionId(int transactionId) { - this.transactionId = transactionId; - } - - public String getInput() { - return input; - } - - public void setInput(String input) { - this.input = input; - } } diff --git a/common/src/main/resources/assets/viaversion/config.yml b/common/src/main/resources/assets/viaversion/config.yml index dc005204c..62cb0dc6f 100644 --- a/common/src/main/resources/assets/viaversion/config.yml +++ b/common/src/main/resources/assets/viaversion/config.yml @@ -114,6 +114,8 @@ team-colour-fix: true suppress-1_13-conversion-errors: false # 1.13 introduced new auto complete which can trigger "Kicked for spamming" for servers older than 1.13, the following option will disable it completely. disable-1_13-auto-complete: false +# The following option will delay the tab complete request in x ticks if greater than 0, if other tab-complete is received, the previous is cancelled +1_13-tab-complete-delay: 0 # For 1.13 clients the smallest (1 layer) snow doesn't have collision, this will send these as 2 snowlayers for 1.13+ clients to prevent them bugging through them fix-low-snow-collision: false # diff --git a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaConfig.java b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaConfig.java index d72a9be67..8944f60ec 100644 --- a/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaConfig.java +++ b/sponge/src/main/java/us/myles/ViaVersion/sponge/platform/SpongeViaConfig.java @@ -250,4 +250,9 @@ public class SpongeViaConfig extends Config implements ViaVersionConfig { public boolean isSnowCollisionFix() { return getBoolean("fix-low-snow-collision", false); } + + @Override + public int get1_13TabCompleteDelay() { + return getInt("1_13-tab-complete-delay", 0); + } } diff --git a/velocity/src/main/java/us/myles/ViaVersion/velocity/platform/VelocityViaConfig.java b/velocity/src/main/java/us/myles/ViaVersion/velocity/platform/VelocityViaConfig.java index cc132789f..1a5144fb9 100644 --- a/velocity/src/main/java/us/myles/ViaVersion/velocity/platform/VelocityViaConfig.java +++ b/velocity/src/main/java/us/myles/ViaVersion/velocity/platform/VelocityViaConfig.java @@ -302,4 +302,9 @@ public class VelocityViaConfig extends Config implements ViaVersionConfig { public boolean isSnowCollisionFix() { return getBoolean("fix-low-snow-collision", false); } + + @Override + public int get1_13TabCompleteDelay() { + return getInt("1_13-tab-complete-delay", 0); + } } From 63b743f85b3f90750da35603f515a9478d8791d3 Mon Sep 17 00:00:00 2001 From: creeper123123321 Date: Thu, 7 Feb 2019 14:07:30 -0200 Subject: [PATCH 2/2] Use only one task for tab completing --- .../Protocol1_13To1_12_2.java | 25 ++++--------------- .../TabCompleteThread.java | 19 ++++++++++++++ .../storage/TabCompleteTracker.java | 21 ++++++++++++++-- 3 files changed, 43 insertions(+), 22 deletions(-) create mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/TabCompleteThread.java diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java index eef8cb93d..a90c48b19 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/Protocol1_13To1_12_2.java @@ -857,27 +857,9 @@ public class Protocol1_13To1_12_2 extends Protocol { wrapper.write(Type.OPTIONAL_POSITION, null); if (!wrapper.isCancelled() && Via.getConfig().get1_13TabCompleteDelay() > 0) { TabCompleteTracker tracker = wrapper.user().get(TabCompleteTracker.class); - if (tracker.getLastTabCompleteTask() != null) { - Via.getPlatform().cancelTask(tracker.getLastTabCompleteTask()); - } wrapper.cancel(); - wrapper.resetReader(); - final PacketWrapper delayedPacket = wrapper.create(0x1); - delayedPacket.write(Type.STRING, wrapper.read(Type.STRING)); - delayedPacket.write(Type.BOOLEAN, false); - delayedPacket.write(Type.OPTIONAL_POSITION, null); - tracker.setLastTabCompleteTask( - Via.getPlatform().runSync(new Runnable() { - @Override - public void run() { - try { - delayedPacket.sendToServer(Protocol1_13To1_12_2.class); - } catch (Exception e) { - e.printStackTrace(); - } - } - }, (long) Via.getConfig().get1_13TabCompleteDelay()) - ); + tracker.setTimeToSend(System.currentTimeMillis() + Via.getConfig().get1_13TabCompleteDelay() * 50); + tracker.setLastTabComplete(wrapper.get(Type.STRING, 0)); } } }); @@ -1164,6 +1146,9 @@ public class Protocol1_13To1_12_2 extends Protocol { userConnection.put(new BlockConnectionStorage(userConnection)); } } + if (Via.getConfig().get1_13TabCompleteDelay() > 0) { + Via.getPlatform().runRepeatingSync(new TabCompleteThread(), 1L); + } } @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/TabCompleteThread.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/TabCompleteThread.java new file mode 100644 index 000000000..2f08b6217 --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/TabCompleteThread.java @@ -0,0 +1,19 @@ +package us.myles.ViaVersion.protocols.protocol1_13to1_12_2; + +import us.myles.ViaVersion.api.Via; +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.storage.TabCompleteTracker; + +public class TabCompleteThread implements Runnable { + @Override + public void run() { + for (UserConnection info : Via.getManager().getPortedPlayers().values()) { + if (info.has(ProtocolInfo.class) && info.get(ProtocolInfo.class).getPipeline().contains(Protocol1_13To1_12_2.class)) { + if (info.getChannel().isOpen()) { + info.get(TabCompleteTracker.class).sendPacketToServer(); + } + } + } + } +} diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/TabCompleteTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/TabCompleteTracker.java index 24748c718..775523167 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/TabCompleteTracker.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_13to1_12_2/storage/TabCompleteTracker.java @@ -2,18 +2,35 @@ package us.myles.ViaVersion.protocols.protocol1_13to1_12_2.storage; import lombok.Getter; import lombok.Setter; +import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; -import us.myles.ViaVersion.api.platform.TaskId; +import us.myles.ViaVersion.api.type.Type; +import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.Protocol1_13To1_12_2; @Getter @Setter public class TabCompleteTracker extends StoredObject { private int transactionId; private String input; - private TaskId lastTabCompleteTask; + private String lastTabComplete; + private long timeToSend; public TabCompleteTracker(UserConnection user) { super(user); } + + public void sendPacketToServer() { + if (lastTabComplete == null || timeToSend > System.currentTimeMillis()) return; + PacketWrapper wrapper = new PacketWrapper(0x01, null, getUser()); + wrapper.write(Type.STRING, lastTabComplete); + wrapper.write(Type.BOOLEAN, false); + wrapper.write(Type.OPTIONAL_POSITION, null); + try { + wrapper.sendToServer(Protocol1_13To1_12_2.class); + } catch (Exception e) { + e.printStackTrace(); + } + lastTabComplete = null; + } }