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 55e903013..5c70ba4de 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 @@ -851,9 +851,15 @@ 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); + wrapper.cancel(); + tracker.setTimeToSend(System.currentTimeMillis() + Via.getConfig().get1_13TabCompleteDelay() * 50); + tracker.setLastTabComplete(wrapper.get(Type.STRING, 0)); + } } }); } @@ -1139,6 +1145,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 4f5d4eaac..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 @@ -1,29 +1,36 @@ 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.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 String lastTabComplete; + private long timeToSend; 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; + 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; } } 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); + } }