Iron out some bugs
This commit is contained in:
parent
a9d99390d9
commit
15a898b477
@ -287,12 +287,46 @@ impl Game {
|
|||||||
&& let PeerKind::Server(peer, _) = peer
|
&& let PeerKind::Server(peer, _) = peer
|
||||||
&& let Some(player) = self.find_player_mut(self.self_id.unwrap_or(0))
|
&& let Some(player) = self.find_player_mut(self.self_id.unwrap_or(0))
|
||||||
{
|
{
|
||||||
player.ready = true;
|
player.data.ready = true;
|
||||||
peer.broadcast_reliable(Package::SetReady(player.id(), true));
|
peer.broadcast_reliable(Package::SetReady(player.id(), true));
|
||||||
}
|
}
|
||||||
self.goals.clear();
|
self.goals.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn finish_game(&mut self) {
|
||||||
|
for player in &mut self.players {
|
||||||
|
if let Some(mut character) = player.character.take() {
|
||||||
|
character.queue_free();
|
||||||
|
}
|
||||||
|
player.data.ready = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.run_deferred(|s| {
|
||||||
|
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer
|
||||||
|
&& let PeerKind::Server(peer, _) = peer
|
||||||
|
{
|
||||||
|
for player in &s.players {
|
||||||
|
peer.broadcast_reliable(Package::SetReady(player.id(), false));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if let Some(mut ball) = self.world_ball.take() {
|
||||||
|
ball.queue_free();
|
||||||
|
}
|
||||||
|
self.current_map.take();
|
||||||
|
self.game_started = false;
|
||||||
|
|
||||||
|
self.run_deferred(|s| {
|
||||||
|
if let Some(peer) = &mut NetworkManager::singleton().bind_mut().peer
|
||||||
|
&& let PeerKind::Server(peer, _) = peer
|
||||||
|
{
|
||||||
|
peer.broadcast_reliable(Package::FinishGame);
|
||||||
|
}
|
||||||
|
s.signals().on_game_finished().emit()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
pub fn change_option(&mut self, opt: GameOption, value: GameOptionValue) {
|
pub fn change_option(&mut self, opt: GameOption, value: GameOptionValue) {
|
||||||
self.opts.values.insert(opt, value);
|
self.opts.values.insert(opt, value);
|
||||||
self.run_deferred(move |s| {
|
self.run_deferred(move |s| {
|
||||||
@ -409,8 +443,8 @@ impl Game {
|
|||||||
name: name.unwrap_or(format!("Player {}", id)),
|
name: name.unwrap_or(format!("Player {}", id)),
|
||||||
ping: 0,
|
ping: 0,
|
||||||
team: 0,
|
team: 0,
|
||||||
},
|
|
||||||
ready: false,
|
ready: false,
|
||||||
|
},
|
||||||
character: None,
|
character: None,
|
||||||
});
|
});
|
||||||
self.run_deferred(move |s| s.signals().on_new_player().emit(id));
|
self.run_deferred(move |s| s.signals().on_new_player().emit(id));
|
||||||
@ -483,7 +517,7 @@ impl Game {
|
|||||||
|
|
||||||
pub fn update_player_ready(&mut self, player_id: u16, ready: bool) {
|
pub fn update_player_ready(&mut self, player_id: u16, ready: bool) {
|
||||||
if let Some(player) = self.players.iter_mut().find(|p| p.id() == player_id) {
|
if let Some(player) = self.players.iter_mut().find(|p| p.id() == player_id) {
|
||||||
player.ready = ready;
|
player.data.ready = ready;
|
||||||
}
|
}
|
||||||
self.run_deferred(|s| s.signals().on_players_updated().emit());
|
self.run_deferred(|s| s.signals().on_players_updated().emit());
|
||||||
}
|
}
|
||||||
@ -563,26 +597,13 @@ impl Game {
|
|||||||
peer.broadcast_reliable(Package::Goal(teams));
|
peer.broadcast_reliable(Package::Goal(teams));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
if NetworkManager::singleton().bind().is_host() {
|
||||||
let max_goals = self.goals.values().max().copied().unwrap_or(0);
|
let max_goals = s.goals.values().max().copied().unwrap_or(0);
|
||||||
if max_goals >= 1 {
|
if max_goals >= 1 {
|
||||||
self.finish_game();
|
s.finish_game();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
});
|
||||||
pub fn finish_game(&mut self) {
|
|
||||||
for player in &mut self.players {
|
|
||||||
if let Some(mut character) = player.character.take() {
|
|
||||||
character.queue_free();
|
|
||||||
}
|
|
||||||
player.ready = false;
|
|
||||||
}
|
|
||||||
if let Some(mut ball) = self.world_ball.take() {
|
|
||||||
ball.queue_free();
|
|
||||||
}
|
|
||||||
self.current_map.take();
|
|
||||||
self.game_started = false;
|
|
||||||
self.run_deferred(|s| s.signals().on_game_finished().emit());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn handle_ball_pickup(&mut self, player_id: u16) {
|
pub fn handle_ball_pickup(&mut self, player_id: u16) {
|
||||||
@ -805,7 +826,6 @@ impl Game {
|
|||||||
pub struct Player {
|
pub struct Player {
|
||||||
pub connection_addr: SocketAddr,
|
pub connection_addr: SocketAddr,
|
||||||
pub data: NetPlayer,
|
pub data: NetPlayer,
|
||||||
pub ready: bool,
|
|
||||||
pub character: Option<DynGd<CharacterBody3D, dyn IPlayer + 'static>>,
|
pub character: Option<DynGd<CharacterBody3D, dyn IPlayer + 'static>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -908,6 +928,7 @@ impl Player {
|
|||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct NetPlayer {
|
pub struct NetPlayer {
|
||||||
pub id: u16,
|
pub id: u16,
|
||||||
|
pub ready: bool,
|
||||||
pub name: String,
|
pub name: String,
|
||||||
pub ping: u128,
|
pub ping: u128,
|
||||||
pub team: u8,
|
pub team: u8,
|
||||||
@ -918,7 +939,6 @@ impl From<NetPlayer> for Player {
|
|||||||
Player {
|
Player {
|
||||||
connection_addr: SocketAddr::from(([0, 0, 0, 0], 0)),
|
connection_addr: SocketAddr::from(([0, 0, 0, 0], 0)),
|
||||||
data: value,
|
data: value,
|
||||||
ready: false,
|
|
||||||
character: None,
|
character: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -269,6 +269,9 @@ pub enum Package {
|
|||||||
DespawnBall,
|
DespawnBall,
|
||||||
SwapWeapon(u16, WeaponType),
|
SwapWeapon(u16, WeaponType),
|
||||||
Goal(Vec<u8>),
|
Goal(Vec<u8>),
|
||||||
|
|
||||||
|
// End-of-Game packages
|
||||||
|
FinishGame,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
|
|||||||
@ -176,6 +176,11 @@ impl NetworkManager {
|
|||||||
game.bind_mut().handle_goal(teams);
|
game.bind_mut().handle_goal(teams);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Package::FinishGame => {
|
||||||
|
if let Some(game) = &mut Game::singleton() {
|
||||||
|
game.bind_mut().finish_game();
|
||||||
|
}
|
||||||
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@ -221,7 +221,7 @@ impl LobbyPanel {
|
|||||||
if let PeerKind::Server(_, _) = peer
|
if let PeerKind::Server(_, _) = peer
|
||||||
&& let Some(button) = &mut self.ready_button
|
&& let Some(button) = &mut self.ready_button
|
||||||
{
|
{
|
||||||
let all_ready = game.bind().players.iter().all(|p| p.ready);
|
let all_ready = game.bind().players.iter().all(|p| p.data.ready);
|
||||||
button.set_disabled(!all_ready);
|
button.set_disabled(!all_ready);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -93,7 +93,7 @@ impl LobbyPlayerListing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let Some(ready_label) = &mut self.ready_label {
|
if let Some(ready_label) = &mut self.ready_label {
|
||||||
if player.ready {
|
if player.data.ready {
|
||||||
ready_label.set_text("Ready");
|
ready_label.set_text("Ready");
|
||||||
} else {
|
} else {
|
||||||
ready_label.set_text("Not Ready");
|
ready_label.set_text("Not Ready");
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user