diff options
-rw-r--r-- | doc/lua_api.txt | 4 | ||||
-rw-r--r-- | games/minimal/mods/default/init.lua | 2 | ||||
-rw-r--r-- | src/clientserver.h | 1 | ||||
-rw-r--r-- | src/game.cpp | 8 | ||||
-rw-r--r-- | src/itemdef.cpp | 30 | ||||
-rw-r--r-- | src/itemdef.h | 2 | ||||
-rw-r--r-- | src/scriptapi_item.cpp | 8 |
7 files changed, 47 insertions, 8 deletions
diff --git a/doc/lua_api.txt b/doc/lua_api.txt index 42ca58239..beb70db15 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -1514,6 +1514,9 @@ Item definition (register_node, register_craftitem, register_tool) ^ Otherwise should be name of node which the client immediately places on ground when the player places the item. Server will always update actual result to client in a short moment. + sound = { + place = <SimpleSoundSpec>, + } on_place = func(itemstack, placer, pointed_thing), ^ Shall place item and return the leftover itemstack @@ -1581,6 +1584,7 @@ Node definition (register_node) footstep = <SimpleSoundSpec>, dig = <SimpleSoundSpec>, -- "__group" = group-based sound (default) dug = <SimpleSoundSpec>, + place = <SimpleSoundSpec>, }, on_construct = func(pos), diff --git a/games/minimal/mods/default/init.lua b/games/minimal/mods/default/init.lua index fbb481a0c..163998883 100644 --- a/games/minimal/mods/default/init.lua +++ b/games/minimal/mods/default/init.lua @@ -659,6 +659,8 @@ function default.node_sound_dirt_defaults(table) {name="", gain=0.5} --table.dug = table.dug or -- {name="default_dirt_break", gain=0.5} + table.place = table.place or + {name="default_grass_footstep", gain=0.5} default.node_sound_defaults(table) return table end diff --git a/src/clientserver.h b/src/clientserver.h index aba84fb31..28b579971 100644 --- a/src/clientserver.h +++ b/src/clientserver.h @@ -87,6 +87,7 @@ SharedBuffer<u8> makePacket_TOCLIENT_TIME_OF_DAY(u16 time, float time_speed); TOCLIENT_DELETE_PARTICLESPAWNER PROTOCOL_VERSION 18: damageGroups added to ToolCapabilities + sound_place added to ItemDefinition */ #define LATEST_PROTOCOL_VERSION 18 diff --git a/src/game.cpp b/src/game.cpp index 58ca654a0..5e4e06148 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -2394,11 +2394,6 @@ void the_game( } } - // We can't actually know, but assume the sound of right-clicking - // to be the sound of placing a node - soundmaker.m_player_rightpunch_sound.gain = 0.5; - soundmaker.m_player_rightpunch_sound.name = "default_place_node"; - /* Handle digging */ @@ -2617,6 +2612,9 @@ void the_game( <<") - Position not loaded"<<std::endl; } }while(0); + + // Read the sound + soundmaker.m_player_rightpunch_sound = def.sound_place; } } } diff --git a/src/itemdef.cpp b/src/itemdef.cpp index 98d7ce0a8..72ce0e654 100644 --- a/src/itemdef.cpp +++ b/src/itemdef.cpp @@ -75,6 +75,7 @@ ItemDefinition& ItemDefinition::operator=(const ItemDefinition &def) } groups = def.groups; node_placement_prediction = def.node_placement_prediction; + sound_place = def.sound_place; return *this; } @@ -107,13 +108,17 @@ void ItemDefinition::reset() tool_capabilities = NULL; } groups.clear(); + sound_place = SimpleSoundSpec(); node_placement_prediction = ""; } void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const { - writeU8(os, 1); // version + if(protocol_version <= 17) + writeU8(os, 1); // version + else + writeU8(os, 2); // version writeU8(os, type); os<<serializeString(name); os<<serializeString(description); @@ -137,6 +142,11 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const writeS16(os, i->second); } os<<serializeString(node_placement_prediction); + if(protocol_version > 17){ + //serializeSimpleSoundSpec(sound_place, os); + os<<serializeString(sound_place.name); + writeF1000(os, sound_place.gain); + } } void ItemDefinition::deSerialize(std::istream &is) @@ -146,7 +156,7 @@ void ItemDefinition::deSerialize(std::istream &is) // Deserialize int version = readU8(is); - if(version != 1) + if(version != 1 && version != 2) throw SerializationError("unsupported ItemDefinition version"); type = (enum ItemType)readU8(is); name = deSerializeString(is); @@ -171,10 +181,24 @@ void ItemDefinition::deSerialize(std::istream &is) int value = readS16(is); groups[name] = value; } + if(version == 1){ + // We cant be sure that node_placement_prediction is send in version 1 + try{ + node_placement_prediction = deSerializeString(is); + }catch(SerializationError &e) {}; + // Set the old default sound + sound_place.name = "default_place_node"; + sound_place.gain = 0.5; + } else if(version == 2) { + node_placement_prediction = deSerializeString(is); + //deserializeSimpleSoundSpec(sound_place, is); + sound_place.name = deSerializeString(is); + sound_place.gain = readF1000(is); + } // If you add anything here, insert it primarily inside the try-catch // block to not need to increase the version. try{ - node_placement_prediction = deSerializeString(is); + }catch(SerializationError &e) {}; } diff --git a/src/itemdef.h b/src/itemdef.h index cbbe7e2ad..08c9c8358 100644 --- a/src/itemdef.h +++ b/src/itemdef.h @@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <iostream> #include <set> #include "itemgroup.h" +#include "sound.h" class IGameDef; struct ToolCapabilities; @@ -66,6 +67,7 @@ struct ItemDefinition // May be NULL. If non-NULL, deleted by destructor ToolCapabilities *tool_capabilities; ItemGroupList groups; + SimpleSoundSpec sound_place; // Client shall immediately place this node when player places the item. // Server will update the precise end result a moment later. diff --git a/src/scriptapi_item.cpp b/src/scriptapi_item.cpp index 204939f8f..b266d856d 100644 --- a/src/scriptapi_item.cpp +++ b/src/scriptapi_item.cpp @@ -96,6 +96,14 @@ ItemDefinition read_item_definition(lua_State *L, int index, read_groups(L, -1, def.groups); lua_pop(L, 1); + lua_getfield(L, index, "sounds"); + if(lua_istable(L, -1)){ + lua_getfield(L, -1, "place"); + read_soundspec(L, -1, def.sound_place); + lua_pop(L, 1); + } + lua_pop(L, 1); + // Client shall immediately place this node when player places the item. // Server will update the precise end result a moment later. // "" = no prediction |