Merge pull request #10098 from MSedgeMC/fix/f1-tab-list

F1 takes the player list away
This commit is contained in:
Kacper authored and GitHub committed 2026-11-06 08:59:58 +01:00
commit efabb913d0
3 files changed
+30 -12

No files matched your search

+18 -7
View File
@@ -124,10 +124,18 @@ pub fn face(
}
}
/// `Hud.extractTabList`: whether the list shows. A single-player world
/// shows it only with another listed player or a `list` objective.
pub fn visible(key_down: bool, local_server: bool, listed: usize, objective: bool) -> bool {
key_down && !(local_server && listed <= 1 && !objective)
/// `Hud.extractTabList`: whether the list shows. `Hud.extractRenderState`
/// only calls it inside `if (!isHidden)`, so F1 takes the list away whatever
/// else holds it up. A single-player world shows it only with another listed
/// player or a `list` objective.
pub fn visible(
hud_shown: bool,
key_down: bool,
local_server: bool,
listed: usize,
objective: bool,
) -> bool {
hud_shown && key_down && !(local_server && listed <= 1 && !objective)
}
/// `Options.getBackgroundColor(553648127)`: the row background.
@@ -702,8 +710,11 @@ mod tests {
assert_eq!(ping_sprite(1000), "icon/ping_1");
// UUID.hashCode of 0 is 0: the first default skin.
assert_eq!(default_skin(0), "entity/player/slim/alex");
assert!(!visible(true, true, 1, false));
assert!(visible(true, true, 1, true));
assert!(visible(true, false, 1, false));
assert!(!visible(true, true, true, 1, false));
assert!(visible(true, true, true, 1, true));
assert!(visible(true, true, false, 1, false));
// F1 (`Hud.isHidden`) takes the list away however it was held up.
assert!(!visible(false, true, false, 2, false));
assert!(!visible(false, true, true, 1, true));
}
}
+11 -5
View File
@@ -835,6 +835,8 @@ impl Game<'_> {
};
let has_objective = self.score.board.display_objective(sb::SLOT_LIST).is_some();
let shown = tab_list::visible(
// `Hud.extractRenderState` draws the list inside `if (!isHidden)`.
!self.ui.hide_gui,
key,
self.has_singleplayer_server(),
players.len(),
@@ -993,7 +995,7 @@ mod tab_list_tests {
let mut guests = vec![guest(2, "Alex")];
let players = local_tab_players(me.clone(), &guests);
assert_eq!(players.as_slice(), std::slice::from_ref(&me));
assert!(!tab_list::visible(true, true, players.len(), false));
assert!(!tab_list::visible(true, true, true, players.len(), false));
guests[0].placed = true;
let players = local_tab_players(me.clone(), &guests);
@@ -1001,14 +1003,18 @@ mod tab_list_tests {
assert_eq!(players[0], me);
assert_eq!(players[1].uuid, 2);
assert_eq!(players[1].name, "Alex");
assert!(tab_list::visible(true, true, players.len(), false));
assert!(!tab_list::visible(false, true, players.len(), false));
assert!(tab_list::visible(true, true, true, players.len(), false));
assert!(!tab_list::visible(true, false, true, players.len(), false));
guests.clear();
let players = local_tab_players(me, &guests);
assert_eq!(players.len(), 1);
assert!(!tab_list::visible(true, true, players.len(), false));
assert!(tab_list::visible(true, true, players.len(), true));
assert!(!tab_list::visible(true, true, true, players.len(), false));
assert!(tab_list::visible(true, true, true, players.len(), true));
// F1 (`Hud.isHidden`) takes the list away: `extractRenderState` draws
// it inside `if (!isHidden)`, the key and the objective aside.
assert!(!tab_list::visible(false, true, true, players.len(), true));
assert!(!tab_list::visible(false, true, false, 2, false));
}
#[test]
+1
View File
@@ -70,6 +70,7 @@ Hud.extractHotbarAndDecorations port crates/horizon-client-render/src/hud_layout
Hud.<init> skip:java constructor state setup
Hud.extractSubtitleOverlay port crates/horizon-client-render/src/hud_overlays.rs::SubtitleOverlay::extract
Hud.extractChat port crates/horizon-client-render/src/chat.rs::Chat::layout
Hud.extractTabList port crates/horizon-client-render/src/tab_list.rs::visible only inside `if (!isHidden)`, so F1 takes the list away; the list key, the local server and a `list` objective decide the rest
Hud.getMobEffectSprite port crates/horizon-client/src/game/potions.rs::Game::draw_effect_icons sprite lookup is inside the effect icon draw
Hud.extractDemoOverlay skip:other Horizon has no demo mode, so there is no demo timer overlay
Hud.getCameraPlayer missing minor: unsure: no camera-entity lookup found; the HUD always uses the local player
1 ActiveTextCollector.accept inline crates/horizon-client-render/src/screen_draw.rs::text default overload: left-aligned text at x,y with default parameters
70 Hud.<init> skip:java constructor state setup
71 Hud.extractSubtitleOverlay port crates/horizon-client-render/src/hud_overlays.rs::SubtitleOverlay::extract
72 Hud.extractChat port crates/horizon-client-render/src/chat.rs::Chat::layout
73 Hud.extractTabList port crates/horizon-client-render/src/tab_list.rs::visible only inside `if (!isHidden)`, so F1 takes the list away; the list key, the local server and a `list` objective decide the rest
74 Hud.getMobEffectSprite port crates/horizon-client/src/game/potions.rs::Game::draw_effect_icons sprite lookup is inside the effect icon draw
75 Hud.extractDemoOverlay skip:other Horizon has no demo mode, so there is no demo timer overlay
76 Hud.getCameraPlayer missing minor: unsure: no camera-entity lookup found; the HUD always uses the local player