Geyser/connector/src/main/java/org/geysermc/connector/network/session/UpstreamSession.java

76 lines
2.1 KiB
Java
Raw Normal View History

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<BedrockPacket> packets = new ConcurrentLinkedQueue<>();
@Getter private boolean frozen = false;
2019-10-04 22:29:33 +00:00
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();
}
2019-10-04 22:29:33 +00:00
public boolean hasQueue() {
return !packets.isEmpty();
}
/**
* @return true the first time this method is called after the queue is empty.<br>
* This will enable gravity because now the client is ready to explore
*/
public boolean isQueueCleared() {
if (!hasQueue() && queueCleared) {
queueCleared = false;
return true;
}
return false;
}
}