From: BlockMen <nmuelll@web.de>
Date: Sat, 24 Oct 2015 10:28:35 +0000 (+0200)
Subject: Add support for audio feedback if placing node failed
X-Git-Tag: 0.4.14~528
X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=2a12579fab7803fdee2fac2fa8a6837f131dde7a;p=oweals%2Fminetest.git

Add support for audio feedback if placing node failed
---

diff --git a/doc/lua_api.txt b/doc/lua_api.txt
index b337be1f0..5008a5293 100644
--- a/doc/lua_api.txt
+++ b/doc/lua_api.txt
@@ -3241,6 +3241,7 @@ Definition tables
             dig = <SimpleSoundSpec>, -- "__group" = group-based sound (default)
             dug = <SimpleSoundSpec>,
             place = <SimpleSoundSpec>,
+            place_failed = <SimpleSoundSpec>,
         },
         drop = "",  -- Name of dropped node when dug. Default is the node itself.
         -- Alternatively:
diff --git a/src/game.cpp b/src/game.cpp
index d74c1fa1d..1738517b5 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -3682,8 +3682,12 @@ void Game::handlePointingAtNode(GameRunData *runData,
 						SimpleSoundSpec();
 
 				if (playeritem_def.node_placement_prediction == "" ||
-						nodedef_manager->get(map.getNodeNoEx(nodepos)).rightclickable)
+						nodedef_manager->get(map.getNodeNoEx(nodepos)).rightclickable) {
 					client->interact(3, pointed); // Report to server
+				} else {
+					soundmaker->m_player_rightpunch_sound =
+						playeritem_def.sound_place_failed;
+				}
 			}
 		}
 	}
diff --git a/src/itemdef.cpp b/src/itemdef.cpp
index 2971d4e88..60a7dc64e 100644
--- a/src/itemdef.cpp
+++ b/src/itemdef.cpp
@@ -80,6 +80,7 @@ ItemDefinition& ItemDefinition::operator=(const ItemDefinition &def)
 	groups = def.groups;
 	node_placement_prediction = def.node_placement_prediction;
 	sound_place = def.sound_place;
+	sound_place_failed = def.sound_place_failed;
 	range = def.range;
 	return *this;
 }
@@ -114,6 +115,7 @@ void ItemDefinition::reset()
 	}
 	groups.clear();
 	sound_place = SimpleSoundSpec();
+	sound_place_failed = SimpleSoundSpec();
 	range = -1;
 
 	node_placement_prediction = "";
@@ -155,8 +157,10 @@ void ItemDefinition::serialize(std::ostream &os, u16 protocol_version) const
 		os<<serializeString(sound_place.name);
 		writeF1000(os, sound_place.gain);
 	}
-	if(protocol_version > 20){
+	if (protocol_version > 20) {
 		writeF1000(os, range);
+		os << serializeString(sound_place_failed.name);
+		writeF1000(os, sound_place_failed.gain);
 	}
 }
 
@@ -211,8 +215,10 @@ void ItemDefinition::deSerialize(std::istream &is)
 	}
 	// If you add anything here, insert it primarily inside the try-catch
 	// block to not need to increase the version.
-	try{
-	}catch(SerializationError &e) {};
+	try {
+		sound_place_failed.name = deSerializeString(is);
+		sound_place_failed.gain = readF1000(is);
+	} catch(SerializationError &e) {};
 }
 
 /*
diff --git a/src/itemdef.h b/src/itemdef.h
index f993fdbac..805b4aa5d 100644
--- a/src/itemdef.h
+++ b/src/itemdef.h
@@ -68,6 +68,7 @@ struct ItemDefinition
 	ToolCapabilities *tool_capabilities;
 	ItemGroupList groups;
 	SimpleSoundSpec sound_place;
+	SimpleSoundSpec sound_place_failed;
 	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 787541ad0..fe429b5d4 100644
--- a/src/script/common/c_content.cpp
+++ b/src/script/common/c_content.cpp
@@ -100,6 +100,9 @@ ItemDefinition read_item_definition(lua_State* L,int index,
 		lua_getfield(L, -1, "place");
 		read_soundspec(L, -1, def.sound_place);
 		lua_pop(L, 1);
+		lua_getfield(L, -1, "place_failed");
+		read_soundspec(L, -1, def.sound_place_failed);
+		lua_pop(L, 1);
 	}
 	lua_pop(L, 1);