Fix player creation for 3 players

This commit is contained in:
Sofia 2026-07-17 20:32:43 +03:00
parent 6ffdd201a7
commit 936de8fd0b
3 changed files with 55 additions and 13 deletions

View File

@ -82,9 +82,14 @@ impl Game {
self.self_id = Some(id); self.self_id = Some(id);
} }
pub fn new_player(&mut self, addr: SocketAddr, name: String) -> u16 { pub fn new_player(&mut self, addr: SocketAddr, name: String, id: Option<u16>) -> u16 {
let id = if let Some(id) = id {
id
} else {
let id = self.player_counter; let id = self.player_counter;
self.player_counter += 1; self.player_counter += 1;
id
};
self.players.push(Player { self.players.push(Player {
id, id,
connection_addr: addr, connection_addr: addr,
@ -106,7 +111,7 @@ impl Game {
self.players.iter().find(|p| p.connection_addr == *addr) self.players.iter().find(|p| p.connection_addr == *addr)
} }
pub fn get_player(&self, player_id: u16) -> Option<&Player> { pub fn find_player(&self, player_id: u16) -> Option<&Player> {
self.players.iter().find(|p| p.id == player_id) self.players.iter().find(|p| p.id == player_id)
} }

View File

@ -170,6 +170,26 @@ impl INode for NetworkManager {
} }
} }
} }
Package::NewPlayer(player) => {
if let Some(game) = &mut Game::singleton() {
if player.id != game.bind().self_id.unwrap_or(u16::MAX)
{
game.bind_mut().new_player(
SocketAddr::from(([0, 0, 0, 0], 0)),
player.name,
Some(player.id),
);
}
}
}
Package::PlayerLeft(player) => {
if let Some(game) = &mut Game::singleton() {
if player.id != game.bind().self_id.unwrap_or(u16::MAX)
{
game.bind_mut().remove_player(player.id);
}
}
}
_ => {} _ => {}
}, },
} }
@ -191,13 +211,23 @@ impl INode for NetworkManager {
); );
if let Some(game) = &mut Game::singleton() { if let Some(game) = &mut Game::singleton() {
let self_id = game let self_id = game.bind_mut().new_player(
.bind_mut() connection.address,
.new_player(connection.address, String::new()); String::new(),
None,
);
let mut sent_players = game.bind().players.clone();
for player in &mut sent_players {
player.connection_addr =
SocketAddr::from(([0, 0, 0, 0], 0))
}
peer.send_reliable( peer.send_reliable(
&connection.address, &connection.address,
Package::Players(game.bind().players.clone(), self_id), Package::Players(sent_players, self_id),
); );
peer.broadcast_reliable(Package::NewPlayer(
game.bind().find_player(self_id).unwrap().clone(),
));
} }
} }
teanet::PeerMessage::Disconnected(connection, connection_error) => { teanet::PeerMessage::Disconnected(connection, connection_error) => {
@ -217,6 +247,9 @@ impl INode for NetworkManager {
.find_player_by_addr(&connection.address) .find_player_by_addr(&connection.address)
.map(|p| p.id); .map(|p| p.id);
if let Some(player_id) = player_id { if let Some(player_id) = player_id {
peer.broadcast_reliable(Package::PlayerLeft(
game.bind().find_player(player_id).unwrap().clone(),
));
game.bind_mut().remove_player(player_id); game.bind_mut().remove_player(player_id);
} }
} }
@ -279,9 +312,11 @@ impl NetworkManager {
self.swap_to_lobby(true); self.swap_to_lobby(true);
if let Some(game) = &mut Game::singleton() { if let Some(game) = &mut Game::singleton() {
let id = game let id = game.bind_mut().new_player(
.bind_mut() SocketAddr::from(([0, 0, 0, 0], 0)),
.new_player(SocketAddr::from(([0, 0, 0, 0], 0)), "Host".to_owned()); "Host".to_owned(),
None,
);
game.bind_mut().set_self(id); game.bind_mut().set_self(id);
} }
} }
@ -354,6 +389,8 @@ pub enum Package {
SetNick(u16, String), SetNick(u16, String),
SetSelfNick(String), SetSelfNick(String),
UpdatePings(HashMap<u16, u128>), UpdatePings(HashMap<u16, u128>),
NewPlayer(Player),
PlayerLeft(Player),
} }
pub enum PeerKind { pub enum PeerKind {

View File

@ -25,10 +25,10 @@ impl PlayerListing {
pub fn update(&mut self) { pub fn update(&mut self) {
if let Some(player_id) = &self.player_id if let Some(player_id) = &self.player_id
&& let Some(game) = Game::singleton() && let Some(game) = Game::singleton()
&& let Some(player) = game.bind().get_player(*player_id) && let Some(player) = game.bind().find_player(*player_id)
{ {
if let Some(player_label) = &mut self.name_label { if let Some(player_label) = &mut self.name_label {
player_label.set_text(&player.name); player_label.set_text(&format!("{} ({})", player.name, player.connection_addr));
} }
if let Some(ping_label) = &mut self.ping_label { if let Some(ping_label) = &mut self.ping_label {