package org.geysermc.connector.network.session; import com.nukkitx.protocol.bedrock.BedrockPacket; import com.nukkitx.protocol.bedrock.BedrockServerSession; import lombok.Getter; import lombok.NonNull; import lombok.RequiredArgsConstructor; import org.geysermc.api.Geyser; import java.net.InetSocketAddress; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; @RequiredArgsConstructor public class UpstreamSession { @Getter private final BedrockServerSession session; private Queue packets = new ConcurrentLinkedQueue<>(); @Getter private boolean frozen = false; private boolean queueCleared = true; public void sendPacket(@NonNull BedrockPacket packet) { if (frozen || !packets.isEmpty()) { packets.add(packet); } else { session.sendPacket(packet); } } public void sendPacketImmediately(@NonNull BedrockPacket packet) { session.sendPacketImmediately(packet); } public void setFrozen(boolean frozen) { if (this.frozen != frozen) { this.frozen = frozen; if (!frozen) { Geyser.getGeneralThreadPool().execute(() -> { BedrockPacket packet; while ((packet = packets.poll()) != null) { session.sendPacket(packet); } }); } } } public void disconnect(String reason) { session.disconnect(reason); } public boolean isClosed() { return session.isClosed(); } public InetSocketAddress getAddress() { return session.getAddress(); } public boolean hasQueue() { return !packets.isEmpty(); } /** * @return true the first time this method is called after the queue is empty.
* This will enable gravity because now the client is ready to explore */ public boolean isQueueCleared() { if (!hasQueue() && queueCleared) { queueCleared = false; return true; } return false; } }