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

View File

@ -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 -- If specified as a table, the field to be used is selected according to
-- the current `pointed_thing`. -- the current `pointed_thing`.
-- There are three possible TouchInteractionMode values: -- There are three possible TouchInteractionMode values:
-- * "user" (meaning depends on client-side settings)
-- * "long_dig_short_place" (long tap = dig, short tap = place) -- * "long_dig_short_place" (long tap = dig, short tap = place)
-- * "short_dig_long_place" (short tap = dig, long 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". -- The default value is "user".
sound = { sound = {

View File

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

View File

@ -45,7 +45,8 @@ TouchInteraction::TouchInteraction()
pointed_object = TouchInteractionMode_USER; pointed_object = TouchInteractionMode_USER;
} }
TouchInteractionMode TouchInteraction::getMode(PointedThingType pointed_type) const TouchInteractionMode TouchInteraction::getMode(const ItemDefinition &selected_def,
PointedThingType pointed_type) const
{ {
TouchInteractionMode result; TouchInteractionMode result;
switch (pointed_type) { switch (pointed_type) {
@ -63,7 +64,9 @@ TouchInteractionMode TouchInteraction::getMode(PointedThingType pointed_type) co
} }
if (result == TouchInteractionMode_USER) { 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" ? result = g_settings->get("touch_punch_gesture") == "long_tap" ?
LONG_DIG_SHORT_PLACE : SHORT_DIG_LONG_PLACE; LONG_DIG_SHORT_PLACE : SHORT_DIG_LONG_PLACE;
else else

View File

@ -71,7 +71,8 @@ struct TouchInteraction
TouchInteraction(); TouchInteraction();
// Returns the right mode for the pointed thing and resolves any occurrence // Returns the right mode for the pointed thing and resolves any occurrence
// of TouchInteractionMode_USER into an actual mode. // 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 serialize(std::ostream &os) const;
void deSerialize(std::istream &is); void deSerialize(std::istream &is);
}; };