1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

Fix overrideable hand ToolCapabilities and range (#15743)

This commit is contained in:
cx384 2025-03-16 20:03:31 +01:00 committed by GitHub
parent d085f0fb52
commit e0378737b7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 42 additions and 32 deletions

View file

@ -592,7 +592,7 @@ protected:
void handlePointingAtNode(const PointedThing &pointed,
const ItemStack &selected_item, const ItemStack &hand_item, f32 dtime);
void handlePointingAtObject(const PointedThing &pointed, const ItemStack &playeritem,
const v3f &player_position, bool show_debug);
const ItemStack &hand_item, const v3f &player_position, bool show_debug);
void handleDigging(const PointedThing &pointed, const v3s16 &nodepos,
const ItemStack &selected_item, const ItemStack &hand_item, f32 dtime);
void updateFrame(ProfilerGraph *graph, RunStats *stats, f32 dtime,
@ -2953,14 +2953,14 @@ void Game::updateCamera(f32 dtime)
LocalPlayer *player = env.getLocalPlayer();
// For interaction purposes, get info about the held item
ItemStack playeritem;
ItemStack playeritem, hand;
{
ItemStack selected, hand;
ItemStack selected;
playeritem = player->getWieldedItem(&selected, &hand);
}
ToolCapabilities playeritem_toolcap =
playeritem.getToolCapabilities(itemdef_manager);
playeritem.getToolCapabilities(itemdef_manager, &hand);
float full_punch_interval = playeritem_toolcap.full_punch_interval;
float tool_reload_ratio = runData.time_from_last_punch / full_punch_interval;
@ -3067,8 +3067,8 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud)
ItemStack selected_item, hand_item;
const ItemStack &tool_item = player->getWieldedItem(&selected_item, &hand_item);
const ItemDefinition &selected_def = selected_item.getDefinition(itemdef_manager);
f32 d = getToolRange(selected_item, hand_item, itemdef_manager);
const ItemDefinition &selected_def = tool_item.getDefinition(itemdef_manager);
f32 d = getToolRange(tool_item, hand_item, itemdef_manager);
core::line3d<f32> shootline;
@ -3185,7 +3185,7 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud)
} else if (pointed.type == POINTEDTHING_OBJECT) {
v3f player_position = player->getPosition();
bool basic_debug_allowed = client->checkPrivilege("debug") || (player->hud_flags & HUD_FLAG_BASIC_DEBUG);
handlePointingAtObject(pointed, tool_item, player_position,
handlePointingAtObject(pointed, tool_item, hand_item, player_position,
m_game_ui->m_flags.show_basic_debug && basic_debug_allowed);
} else if (isKeyDown(KeyType::DIG)) {
// When button is held down in air, show continuous animation
@ -3599,8 +3599,8 @@ bool Game::nodePlacement(const ItemDefinition &selected_def,
}
}
void Game::handlePointingAtObject(const PointedThing &pointed,
const ItemStack &tool_item, const v3f &player_position, bool show_debug)
void Game::handlePointingAtObject(const PointedThing &pointed, const ItemStack &tool_item,
const ItemStack &hand_item, const v3f &player_position, bool show_debug)
{
std::wstring infotext = unescape_translate(
utf8_to_wide(runData.selected_object->infoText()));
@ -3638,7 +3638,7 @@ void Game::handlePointingAtObject(const PointedThing &pointed,
v3f dir = (objpos - player_position).normalize();
bool disable_send = runData.selected_object->directReportPunch(
dir, &tool_item, runData.time_from_last_punch);
dir, &tool_item, &hand_item, runData.time_from_last_punch);
runData.time_from_last_punch = 0;
if (!disable_send)
@ -3659,13 +3659,14 @@ void Game::handleDigging(const PointedThing &pointed, const v3s16 &nodepos,
ClientMap &map = client->getEnv().getClientMap();
MapNode n = map.getNode(nodepos);
const auto &features = nodedef_manager->get(n);
const ItemStack &tool_item = selected_item.name.empty() ? hand_item : selected_item;
// NOTE: Similar piece of code exists on the server side for
// cheat detection.
// Get digging parameters
DigParams params = getDigParams(features.groups,
&selected_item.getToolCapabilities(itemdef_manager),
selected_item.wear);
&tool_item.getToolCapabilities(itemdef_manager, &hand_item),
tool_item.wear);
// If can't dig, try hand
if (!params.diggable) {