minecraft-src/net/minecraft/network/protocol/game/ClientboundCommandSuggestionsPacket.java
2025-07-04 01:41:11 +03:00

76 lines
2.8 KiB
Java

package net.minecraft.network.protocol.game;
import com.mojang.brigadier.Message;
import com.mojang.brigadier.context.StringRange;
import com.mojang.brigadier.suggestion.Suggestion;
import com.mojang.brigadier.suggestion.Suggestions;
import java.util.List;
import java.util.Optional;
import net.minecraft.network.RegistryFriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.ComponentSerialization;
import net.minecraft.network.chat.ComponentUtils;
import net.minecraft.network.codec.ByteBufCodecs;
import net.minecraft.network.codec.StreamCodec;
import net.minecraft.network.protocol.Packet;
import net.minecraft.network.protocol.PacketType;
public record ClientboundCommandSuggestionsPacket(int id, int start, int length, List<ClientboundCommandSuggestionsPacket.Entry> suggestions)
implements Packet<ClientGamePacketListener> {
public static final StreamCodec<RegistryFriendlyByteBuf, ClientboundCommandSuggestionsPacket> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.VAR_INT,
ClientboundCommandSuggestionsPacket::id,
ByteBufCodecs.VAR_INT,
ClientboundCommandSuggestionsPacket::start,
ByteBufCodecs.VAR_INT,
ClientboundCommandSuggestionsPacket::length,
ClientboundCommandSuggestionsPacket.Entry.STREAM_CODEC.apply(ByteBufCodecs.list()),
ClientboundCommandSuggestionsPacket::suggestions,
ClientboundCommandSuggestionsPacket::new
);
public ClientboundCommandSuggestionsPacket(int id, Suggestions suggestions) {
this(
id,
suggestions.getRange().getStart(),
suggestions.getRange().getLength(),
suggestions.getList()
.stream()
.map(
suggestion -> new ClientboundCommandSuggestionsPacket.Entry(
suggestion.getText(), Optional.ofNullable(suggestion.getTooltip()).map(ComponentUtils::fromMessage)
)
)
.toList()
);
}
@Override
public PacketType<ClientboundCommandSuggestionsPacket> type() {
return GamePacketTypes.CLIENTBOUND_COMMAND_SUGGESTIONS;
}
/**
* Passes this Packet on to the NetHandler for processing.
*/
public void handle(ClientGamePacketListener handler) {
handler.handleCommandSuggestions(this);
}
public Suggestions toSuggestions() {
StringRange stringRange = StringRange.between(this.start, this.start + this.length);
return new Suggestions(
stringRange, this.suggestions.stream().map(entry -> new Suggestion(stringRange, entry.text(), (Message)entry.tooltip().orElse(null))).toList()
);
}
public record Entry(String text, Optional<Component> tooltip) {
public static final StreamCodec<RegistryFriendlyByteBuf, ClientboundCommandSuggestionsPacket.Entry> STREAM_CODEC = StreamCodec.composite(
ByteBufCodecs.STRING_UTF8,
ClientboundCommandSuggestionsPacket.Entry::text,
ComponentSerialization.TRUSTED_OPTIONAL_STREAM_CODEC,
ClientboundCommandSuggestionsPacket.Entry::tooltip,
ClientboundCommandSuggestionsPacket.Entry::new
);
}
}