diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java index 254842cf..bccd8375 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java @@ -696,22 +696,34 @@ public class ClientPlaySessionHandler implements MinecraftSessionHandler { return; } - List offers = new ArrayList<>(); - for (Suggestion suggestion : suggestions.getList()) { - String offer = suggestion.getText(); - ComponentHolder tooltip = null; - if (suggestion.getTooltip() instanceof ComponentLike componentLike) { - tooltip = new ComponentHolder(player.getProtocolVersion(), componentLike.asComponent()); - } else if (suggestion.getTooltip() != null) { - tooltip = new ComponentHolder(player.getProtocolVersion(), Component.text(suggestion.getTooltip().getString())); + int startPos = -1; + for (var suggestion : suggestions.getList()) { + if (startPos == -1 || startPos > suggestion.getRange().getStart()) { + startPos = suggestion.getRange().getStart(); } - offers.add(new Offer(offer, tooltip)); } - int startPos = packet.getCommand().lastIndexOf(' ') + 1; + if (startPos > 0) { + List offers = new ArrayList<>(); + for (Suggestion suggestion : suggestions.getList()) { + String offer; + if (suggestion.getRange().getStart() == startPos) { + offer = suggestion.getText(); + } else { + offer = command.substring(startPos, suggestion.getRange().getStart()) + suggestion.getText(); + } + ComponentHolder tooltip = null; + if (suggestion.getTooltip() instanceof ComponentLike componentLike) { + tooltip = new ComponentHolder(player.getProtocolVersion(), componentLike.asComponent()); + } else if (suggestion.getTooltip() != null) { + tooltip = new ComponentHolder(player.getProtocolVersion(), Component.text(suggestion.getTooltip().getString())); + } + offers.add(new Offer(offer, tooltip)); + } + TabCompleteResponsePacket resp = new TabCompleteResponsePacket(); resp.setTransactionId(packet.getTransactionId()); - resp.setStart(startPos); + resp.setStart(startPos + 1); resp.setLength(packet.getCommand().length() - startPos); resp.getOffers().addAll(offers); player.getConnection().write(resp);