Fixes #1923 - Pickaxe tooltip wrong for digging

This commit is contained in:
Woeful_Wolf 2024-01-20 19:08:41 +02:00
parent 88a4d0898f
commit 25e4e09ab4
3 changed files with 65 additions and 49 deletions

View File

@ -669,7 +669,7 @@ pub struct DebugInfo {
pub struct HudInfo { pub struct HudInfo {
pub is_aiming: bool, pub is_aiming: bool,
pub is_mining: bool, pub active_mine_tool: Option<ToolKind>,
pub is_first_person: bool, pub is_first_person: bool,
pub viewpoint_entity: specs::Entity, pub viewpoint_entity: specs::Entity,
pub mutable_viewpoint: bool, pub mutable_viewpoint: bool,
@ -2122,43 +2122,52 @@ impl Hud {
})] })]
}, },
BlockInteraction::Mine(mine_tool) => { BlockInteraction::Mine(mine_tool) => {
if info.is_mining { match &info.active_mine_tool {
match mine_tool { Some(active_mine_tool) => {
ToolKind::Pick => { match (mine_tool, active_mine_tool) {
vec![( (ToolKind::Pick, ToolKind::Pick) => {
Some(GameInput::Primary), vec![(
i18n.get_msg("hud-mine").to_string(), Some(GameInput::Primary),
)] i18n.get_msg("hud-mine").to_string(),
}, )]
ToolKind::Shovel => { },
vec![( (ToolKind::Pick, _) => {
Some(GameInput::Primary), vec![(None, i18n.get_msg("hud-mine-needs_pickaxe").to_string())]
i18n.get_msg("hud-dig").to_string(), },
)] (ToolKind::Shovel, ToolKind::Shovel) => {
}, vec![(
_ => { Some(GameInput::Primary),
vec![( i18n.get_msg("hud-dig").to_string(),
None, )]
i18n.get_msg("hud-mine-needs_unhandled_case").to_string(), },
)] (ToolKind::Shovel, _) => {
}, vec![(None, i18n.get_msg("hud-mine-needs_shovel").to_string())]
} },
} else { _ => {
match mine_tool { vec![(
ToolKind::Pick => { None,
vec![(None, i18n.get_msg("hud-mine-needs_pickaxe").to_string())] i18n.get_msg("hud-mine-needs_unhandled_case").to_string(),
}, )]
ToolKind::Shovel => { },
vec![(None, i18n.get_msg("hud-mine-needs_shovel").to_string())] }
},
None => {
match mine_tool {
ToolKind::Pick => {
vec![(None, i18n.get_msg("hud-mine-needs_pickaxe").to_string())]
},
ToolKind::Shovel => {
vec![(None, i18n.get_msg("hud-mine-needs_shovel").to_string())]
}
// TODO: The required tool for mining something may not always be a
// pickaxe!
_ => {
vec![(
None,
i18n.get_msg("hud-mine-needs_unhandled_case").to_string(),
)]
},
} }
// TODO: The required tool for mining something may not always be a
// pickaxe!
_ => {
vec![(
None,
i18n.get_msg("hud-mine-needs_unhandled_case").to_string(),
)]
},
} }
} }
}, },

View File

