Disable placement prediction for nodes that use on_rightclick

This commit is contained in:
Jeija 2013-01-27 10:33:25 +01:00 committed by PilzAdam
parent 214a8b4597
commit 365c169b43
6 changed files with 15 additions and 2 deletions

@ -2531,7 +2531,8 @@ void the_game(
// make that happen // make that happen
const ItemDefinition &def = const ItemDefinition &def =
playeritem.getDefinition(itemdef); playeritem.getDefinition(itemdef);
if(def.node_placement_prediction != "") if(def.node_placement_prediction != ""
&& !nodedef->get(map.getNode(nodepos)).rightclickable)
do{ // breakable do{ // breakable
verbosestream<<"Node placement prediction for " verbosestream<<"Node placement prediction for "
<<playeritem.name<<" is " <<playeritem.name<<" is "

@ -100,6 +100,7 @@ void ItemDefinition::reset()
wield_scale = v3f(1.0, 1.0, 1.0); wield_scale = v3f(1.0, 1.0, 1.0);
stack_max = 99; stack_max = 99;
usable = false; usable = false;
rightclickable = false;
liquids_pointable = false; liquids_pointable = false;
if(tool_capabilities) if(tool_capabilities)
{ {

@ -62,6 +62,8 @@ struct ItemDefinition
*/ */
s16 stack_max; s16 stack_max;
bool usable; bool usable;
// If true, don't use node placement prediction
bool rightclickable;
bool liquids_pointable; bool liquids_pointable;
// May be NULL. If non-NULL, deleted by destructor // May be NULL. If non-NULL, deleted by destructor
ToolCapabilities *tool_capabilities; ToolCapabilities *tool_capabilities;

@ -199,6 +199,7 @@ void ContentFeatures::reset()
diggable = true; diggable = true;
climbable = false; climbable = false;
buildable_to = false; buildable_to = false;
rightclickable = true;
liquid_type = LIQUID_NONE; liquid_type = LIQUID_NONE;
liquid_alternative_flowing = ""; liquid_alternative_flowing = "";
liquid_alternative_source = ""; liquid_alternative_source = "";
@ -271,6 +272,7 @@ void ContentFeatures::serialize(std::ostream &os, u16 protocol_version)
serializeSimpleSoundSpec(sound_dug, os); serializeSimpleSoundSpec(sound_dug, os);
// Stuff below should be moved to correct place in a version that otherwise changes // Stuff below should be moved to correct place in a version that otherwise changes
// the protocol version // the protocol version
writeU8(os, rightclickable);
} }
void ContentFeatures::deSerialize(std::istream &is) void ContentFeatures::deSerialize(std::istream &is)
@ -334,6 +336,7 @@ void ContentFeatures::deSerialize(std::istream &is)
try{ try{
// Stuff below should be moved to correct place in a version that // Stuff below should be moved to correct place in a version that
// otherwise changes the protocol version // otherwise changes the protocol version
rightclickable = readU8(is);
}catch(SerializationError &e) {}; }catch(SerializationError &e) {};
} }

@ -199,6 +199,8 @@ struct ContentFeatures
bool climbable; bool climbable;
// Player can build on these // Player can build on these
bool buildable_to; bool buildable_to;
// Player cannot build to these (placement prediction disabled)
bool rightclickable;
// Whether the node is non-liquid, source liquid or flowing liquid // Whether the node is non-liquid, source liquid or flowing liquid
enum LiquidType liquid_type; enum LiquidType liquid_type;
// If the content is liquid, this is the flowing version of the liquid. // If the content is liquid, this is the flowing version of the liquid.

@ -1063,6 +1063,10 @@ static ItemDefinition read_item_definition(lua_State *L, int index,
def.usable = lua_isfunction(L, -1); def.usable = lua_isfunction(L, -1);
lua_pop(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); getboolfield(L, index, "liquids_pointable", def.liquids_pointable);
warn_if_field_exists(L, index, "tool_digging_properties", 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 // Default to having client-side placement prediction for nodes
// ("" in item definition sets it off) // ("" in item definition sets it off)
if(def.node_placement_prediction == "__default"){ if(def.node_placement_prediction == "__default"){
if(def.type == ITEM_NODE) if(def.type == ITEM_NODE && !def.rightclickable)
def.node_placement_prediction = name; def.node_placement_prediction = name;
else else
def.node_placement_prediction = ""; def.node_placement_prediction = "";