2019-10-02 20:45:29 +00:00
|
|
|
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;
|
2019-10-02 20:45:29 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
2019-10-02 20:45:29 +00:00
|
|
|
}
|