package net.minecraft.network; import com.google.common.collect.Queues; import com.mojang.logging.LogUtils; import java.util.Queue; import java.util.concurrent.RejectedExecutionException; import net.minecraft.ReportedException; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.PacketUtils; import org.slf4j.Logger; public class PacketProcessor implements AutoCloseable { private static final Logger LOGGER = LogUtils.getLogger(); private final Queue> packetsToBeHandled = Queues.>newConcurrentLinkedQueue(); private final Thread runningThread; private boolean closed; public PacketProcessor(final Thread runningThread) { this.runningThread = runningThread; } public boolean isSameThread() { return Thread.currentThread() == this.runningThread; } public void scheduleIfPossible(final T listener, final Packet packet) { if (this.closed) { throw new RejectedExecutionException("Server already shutting down"); } else { this.packetsToBeHandled.add(new PacketProcessor.ListenerAndPacket<>(listener, packet)); } } public void processQueuedPackets() { if (!this.closed) { while (!this.packetsToBeHandled.isEmpty()) { ((PacketProcessor.ListenerAndPacket)this.packetsToBeHandled.poll()).handle(); } } } public void close() { this.closed = true; } private record ListenerAndPacket(T listener, Packet packet) { public void handle() { if (this.listener.shouldHandleMessage(this.packet)) { try { this.packet.handle(this.listener); } catch (Exception var3) { if (var3 instanceof ReportedException re && re.getCause() instanceof OutOfMemoryError) { throw PacketUtils.makeReportedException(var3, this.packet, this.listener); } this.listener.onPacketError(this.packet, var3); } } else { PacketProcessor.LOGGER.debug("Ignoring packet due to disconnection: {}", this.packet); } } } }