Only apply "touch_punch_gesture" when wielded item has no on_use callback (#15098)

This commit is contained in:
grorp 2024-09-12 23:41:47 +02:00 committed by SmallJoker
parent a8e7e261b9
commit 6bdd5c6773
4 changed files with 17 additions and 5 deletions

@ -9223,9 +9223,17 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and
-- If specified as a table, the field to be used is selected according to
-- the current `pointed_thing`.
-- There are three possible TouchInteractionMode values:
-- * "user" (meaning depends on client-side settings)
-- * "long_dig_short_place" (long tap = dig, short tap = place)
-- * "short_dig_long_place" (short tap = dig, long tap = place)
-- * "user":
-- * For `pointed_object`: Equivalent to "short_dig_long_place" if the
-- client-side setting "touch_punch_gesture" is "short_tap" (the
-- default value) and the item is able to punch (i.e. has no on_use
-- callback defined).
-- Equivalent to "long_dig_short_place" otherwise.
-- * For `pointed_node` and `pointed_nothing`:
-- Equivalent to "long_dig_short_place".
-- * The behavior of "user" may change in the future.
-- The default value is "user".
sound = {

@ -3349,7 +3349,7 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud)
infostream << "Pointing at " << pointed.dump() << std::endl;
if (g_touchscreengui) {
auto mode = selected_def.touch_interaction.getMode(pointed.type);
auto mode = selected_def.touch_interaction.getMode(selected_def, pointed.type);
g_touchscreengui->applyContextControls(mode);
// applyContextControls may change dig/place input.
// Update again so that TOSERVER_INTERACT packets have the correct controls set.

@ -45,7 +45,8 @@ TouchInteraction::TouchInteraction()
pointed_object = TouchInteractionMode_USER;
}
TouchInteractionMode TouchInteraction::getMode(PointedThingType pointed_type) const
TouchInteractionMode TouchInteraction::getMode(const ItemDefinition &selected_def,
PointedThingType pointed_type) const
{
TouchInteractionMode result;
switch (pointed_type) {
@ -63,7 +64,9 @@ TouchInteractionMode TouchInteraction::getMode(PointedThingType pointed_type) co
}
if (result == TouchInteractionMode_USER) {
if (pointed_type == POINTEDTHING_OBJECT)
if (pointed_type == POINTEDTHING_OBJECT && !selected_def.usable)
// Only apply when we're actually able to punch the object, i.e. when
// the selected item has no on_use callback defined.
result = g_settings->get("touch_punch_gesture") == "long_tap" ?
LONG_DIG_SHORT_PLACE : SHORT_DIG_LONG_PLACE;
else

@ -71,7 +71,8 @@ struct TouchInteraction
TouchInteraction();
// Returns the right mode for the pointed thing and resolves any occurrence
// of TouchInteractionMode_USER into an actual mode.
TouchInteractionMode getMode(PointedThingType pointed_type) const;
TouchInteractionMode getMode(const ItemDefinition &selected_def,
PointedThingType pointed_type) const;
void serialize(std::ostream &os) const;
void deSerialize(std::istream &is);
};