diff --git a/src/meexprox/event.rs b/src/meexprox/event.rs index f497fdc..bdecee7 100644 --- a/src/meexprox/event.rs +++ b/src/meexprox/event.rs @@ -101,6 +101,29 @@ impl ProxyEvent { (status, cancel.load(Ordering::Relaxed)) } + pub fn player_connecting_ip( + meexprox: MeexProxMutex, + player: PlayerMutex, + ip: String, + ) -> (String, bool) { + let ProxyEvent::PlayerConnectingIPEvent { + ip, + player: _, + cancel, + } = MeexProx::trigger_event( + meexprox, + ProxyEvent::PlayerConnectingIPEvent { + ip: ip.clone(), + player, + cancel: AtomicBool::from(false), + }, + ) + else { + return (ip, false); + }; + (ip, cancel.load(Ordering::Relaxed)) + } + pub fn player_connecting_server( meexprox: MeexProxMutex, player: PlayerMutex, diff --git a/src/meexprox/meexprox.rs b/src/meexprox/meexprox.rs index 3259f6f..28aaefd 100644 --- a/src/meexprox/meexprox.rs +++ b/src/meexprox/meexprox.rs @@ -1,6 +1,6 @@ use super::{EventListener, PlayerForwarding, ProxyConfig, ProxyError, ProxyEvent, ProxyServer}; use derivative::Derivative; -use log::info; +use log::{debug, info}; use rust_mc_proto::{ DataBufferReader, DataBufferWriter, MinecraftConnection, Packet, ProtocolError, Zigzag, }; @@ -107,6 +107,14 @@ impl ProxyPlayer { server_address: &str, server_port: u16, ) -> Result<(), Box> { + let (ip, cancel) = + ProxyEvent::player_connecting_ip(meexprox.clone(), this.clone(), ip.to_string()); + let ip = &ip; + + if cancel { + return Ok(()); + } + this.lock() .unwrap() .connection_id @@ -141,6 +149,13 @@ impl ProxyPlayer { server_address: &str, server_port: u16, ) -> Result<(), Box> { + let (server, cancel) = + ProxyEvent::player_connecting_server(meexprox.clone(), this.clone(), server); + + if cancel { + return Ok(()); + } + this.lock() .unwrap() .connection_id @@ -182,14 +197,21 @@ impl ProxyPlayer { .fetch_add(1, Ordering::Relaxed); this.lock().unwrap().server_conn.close(); - this.lock().unwrap().server_conn = - MinecraftConnection::connect(this.lock().unwrap().server().unwrap().host())?; + + let server_host = this.lock().unwrap().server().unwrap().host().to_string(); + println!("connect"); + this.lock().unwrap().server_conn = MinecraftConnection::connect(&server_host)?; + println!("connected"); thread::spawn({ - let player_forwarding = meexprox.lock().unwrap().config.player_forwarding().clone(); + println!("connecting1"); + let player_forwarding = meexprox.lock().unwrap().config.player_forwarding().clone(); // deadlock here + println!("connecting2"); let server_address = server_address.to_string(); + println!("connecting3"); move || { + println!("connecting4"); let _ = ProxyPlayer::connect( this, meexprox, @@ -561,6 +583,15 @@ impl MeexProx { Arc::new(AtomicUsize::new(0)), ))); + let (server, cancel) = + ProxyEvent::player_connecting_server(this.clone(), player.clone(), server.clone()); + + if cancel { + return Ok(()); + } + + player.lock().unwrap().server = Some(server); + this.lock().unwrap().players.push(player.clone()); let mut login_start = client_conn.read_packet()?;