From 365c169b43f61b7f957bdd302b3cf9a837cabec1 Mon Sep 17 00:00:00 2001
From: Jeija <norrepli@gmail.com>
Date: Sun, 27 Jan 2013 10:33:25 +0100
Subject: [PATCH] Disable placement prediction for nodes that use on_rightclick

---
 src/game.cpp      | 3 ++-
 src/itemdef.cpp   | 1 +
 src/itemdef.h     | 2 ++
 src/nodedef.cpp   | 3 +++
 src/nodedef.h     | 2 ++
 src/scriptapi.cpp | 6 +++++-
 6 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/src/game.cpp b/src/game.cpp
index 5693c5c12..c77754b5f 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -2531,7 +2531,8 @@ void the_game(
 					// make that happen
 					const ItemDefinition &def =
 							playeritem.getDefinition(itemdef);
-					if(def.node_placement_prediction != "")
+					if(def.node_placement_prediction != ""
+							&& !nodedef->get(map.getNode(nodepos)).rightclickable)
 					do{ // breakable
 						verbosestream<<"Node placement prediction for "
 								<<playeritem.name<<" is "
diff --git a/src/itemdef.cpp b/src/itemdef.cpp
index 260baadc0..a4f3895e0 100644
--- a/src/itemdef.cpp
+++ b/src/itemdef.cpp
@@ -100,6 +100,7 @@ void ItemDefinition::reset()
 	wield_scale = v3f(1.0, 1.0, 1.0);
 	stack_max = 99;
 	usable = false;
+	rightclickable = false;
 	liquids_pointable = false;
 	if(tool_capabilities)
 	{
diff --git a/src/itemdef.h b/src/itemdef.h
index 699d727bd..ae3600868 100644
--- a/src/itemdef.h
+++ b/src/itemdef.h
@@ -62,6 +62,8 @@ struct ItemDefinition
 	*/
 	s16 stack_max;
 	bool usable;
+	// If true, don't use node placement prediction
+	bool rightclickable;
 	bool liquids_pointable;
 	// May be NULL. If non-NULL, deleted by destructor
 	ToolCapabilities *tool_capabilities;
diff --git a/src/nodedef.cpp b/src/nodedef.cpp
index 729c69c92..12d9238ad 100644
--- a/src/nodedef.cpp
+++ b/src/nodedef.cpp
@@ -199,6 +199,7 @@ void ContentFeatures::reset()
 	diggable = true;
 	climbable = false;
 	buildable_to = false;
+	rightclickable = true;
 	liquid_type = LIQUID_NONE;
 	liquid_alternative_flowing = "";
 	liquid_alternative_source = "";
@@ -271,6 +272,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version)
 	serializeSimpleSoundSpec(sound_dug, os);
 	// Stuff below should be moved to correct place in a version that otherwise changes
 	// the protocol version
+	writeU8(os, rightclickable);
 }
 
 void ContentFeatures::deSerialize(std::istream &is)
@@ -334,6 +336,7 @@ void ContentFeatures::deSerialize(std::istream &is)
 	try{
 		// Stuff below should be moved to correct place in a version that
 		// otherwise changes the protocol version
+		rightclickable = readU8(is);
 	}catch(SerializationError &e) {};
 }
 
diff --git a/src/nodedef.h b/src/nodedef.h
index 8588caeab..fa0c1f2e8 100644
--- a/src/nodedef.h
+++ b/src/nodedef.h
@@ -199,6 +199,8 @@ struct ContentFeatures
 	bool climbable;
 	// Player can build on these
 	bool buildable_to;
+	// Player cannot build to these (placement prediction disabled)
+	bool rightclickable;
 	// Whether the node is non-liquid, source liquid or flowing liquid
 	enum LiquidType liquid_type;
 	// If the content is liquid, this is the flowing version of the liquid.
diff --git a/src/scriptapi.cpp b/src/scriptapi.cpp
index 020709cab..66654813e 100644
--- a/src/scriptapi.cpp
+++ b/src/scriptapi.cpp
@@ -1063,6 +1063,10 @@ static ItemDefinition read_item_definition(lua_State *L, int index,
 	def.usable = lua_isfunction(L, -1);
 	lua_pop(L, 1);
 
+	lua_getfield(L, index, "on_rightclick");
+	def.rightclickable = lua_isfunction(L, -1);
+	lua_pop(L, 1);
+
 	getboolfield(L, index, "liquids_pointable", def.liquids_pointable);
 
 	warn_if_field_exists(L, index, "tool_digging_properties",
@@ -4746,7 +4750,7 @@ static int l_register_item_raw(lua_State *L)
 	// Default to having client-side placement prediction for nodes
 	// ("" in item definition sets it off)
 	if(def.node_placement_prediction == "__default"){
-		if(def.type == ITEM_NODE)
+		if(def.type == ITEM_NODE && !def.rightclickable)
 			def.node_placement_prediction = name;
 		else
 			def.node_placement_prediction = "";
-- 
GitLab