diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 10c624033..e253af30e 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -8027,6 +8027,12 @@ Used by `minetest.register_node`, `minetest.register_craftitem`, and eat = , -- When item is eaten with `minetest.do_item_eat` + + punch_use = , + -- When item is used with the 'punch/mine' key pointing at a node or entity + + punch_use_air = , + -- When item is used with the 'punch/mine' key pointing at nothing (air) }, on_place = function(itemstack, placer, pointed_thing), diff --git a/games/devtest/mods/soundstuff/init.lua b/games/devtest/mods/soundstuff/init.lua index b263a3f35..2523bd302 100644 --- a/games/devtest/mods/soundstuff/init.lua +++ b/games/devtest/mods/soundstuff/init.lua @@ -136,6 +136,35 @@ minetest.register_tool("soundstuff:breaks", { }, }) + +minetest.register_tool("soundstuff:punch_use", { + description = "Punch Use Sound Tool\n".. + "Digs cracky=3 and more\n".. + "Makes a sound when used on node or entity", + inventory_image = "soundstuff_node_dig.png", + sound = { + punch_use = { name = "soundstuff_mono", gain = 1.0 }, + }, + tool_capabilities = { + max_drop_level=0, + groupcaps={ + cracky={times={[2]=2.00, [3]=1.20}, uses=0, maxlevel=0}, + choppy={times={[2]=2.00, [3]=1.20}, uses=0, maxlevel=0}, + snappy={times={[2]=2.00, [3]=1.20}, uses=0, maxlevel=0}, + crumbly={times={[2]=2.00, [3]=1.20}, uses=0, maxlevel=0}, + }, + }, +}) + +minetest.register_tool("soundstuff:punch_use_air", { + description = "Punch Use (Air) Sound Tool\n".. + "Makes a sound when used pointing at nothing", + inventory_image = "soundstuff_node_dig.png", + sound = { + punch_use_air = { name = "soundstuff_mono", gain = 1.0 }, + }, +}) + -- Plays sound repeatedly minetest.register_node("soundstuff:positional", { description = "Positional Sound Node", diff --git a/src/client/game.cpp b/src/client/game.cpp index 6807c7eca..91c93ef7f 100644 --- a/src/client/game.cpp +++ b/src/client/game.cpp @@ -264,6 +264,8 @@ public: SimpleSoundSpec m_player_step_sound; SimpleSoundSpec m_player_leftpunch_sound; + // Second sound made on left punch, currently used for item 'use' sound + SimpleSoundSpec m_player_leftpunch_sound2; SimpleSoundSpec m_player_rightpunch_sound; SoundMaker(ISoundManager *sound, const NodeDefManager *ndef): @@ -314,6 +316,7 @@ public: { SoundMaker *sm = (SoundMaker *)data; sm->m_sound->playSound(sm->m_player_leftpunch_sound); + sm->m_sound->playSound(sm->m_player_leftpunch_sound2); } static void cameraPunchRight(MtEvent *e, void *data) @@ -3236,7 +3239,9 @@ void Game::processPlayerInteraction(f32 dtime, bool show_hud) runData.punching = false; - soundmaker->m_player_leftpunch_sound.name.clear(); + soundmaker->m_player_leftpunch_sound = SimpleSoundSpec(); + soundmaker->m_player_leftpunch_sound2 = pointed.type != POINTEDTHING_NOTHING ? + selected_def.sound_use : selected_def.sound_use_air; // Prepare for repeating, unless we're not supposed to if (isKeyDown(KeyType::PLACE) && !g_settings->getBool("safe_dig_and_place")) diff --git a/src/itemdef.cpp b/src/itemdef.cpp index e8d9ea307..4d6950835 100644 --- a/src/itemdef.cpp +++ b/src/itemdef.cpp @@ -78,6 +78,8 @@ ItemDefinition& ItemDefinition::operator=(const ItemDefinition &def) place_param2 = def.place_param2; sound_place = def.sound_place; sound_place_failed = def.sound_place_failed; + sound_use = def.sound_use; + sound_use_air = def.sound_use_air; range = def.range; palette_image = def.palette_image; color = def.color; @@ -117,6 +119,8 @@ void ItemDefinition::reset() groups.clear(); sound_place = SimpleSoundSpec(); sound_place_failed = SimpleSoundSpec(); + sound_use = SimpleSoundSpec(); + sound_use_air = SimpleSoundSpec(); range = -1; node_placement_prediction.clear(); place_param2 = 0; @@ -166,6 +170,9 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const os << serializeString16(short_description); os << place_param2; + + sound_use.serialize(os, protocol_version); + sound_use_air.serialize(os, protocol_version); } void ItemDefinition::deSerialize(std::istream &is, u16 protocol_version) @@ -214,12 +221,15 @@ void ItemDefinition::deSerialize(std::istream &is, u16 protocol_version) inventory_overlay = deSerializeString16(is); wield_overlay = deSerializeString16(is); - // If you add anything here, insert it primarily inside the try-catch + // If you add anything here, insert it inside the try-catch // block to not need to increase the version. try { short_description = deSerializeString16(is); place_param2 = readU8(is); // 0 if missing + + sound_use.deSerialize(is, protocol_version); + sound_use_air.deSerialize(is, protocol_version); } catch(SerializationError &e) {}; } diff --git a/src/itemdef.h b/src/itemdef.h index 035717379..3bb27559e 100644 --- a/src/itemdef.h +++ b/src/itemdef.h @@ -80,6 +80,7 @@ struct ItemDefinition ItemGroupList groups; SimpleSoundSpec sound_place; SimpleSoundSpec sound_place_failed; + SimpleSoundSpec sound_use, sound_use_air; f32 range; // Client shall immediately place this node when player places the item. diff --git a/src/script/common/c_content.cpp b/src/script/common/c_content.cpp index da54edb96..93202dcee 100644 --- a/src/script/common/c_content.cpp +++ b/src/script/common/c_content.cpp @@ -112,6 +112,19 @@ void read_item_definition(lua_State* L, int index, } lua_pop(L, 1); + // No, this is not a mistake. Item sounds are in "sound", node sounds in "sounds". + lua_getfield(L, index, "sound"); + if (!lua_isnil(L, -1)) { + luaL_checktype(L, -1, LUA_TTABLE); + lua_getfield(L, -1, "punch_use"); + read_soundspec(L, -1, def.sound_use); + lua_pop(L, 1); + lua_getfield(L, -1, "punch_use_air"); + read_soundspec(L, -1, def.sound_use_air); + lua_pop(L, 1); + } + lua_pop(L, 1); + def.range = getfloatfield_default(L, index, "range", def.range); // Client shall immediately place this node when player places the item.