Fix: Wrong polling logic

This commit is contained in:
Snowiiii 2024-10-19 11:41:25 +02:00
parent f74f77a1f0
commit a9f645488d
2 changed files with 17 additions and 33 deletions

View File

@ -387,7 +387,6 @@ impl Client {
let mut dec = self.dec.lock().await; let mut dec = self.dec.lock().await;
if let Ok(packet) = dec.decode() { if let Ok(packet) = dec.decode() {
if let Some(packet) = packet { if let Some(packet) = packet {
dbg!("a");
self.add_packet(packet).await; self.add_packet(packet).await;
return; return;
} }

View File

@ -22,7 +22,6 @@ use client::Client;
use pumpkin_protocol::client::play::CKeepAlive; use pumpkin_protocol::client::play::CKeepAlive;
use pumpkin_protocol::ConnectionState; use pumpkin_protocol::ConnectionState;
use server::Server; use server::Server;
use std::collections::HashMap;
use std::io::{self}; use std::io::{self};
use std::time::Duration; use std::time::Duration;
@ -128,9 +127,6 @@ async fn main() -> io::Result<()> {
let use_console = ADVANCED_CONFIG.commands.use_console; let use_console = ADVANCED_CONFIG.commands.use_console;
let rcon = ADVANCED_CONFIG.rcon.clone(); let rcon = ADVANCED_CONFIG.rcon.clone();
let players: Arc<tokio::sync::Mutex<HashMap<usize, Arc<Player>>>> =
Arc::new(tokio::sync::Mutex::new(HashMap::new()));
let server = Arc::new(Server::new()); let server = Arc::new(Server::new());
log::info!("Started Server took {}ms", time.elapsed().as_millis()); log::info!("Started Server took {}ms", time.elapsed().as_millis());
log::info!("You now can connect to the server, Listening on {}", addr); log::info!("You now can connect to the server, Listening on {}", addr);
@ -212,28 +208,9 @@ async fn main() -> io::Result<()> {
}); });
} }
let players = players.clone();
let server = server.clone(); let server = server.clone();
tokio::spawn(async move { tokio::spawn(async move {
let mut players = players.lock().await; // Move ownership of players
let server = &server; // Reference to server let server = &server; // Reference to server
// poll Player
if let Some(player) = players.get_mut(&id) {
while !player
.client
.closed
.load(std::sync::atomic::Ordering::Relaxed)
{
dbg!("a");
player.process_packets(server).await;
player.client.poll().await;
}
if let Some(player) = players.remove(&id) {
dbg!("removed player");
player.remove().await;
}
} else {
// Poll current Clients (non players)
while !client.closed.load(std::sync::atomic::Ordering::Relaxed) while !client.closed.load(std::sync::atomic::Ordering::Relaxed)
&& !client && !client
.make_player .make_player
@ -248,9 +225,17 @@ async fn main() -> io::Result<()> {
{ {
let id = client.id; let id = client.id;
let (player, world) = server.add_player(id, client).await; let (player, world) = server.add_player(id, client).await;
players.insert(id, player.clone()); world.spawn_player(&BASIC_CONFIG, player.clone()).await;
world.spawn_player(&BASIC_CONFIG, player).await; // poll Player
while !player
.client
.closed
.load(std::sync::atomic::Ordering::Relaxed)
{
player.process_packets(server).await;
player.client.poll().await;
} }
player.remove().await;
} }
}); });
} }