Skip to content

Commit

Permalink
Fix overrideable hand ToolCapabilities and range
Browse files Browse the repository at this point in the history
  • Loading branch information
cx384 committed Feb 1, 2025
1 parent 29cfb6e commit 1f0ef52
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 31 deletions.
4 changes: 2 additions & 2 deletions src/client/clientobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,8 +75,8 @@ class ClientActiveObject : public ActiveObject
Client *client, ClientEnvironment *env);

// If returns true, punch will not be sent to the server
virtual bool directReportPunch(v3f dir, const ItemStack *punchitem = nullptr,
float time_from_last_punch = 1000000) { return false; }
virtual bool directReportPunch(v3f dir, const ItemStack *punchitem,
const ItemStack *hand_item, float time_from_last_punch = 1000000) { return false; }

protected:
// Used for creating objects based on type
Expand Down
4 changes: 2 additions & 2 deletions src/client/content_cao.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1861,11 +1861,11 @@ void GenericCAO::processMessage(const std::string &data)
/* \pre punchitem != NULL
*/
bool GenericCAO::directReportPunch(v3f dir, const ItemStack *punchitem,
float time_from_last_punch)
const ItemStack *hand_item, float time_from_last_punch)
{
assert(punchitem); // pre-condition
const ToolCapabilities *toolcap =
&punchitem->getToolCapabilities(m_client->idef());
&punchitem->getToolCapabilities(m_client->idef(), hand_item->name);
PunchDamageResult result = getPunchDamage(
m_armor_groups,
toolcap,
Expand Down
4 changes: 2 additions & 2 deletions src/client/content_cao.h
Original file line number Diff line number Diff line change
Expand Up @@ -269,8 +269,8 @@ class GenericCAO : public ClientActiveObject

void processMessage(const std::string &data) override;

bool directReportPunch(v3f dir, const ItemStack *punchitem=NULL,
float time_from_last_punch=1000000) override;
bool directReportPunch(v3f dir, const ItemStack *punchitem,
const ItemStack *hand_item, float time_from_last_punch=1000000) override;

std::string debugInfoText() override;

Expand Down
27 changes: 14 additions & 13 deletions src/client/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -590,7 +590,7 @@ class Game {
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,
Expand Down Expand Up @@ -2937,14 +2937,14 @@ void Game::updateCamera(f32 dtime)
- Is it a usable item?
- Can it point to liquids?
*/
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.name);

if (wasKeyPressed(KeyType::CAMERA_MODE)) {
GenericCAO *playercao = player->getCAO();
Expand Down Expand Up @@ -3047,8 +3047,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;

Expand Down Expand Up @@ -3162,7 +3162,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
Expand Down Expand Up @@ -3578,8 +3578,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()));
Expand Down Expand Up @@ -3617,7 +3617,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)
Expand All @@ -3638,18 +3638,19 @@ 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.name),
tool_item.wear);

// If can't dig, try hand
if (!params.diggable) {
params = getDigParams(features.groups,
&hand_item.getToolCapabilities(itemdef_manager));
&hand_item.getToolCapabilities(itemdef_manager, hand_item.name));
}

if (!params.diggable) {
Expand Down
10 changes: 6 additions & 4 deletions src/inventory.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,16 +103,18 @@ struct ItemStack

// Get tool digging properties, or those of the hand if not a tool
const ToolCapabilities& getToolCapabilities(
const IItemDefManager *itemdef) const
const IItemDefManager *itemdef, const std::string &hand) const
{
const ToolCapabilities *item_cap =
itemdef->get(name).tool_capabilities;

if (item_cap == NULL)
// Fall back to the hand's tool capabilities
// Fall back to the hand's tool capabilities
if (item_cap == nullptr)
item_cap = itemdef->get(hand).tool_capabilities;
if (item_cap == nullptr)
item_cap = itemdef->get("").tool_capabilities;

assert(item_cap != NULL);
assert(item_cap != nullptr);
return metadata.getToolCapabilities(*item_cap); // Check for override
}

Expand Down
14 changes: 7 additions & 7 deletions src/network/serverpackethandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -852,8 +852,8 @@ void Server::handleCommand_PlayerItem(NetworkPacket* pkt)
bool Server::checkInteractDistance(RemotePlayer *player, const f32 d, const std::string &what)
{
ItemStack selected_item, hand_item;
player->getWieldedItem(&selected_item, &hand_item);
f32 max_d = BS * getToolRange(selected_item, hand_item, m_itemdef);
const ItemStack &tool_item = player->getWieldedItem(&selected_item, &hand_item);
f32 max_d = BS * getToolRange(tool_item, hand_item, m_itemdef);

// Cube diagonal * 1.5 for maximal supported node extents:
// sqrt(3) * 1.5 ≅ 2.6
Expand Down Expand Up @@ -1061,7 +1061,7 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
ItemStack selected_item, hand_item;
ItemStack tool_item = playersao->getWieldedItem(&selected_item, &hand_item);
ToolCapabilities toolcap =
tool_item.getToolCapabilities(m_itemdef);
tool_item.getToolCapabilities(m_itemdef, hand_item.name);
v3f dir = (pointed_object->getBasePosition() -
(playersao->getBasePosition() + playersao->getEyeOffset())
).normalize();
Expand Down Expand Up @@ -1118,16 +1118,16 @@ void Server::handleCommand_Interact(NetworkPacket *pkt)
// Get player's wielded item
// See also: Game::handleDigging
ItemStack selected_item, hand_item;
player->getWieldedItem(&selected_item, &hand_item);
ItemStack &tool_item = player->getWieldedItem(&selected_item, &hand_item);

// Get diggability and expected digging time
DigParams params = getDigParams(m_nodedef->get(n).groups,
&selected_item.getToolCapabilities(m_itemdef),
selected_item.wear);
&tool_item.getToolCapabilities(m_itemdef, hand_item.name),
tool_item.wear);
// If can't dig, try hand
if (!params.diggable) {
params = getDigParams(m_nodedef->get(n).groups,
&hand_item.getToolCapabilities(m_itemdef));
&hand_item.getToolCapabilities(m_itemdef, hand_item.name));
}
// If can't dig, ignore dig
if (!params.diggable) {
Expand Down
2 changes: 1 addition & 1 deletion src/script/lua_api/l_item.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -327,7 +327,7 @@ int LuaItemStack::l_get_tool_capabilities(lua_State *L)
LuaItemStack *o = checkObject<LuaItemStack>(L, 1);
ItemStack &item = o->m_stack;
const ToolCapabilities &prop =
item.getToolCapabilities(getGameDef(L)->idef());
item.getToolCapabilities(getGameDef(L)->idef(), "");
push_tool_capabilities(L, prop);
return 1;
}
Expand Down

0 comments on commit 1f0ef52

Please sign in to comment.