@ -601,15 +601,22 @@ impl PlayState for SessionState {
.get(player_entity) .get(player_entity)
.map_or_else(|| false, |cb| cb.enabled); .map_or_else(|| false, |cb| cb.enabled);
let is_mining = client let active_mine_tool: Option<ToolKind> = if client.is_wielding() == Some(true) { client
.inventories() .inventories()
.get(player_entity) .get(player_entity)
.and_then(|inv| inv.equipped(EquipSlot::ActiveMainhand)) .and_then(|inv| inv.equipped(EquipSlot::ActiveMainhand))
.and_then(|item| item.tool_info()) .and_then(|item| item.tool_info())
.map_or(false, |tool_kind| { .map_or(None, |tool_kind| {
matches!(tool_kind, ToolKind::Pick | ToolKind::Shovel) match tool_kind {
ToolKind::Pick => Some(tool_kind),
ToolKind::Shovel => Some(tool_kind),
_ => None,
}
}) })
&& client.is_wielding() == Some(true); } else {
None
};
// Check to see whether we're aiming at anything // Check to see whether we're aiming at anything
let (build_target, collect_target, entity_target, mine_target, terrain_target) = let (build_target, collect_target, entity_target, mine_target, terrain_target) =
@ -618,7 +625,7 @@ impl PlayState for SessionState {
cam_pos, cam_pos,
cam_dir, cam_dir,
can_build, can_build,
is_mining, active_mine_tool,
self.viewpoint_entity().0, self.viewpoint_entity().0,
); );
@ -651,17 +658,17 @@ impl PlayState for SessionState {
// Nearest block to consider with GameInput primary or secondary key. // Nearest block to consider with GameInput primary or secondary key.
let nearest_block_dist = find_shortest_distance(&[ let nearest_block_dist = find_shortest_distance(&[
mine_target.filter(|_| is_mining).map(|t| t.distance), mine_target.filter(|_| active_mine_tool.is_some()).map(|t| t.distance),
build_target.filter(|_| can_build).map(|t| t.distance), build_target.filter(|_| can_build).map(|t| t.distance),
]); ]);
// Nearest block to be highlighted in the scene (self.scene.set_select_pos). // Nearest block to be highlighted in the scene (self.scene.set_select_pos).
let nearest_scene_dist = find_shortest_distance(&[ let nearest_scene_dist = find_shortest_distance(&[
nearest_block_dist, nearest_block_dist,
collect_target.filter(|_| !is_mining).map(|t| t.distance), collect_target.filter(|_| active_mine_tool.is_none()).map(|t| t.distance),
]); ]);
// Set break_block_pos only if mining is closest. // Set break_block_pos only if mining is closest.
self.inputs.break_block_pos = if let Some(mt) = self.inputs.break_block_pos = if let Some(mt) =
mine_target.filter(|mt| is_mining && nearest_scene_dist == Some(mt.distance)) mine_target.filter(|mt| active_mine_tool.is_some() && nearest_scene_dist == Some(mt.distance))
{ {
self.scene.set_select_pos(Some(mt.position_int())); self.scene.set_select_pos(Some(mt.position_int()));
Some(mt.position) Some(mt.position)
@ -1507,7 +1514,7 @@ impl PlayState for SessionState {
global_state.clock.get_stable_dt(), global_state.clock.get_stable_dt(),
HudInfo { HudInfo {
is_aiming, is_aiming,
is_mining, active_mine_tool,
is_first_person: matches!( is_first_person: matches!(
self.scene.camera().get_mode(), self.scene.camera().get_mode(),
camera::CameraMode::FirstPerson camera::CameraMode::FirstPerson

View File

@ -3,7 +3,7 @@ use vek::*;
use client::{self, Client}; use client::{self, Client};
use common::{ use common::{
comp, comp::{self, tool::ToolKind},
consts::MAX_PICKUP_RANGE, consts::MAX_PICKUP_RANGE,
link::Is, link::Is,
mounting::{Mount, Rider}, mounting::{Mount, Rider},
@ -50,7 +50,7 @@ pub(super) fn targets_under_cursor(
cam_pos: Vec3<f32>, cam_pos: Vec3<f32>,
cam_dir: Vec3<f32>, cam_dir: Vec3<f32>,
can_build: bool, can_build: bool,
is_mining: bool, active_mine_tool: Option<ToolKind>,
viewpoint_entity: specs::Entity, viewpoint_entity: specs::Entity,
) -> ( ) -> (
Option<Target<Build>>, Option<Target<Build>>,
@ -103,7 +103,7 @@ pub(super) fn targets_under_cursor(
}; };
let (collect_pos, _, collect_cam_ray) = find_pos(|b: Block| b.is_collectible()); let (collect_pos, _, collect_cam_ray) = find_pos(|b: Block| b.is_collectible());
let (mine_pos, _, mine_cam_ray) = is_mining let (mine_pos, _, mine_cam_ray) = active_mine_tool.is_some()
.then(|| find_pos(|b: Block| b.mine_tool().is_some())) .then(|| find_pos(|b: Block| b.mine_tool().is_some()))
.unwrap_or((None, None, None)); .unwrap_or((None, None, None));
let (solid_pos, place_block_pos, solid_cam_ray) = find_pos(|b: Block| b.is_filled()); let (solid_pos, place_block_pos, solid_cam_ray) = find_pos(|b: Block| b.is_filled());