Skip to content

Commit 60ca263

Browse files
authored
fix: fix player selection in online play. (#905)
Fix a bug preventing you from switching your fish without first selecting one and then pressing back.
1 parent 7601264 commit 60ca263

2 files changed

Lines changed: 98 additions & 92 deletions

File tree

assets/locales/en-US/player-select.ftl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ pick-a-fish = Pick a Fish
55
66
player-select-ready = Ready!
77
player-select-title = Player Select
8-
player-select-unready = Pres { $button } to unready
8+
player-select-unready = Press { $button } to unready
99
1010
press-button-to-join = Press { $button } to Join
1111
press-button-to-lock-in = Press { $button } to Lock In

src/ui/main_menu/player_select.rs

Lines changed: 97 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -354,104 +354,106 @@ fn player_select_panel(
354354
.map(|s| *controls.get(s).unwrap())
355355
.unwrap_or_default();
356356

357-
if player_control.menu_confirm_just_pressed {
358-
slot.confirmed = true;
359-
360-
#[cfg(not(target_arch = "wasm32"))]
361-
if let Some(socket) = network_socket.as_ref() {
362-
socket.send_reliable(
363-
SocketTarget::All,
364-
&postcard::to_allocvec(&PlayerSelectMessage::ConfirmSelection(slot.confirmed))
365-
.unwrap(),
366-
);
367-
}
368-
} else if player_control.menu_back_just_pressed {
369-
if !is_network {
370-
if slot.confirmed {
371-
slot.confirmed = false;
372-
} else if slot.active {
373-
slot.active = false;
374-
slot.control_source = None;
375-
}
376-
} else {
377-
slot.confirmed = false;
378-
}
379-
380-
#[cfg(not(target_arch = "wasm32"))]
381-
if let Some(socket) = network_socket.as_ref() {
382-
socket.send_reliable(
383-
SocketTarget::All,
384-
&postcard::to_allocvec(&PlayerSelectMessage::ConfirmSelection(slot.confirmed))
385-
.unwrap(),
386-
);
387-
}
388-
} else if player_control.just_moved {
389-
let direction = player_control.move_direction;
390-
391-
// Select a hat if the player has been confirmed
392-
if slot.confirmed {
393-
let current_hat_handle_idx = state
394-
.hats
395-
.iter()
396-
.enumerate()
397-
.find(|(_, handle)| **handle == slot.selected_hat)
398-
.map(|(i, _)| i)
399-
.unwrap_or(0);
400-
401-
let next_idx = if direction.x > 0.0 {
402-
(current_hat_handle_idx + 1) % state.hats.len()
403-
} else {
404-
let idx = current_hat_handle_idx as i32 - 1;
405-
if idx == -1 {
406-
state.hats.len() - 1
407-
} else {
408-
idx as usize
409-
}
410-
};
411-
slot.selected_hat = state.hats[next_idx];
357+
if new_player_join.is_none() {
358+
if player_control.menu_confirm_just_pressed {
359+
slot.confirmed = true;
412360

413361
#[cfg(not(target_arch = "wasm32"))]
414362
if let Some(socket) = network_socket.as_ref() {
415363
socket.send_reliable(
416364
SocketTarget::All,
417-
&postcard::to_allocvec(&PlayerSelectMessage::SelectHat(
418-
slot.selected_hat.map(|x| x.network_handle(&asset_server)),
419-
))
420-
.unwrap(),
365+
&postcard::to_allocvec(&PlayerSelectMessage::ConfirmSelection(slot.confirmed))
366+
.unwrap(),
421367
);
422368
}
423-
424-
// Select player skin if the player has not be confirmed
425-
} else {
426-
let current_player_handle_idx = state
427-
.players
428-
.iter()
429-
.enumerate()
430-
.find(|(_, handle)| *handle == player_handle)
431-
.map(|(i, _)| i)
432-
.unwrap_or(0);
433-
let next_idx = if direction.x > 0.0 {
434-
(current_player_handle_idx + 1) % state.players.len()
435-
} else {
436-
let idx = current_player_handle_idx as i32 - 1;
437-
if idx == -1 {
438-
state.players.len() - 1
439-
} else {
440-
idx as usize
369+
} else if player_control.menu_back_just_pressed {
370+
if !is_network {
371+
if slot.confirmed {
372+
slot.confirmed = false;
373+
} else if slot.active {
374+
slot.active = false;
375+
slot.control_source = None;
441376
}
442-
};
443-
*player_handle = state.players[next_idx];
377+
} else {
378+
slot.confirmed = false;
379+
}
444380

445381
#[cfg(not(target_arch = "wasm32"))]
446382
if let Some(socket) = network_socket.as_ref() {
447383
socket.send_reliable(
448384
SocketTarget::All,
449-
&postcard::to_allocvec(&PlayerSelectMessage::SelectPlayer(
450-
player_handle.network_handle(&asset_server),
451-
))
452-
.unwrap(),
385+
&postcard::to_allocvec(&PlayerSelectMessage::ConfirmSelection(slot.confirmed))
386+
.unwrap(),
453387
);
454388
}
389+
} else if player_control.just_moved {
390+
let direction = player_control.move_direction;
391+
392+
// Select a hat if the player has been confirmed
393+
if slot.confirmed {
394+
let current_hat_handle_idx = state
395+
.hats
396+
.iter()
397+
.enumerate()
398+
.find(|(_, handle)| **handle == slot.selected_hat)
399+
.map(|(i, _)| i)
400+
.unwrap_or(0);
401+
402+
let next_idx = if direction.x > 0.0 {
403+
(current_hat_handle_idx + 1) % state.hats.len()
404+
} else {
405+
let idx = current_hat_handle_idx as i32 - 1;
406+
if idx == -1 {
407+
state.hats.len() - 1
408+
} else {
409+
idx as usize
410+
}
411+
};
412+
slot.selected_hat = state.hats[next_idx];
413+
414+
#[cfg(not(target_arch = "wasm32"))]
415+
if let Some(socket) = network_socket.as_ref() {
416+
socket.send_reliable(
417+
SocketTarget::All,
418+
&postcard::to_allocvec(&PlayerSelectMessage::SelectHat(
419+
slot.selected_hat.map(|x| x.network_handle(&asset_server)),
420+
))
421+
.unwrap(),
422+
);
423+
}
424+
425+
// Select player skin if the player has not be confirmed
426+
} else {
427+
let current_player_handle_idx = state
428+
.players
429+
.iter()
430+
.enumerate()
431+
.find(|(_, handle)| *handle == player_handle)
432+
.map(|(i, _)| i)
433+
.unwrap_or(0);
434+
let next_idx = if direction.x > 0.0 {
435+
(current_player_handle_idx + 1) % state.players.len()
436+
} else {
437+
let idx = current_player_handle_idx as i32 - 1;
438+
if idx == -1 {
439+
state.players.len() - 1
440+
} else {
441+
idx as usize
442+
}
443+
};
444+
*player_handle = state.players[next_idx];
445+
446+
#[cfg(not(target_arch = "wasm32"))]
447+
if let Some(socket) = network_socket.as_ref() {
448+
socket.send_reliable(
449+
SocketTarget::All,
450+
&postcard::to_allocvec(&PlayerSelectMessage::SelectPlayer(
451+
player_handle.network_handle(&asset_server),
452+
))
453+
.unwrap(),
454+
);
455+
}
456+
}
455457
}
456458
}
457459

@@ -507,15 +509,19 @@ fn player_select_panel(
507509
.as_ref()
508510
.map(|handle| asset_server.get(*handle));
509511

510-
ui.label(normal_font.rich(localization.get("pick-a-fish")));
512+
if !slot.confirmed {
513+
if slot.control_source.is_some() {
514+
ui.label(normal_font.rich(localization.get("pick-a-fish")));
515+
}
511516

512-
if !slot.confirmed && network_local_player_slot.is_some_and(|s| s == *slot_id) {
513-
ui.label(normal_font.rich(localization.get_with(
514-
"press-button-to-lock-in",
515-
&fluent_args! {
516-
"button" => confirm_binding.as_str()
517-
},
518-
)));
517+
if network_local_player_slot.is_some_and(|s| s == *slot_id) || !is_network {
518+
ui.label(normal_font.rich(localization.get_with(
519+
"press-button-to-lock-in",
520+
&fluent_args! {
521+
"button" => confirm_binding.as_str()
522+
},
523+
)));
524+
}
519525

520526
if !is_network {
521527
ui.label(normal_font.rich(localization.get_with(

0 commit comments

Comments
 (0)