61 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.network.protocol;
 | |
| 
 | |
| import java.util.ArrayList;
 | |
| import java.util.List;
 | |
| import java.util.function.Consumer;
 | |
| import java.util.function.Function;
 | |
| import net.minecraft.network.PacketListener;
 | |
| import org.jetbrains.annotations.Nullable;
 | |
| 
 | |
| public interface BundlerInfo {
 | |
| 	int BUNDLE_SIZE_LIMIT = 4096;
 | |
| 
 | |
| 	static <T extends PacketListener, P extends BundlePacket<? super T>> BundlerInfo createForPacket(
 | |
| 		PacketType<P> type, Function<Iterable<Packet<? super T>>, P> bundler, BundleDelimiterPacket<? super T> packet
 | |
| 	) {
 | |
| 		return new BundlerInfo() {
 | |
| 			@Override
 | |
| 			public void unbundlePacket(Packet<?> packet, Consumer<Packet<?>> consumer) {
 | |
| 				if (packet.type() == type) {
 | |
| 					P bundlePacket = (P)packet;
 | |
| 					consumer.accept(packet);
 | |
| 					bundlePacket.subPackets().forEach(consumer);
 | |
| 					consumer.accept(packet);
 | |
| 				} else {
 | |
| 					consumer.accept(packet);
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			@Nullable
 | |
| 			@Override
 | |
| 			public BundlerInfo.Bundler startPacketBundling(Packet<?> packet) {
 | |
| 				return packet == packet ? new BundlerInfo.Bundler() {
 | |
| 					private final List<Packet<? super T>> bundlePackets = new ArrayList();
 | |
| 
 | |
| 					@Nullable
 | |
| 					@Override
 | |
| 					public Packet<?> addPacket(Packet<?> packet) {
 | |
| 						if (packet == packet) {
 | |
| 							return (Packet<?>)bundler.apply(this.bundlePackets);
 | |
| 						} else if (this.bundlePackets.size() >= 4096) {
 | |
| 							throw new IllegalStateException("Too many packets in a bundle");
 | |
| 						} else {
 | |
| 							this.bundlePackets.add(packet);
 | |
| 							return null;
 | |
| 						}
 | |
| 					}
 | |
| 				} : null;
 | |
| 			}
 | |
| 		};
 | |
| 	}
 | |
| 
 | |
| 	void unbundlePacket(Packet<?> packet, Consumer<Packet<?>> consumer);
 | |
| 
 | |
| 	@Nullable
 | |
| 	BundlerInfo.Bundler startPacketBundling(Packet<?> packet);
 | |
| 
 | |
| 	public interface Bundler {
 | |
| 		@Nullable
 | |
| 		Packet<?> addPacket(Packet<?> packet);
 | |
| 	}
 | |
| }
 |