From e355a41fe03241a182c9cba7c9d66c3a763d4b95 Mon Sep 17 00:00:00 2001 From: bgkillas Date: Sat, 9 Nov 2024 18:06:59 -0500 Subject: [PATCH] add checkbox to not let more players join --- noita-proxy/src/lib.rs | 4 ++++ noita-proxy/src/net.rs | 24 +++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/noita-proxy/src/lib.rs b/noita-proxy/src/lib.rs index 168f7e9d..2ed216f8 100644 --- a/noita-proxy/src/lib.rs +++ b/noita-proxy/src/lib.rs @@ -1196,6 +1196,10 @@ impl eframe::App for App { if ui.button(tr("netman_show_settings")).clicked() { self.show_settings = true; } + let mut temp = netman.no_more_players.load(Ordering::Relaxed); + if ui.checkbox(&mut temp, "don't let more players join").changed() { + netman.no_more_players.store(temp, Ordering::Relaxed); + } } ui.add_space(15.0); diff --git a/noita-proxy/src/net.rs b/noita-proxy/src/net.rs index 1e0c7ba8..6a9e9241 100644 --- a/noita-proxy/src/net.rs +++ b/noita-proxy/src/net.rs @@ -5,7 +5,7 @@ use proxy_opt::ProxyOpt; use socket2::{Domain, Socket, Type}; use std::fs::{create_dir, remove_dir_all, File}; use std::path::PathBuf; -use std::sync::atomic::AtomicI32; +use std::sync::atomic::{AtomicI32, Ordering}; use std::{ env, fmt::Display, @@ -130,6 +130,7 @@ pub struct NetManager { pub ban_list: Mutex>, pub kick_list: Mutex>, pub no_more_players: AtomicBool, + dont_kick: Mutex>, } impl NetManager { @@ -153,6 +154,7 @@ impl NetManager { ban_list: Default::default(), kick_list: Default::default(), no_more_players: AtomicBool::new(false), + dont_kick: Default::default(), } .into() } @@ -283,6 +285,26 @@ impl NetManager { warn!("Websocket flush not ok: {err}"); } } + let mut dont_kick = self.dont_kick.lock().unwrap(); + if self.no_more_players.load(Ordering::Relaxed) { + if dont_kick.is_empty() { + dont_kick.extend(self.peer.iter_peer_ids()) + } else { + for peer in self.peer.iter_peer_ids() { + if !dont_kick.contains(&peer) { + state.try_ws_write(ws_encode_proxy("leave", peer.as_hex())); + state.world.handle_peer_left(peer); + self.send(peer, &NetMsg::Kick, Reliability::Reliable); + self.broadcast( + &NetMsg::PeerDisconnected { id: peer }, + Reliability::Reliable, + ); + } + } + } + } else { + dont_kick.clear() + } let mut list = self.kick_list.lock().unwrap(); for peer in list.iter() { info!("player kicked: {}", peer);