package net.minecraft.network.protocol; import io.netty.buffer.ByteBuf; import java.util.ArrayList; import java.util.List; import java.util.function.Consumer; import java.util.function.Function; import javax.annotation.Nullable; import net.minecraft.network.ClientboundPacketListener; import net.minecraft.network.ConnectionProtocol; import net.minecraft.network.PacketListener; import net.minecraft.network.ProtocolInfo; import net.minecraft.network.ServerboundPacketListener; import net.minecraft.network.codec.StreamCodec; import net.minecraft.util.Unit; public class ProtocolInfoBuilder { final ConnectionProtocol protocol; final PacketFlow flow; private final List> codecs = new ArrayList<>(); @Nullable private BundlerInfo bundlerInfo; public ProtocolInfoBuilder(ConnectionProtocol p_334175_, PacketFlow p_335651_) { this.protocol = p_334175_; this.flow = p_335651_; } public

> ProtocolInfoBuilder addPacket(PacketType

p_335373_, StreamCodec p_333531_) { this.codecs.add(new ProtocolInfoBuilder.CodecEntry<>(p_335373_, p_333531_, null)); return this; } public

> ProtocolInfoBuilder addPacket( PacketType

p_391568_, StreamCodec p_394417_, CodecModifier p_397994_ ) { this.codecs.add(new ProtocolInfoBuilder.CodecEntry<>(p_391568_, p_394417_, p_397994_)); return this; } public

, D extends BundleDelimiterPacket> ProtocolInfoBuilder withBundlePacket( PacketType

p_336277_, Function>, P> p_331716_, D p_328432_ ) { StreamCodec streamcodec = StreamCodec.unit(p_328432_); PacketType packettype = (PacketType)p_328432_.type(); this.codecs.add(new ProtocolInfoBuilder.CodecEntry<>(packettype, streamcodec, null)); this.bundlerInfo = BundlerInfo.createForPacket(p_336277_, p_331716_, p_328432_); return this; } StreamCodec> buildPacketCodec(Function p_331741_, List> p_329135_, C p_392862_) { ProtocolCodecBuilder protocolcodecbuilder = new ProtocolCodecBuilder<>(this.flow); for (ProtocolInfoBuilder.CodecEntry codecentry : p_329135_) { codecentry.addToBuilder(protocolcodecbuilder, p_331741_, p_392862_); } return protocolcodecbuilder.build(); } private static ProtocolInfo.Details buildDetails( final ConnectionProtocol p_395405_, final PacketFlow p_393141_, final List> p_393857_ ) { return new ProtocolInfo.Details() { @Override public ConnectionProtocol id() { return p_395405_; } @Override public PacketFlow flow() { return p_393141_; } @Override public void listPackets(ProtocolInfo.Details.PacketVisitor p_397253_) { for (int i = 0; i < p_393857_.size(); i++) { ProtocolInfoBuilder.CodecEntry codecentry = (ProtocolInfoBuilder.CodecEntry)p_393857_.get(i); p_397253_.accept(codecentry.type, i); } } }; } public SimpleUnboundProtocol buildUnbound(final C p_392518_) { final List> list = List.copyOf(this.codecs); final BundlerInfo bundlerinfo = this.bundlerInfo; final ProtocolInfo.Details protocolinfo$details = buildDetails(this.protocol, this.flow, list); return new SimpleUnboundProtocol() { @Override public ProtocolInfo bind(Function p_391671_) { return new ProtocolInfoBuilder.Implementation<>( ProtocolInfoBuilder.this.protocol, ProtocolInfoBuilder.this.flow, ProtocolInfoBuilder.this.buildPacketCodec(p_391671_, list, p_392518_), bundlerinfo ); } @Override public ProtocolInfo.Details details() { return protocolinfo$details; } }; } public UnboundProtocol buildUnbound() { final List> list = List.copyOf(this.codecs); final BundlerInfo bundlerinfo = this.bundlerInfo; final ProtocolInfo.Details protocolinfo$details = buildDetails(this.protocol, this.flow, list); return new UnboundProtocol() { @Override public ProtocolInfo bind(Function p_391590_, C p_391890_) { return new ProtocolInfoBuilder.Implementation<>( ProtocolInfoBuilder.this.protocol, ProtocolInfoBuilder.this.flow, ProtocolInfoBuilder.this.buildPacketCodec(p_391590_, list, p_391890_), bundlerinfo ); } @Override public ProtocolInfo.Details details() { return protocolinfo$details; } }; } private static SimpleUnboundProtocol protocol( ConnectionProtocol p_330235_, PacketFlow p_335045_, Consumer> p_329753_ ) { ProtocolInfoBuilder protocolinfobuilder = new ProtocolInfoBuilder<>(p_330235_, p_335045_); p_329753_.accept(protocolinfobuilder); return protocolinfobuilder.buildUnbound(Unit.INSTANCE); } public static SimpleUnboundProtocol serverboundProtocol( ConnectionProtocol p_331618_, Consumer> p_330318_ ) { return protocol(p_331618_, PacketFlow.SERVERBOUND, p_330318_); } public static SimpleUnboundProtocol clientboundProtocol( ConnectionProtocol p_329688_, Consumer> p_332900_ ) { return protocol(p_329688_, PacketFlow.CLIENTBOUND, p_332900_); } private static UnboundProtocol contextProtocol( ConnectionProtocol p_396066_, PacketFlow p_392584_, Consumer> p_393675_ ) { ProtocolInfoBuilder protocolinfobuilder = new ProtocolInfoBuilder<>(p_396066_, p_392584_); p_393675_.accept(protocolinfobuilder); return protocolinfobuilder.buildUnbound(); } public static UnboundProtocol contextServerboundProtocol( ConnectionProtocol p_391713_, Consumer> p_394900_ ) { return contextProtocol(p_391713_, PacketFlow.SERVERBOUND, p_394900_); } public static UnboundProtocol contextClientboundProtocol( ConnectionProtocol p_396941_, Consumer> p_394206_ ) { return contextProtocol(p_396941_, PacketFlow.CLIENTBOUND, p_394206_); } record CodecEntry, B extends ByteBuf, C>( PacketType

type, StreamCodec serializer, @Nullable CodecModifier modifier ) { public void addToBuilder(ProtocolCodecBuilder p_328095_, Function p_333803_, C p_392980_) { StreamCodec streamcodec; if (this.modifier != null) { streamcodec = this.modifier.apply(this.serializer, p_392980_); } else { streamcodec = this.serializer; } StreamCodec streamcodec1 = streamcodec.mapStream(p_333803_); p_328095_.add(this.type, streamcodec1); } } record Implementation( ConnectionProtocol id, PacketFlow flow, StreamCodec> codec, @Nullable BundlerInfo bundlerInfo ) implements ProtocolInfo { @Override public ConnectionProtocol id() { return this.id; } @Override public PacketFlow flow() { return this.flow; } @Override public StreamCodec> codec() { return this.codec; } @Nullable @Override public BundlerInfo bundlerInfo() { return this.bundlerInfo; } } }