Allow interaction with nodes while wielding these items.
authorAuke Kok <sofar@foo-projects.org>
Sun, 12 Feb 2017 00:23:43 +0000 (16:23 -0800)
committerAuke Kok <sofar+github@foo-projects.org>
Wed, 1 Mar 2017 02:16:12 +0000 (18:16 -0800)
- beds
- boats
- carts
- key/skeleton key
- seeds

All these had on_place handlers that did not allow nodes with
an on_rightclick() handler to be used first (if not using
sneak). This code is taken from the torches mod and applied
everywhere.

This allows all these items to e.g. be inserted into the `frame`
mod's item frames.

mods/beds/api.lua
mods/boats/init.lua
mods/carts/cart_entity.lua
mods/default/tools.lua
mods/farming/api.lua

index 4df6b4a3282f6649cb297958f8abbb548843a292..daa6d8e2622265ae88defe2573bdabf4a3e9bfca 100644 (file)
@@ -46,6 +46,14 @@ function beds.register_bed(name, def)
 
                on_place = function(itemstack, placer, pointed_thing)
                        local under = pointed_thing.under
+                       local node = minetest.get_node(under)
+                       local udef = minetest.registered_nodes[node.name]
+                       if udef and udef.on_rightclick and
+                                       not (placer and placer:get_player_control().sneak) then
+                               return udef.on_rightclick(under, node, placer, itemstack,
+                                       pointed_thing) or itemstack
+                       end
+
                        local pos
                        if minetest.registered_items[minetest.get_node(under).name].buildable_to then
                                pos = under
index 0591ef24f692eb827c5e688983edabd352ab7af0..6e1565d49f5f0cd1a9a083502fad4bd4f1f5362e 100644 (file)
@@ -225,6 +225,15 @@ minetest.register_craftitem("boats:boat", {
        groups = {flammable = 2},
 
        on_place = function(itemstack, placer, pointed_thing)
+               local under = pointed_thing.under
+               local node = minetest.get_node(under)
+               local udef = minetest.registered_nodes[node.name]
+               if udef and udef.on_rightclick and
+                               not (placer and placer:get_player_control().sneak) then
+                       return udef.on_rightclick(under, node, placer, itemstack,
+                               pointed_thing) or itemstack
+               end
+
                if pointed_thing.type ~= "node" then
                        return itemstack
                end
index e8707fb4d2adb68531e260b9a6b0b3a490fd83cf..bf0a450d2e90407d2ad6e2a9212a16659b1c9fba 100644 (file)
@@ -362,6 +362,15 @@ minetest.register_craftitem("carts:cart", {
        inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_side.png", "carts_cart_side.png"),
        wield_image = "carts_cart_side.png",
        on_place = function(itemstack, placer, pointed_thing)
+               local under = pointed_thing.under
+               local node = minetest.get_node(under)
+               local udef = minetest.registered_nodes[node.name]
+               if udef and udef.on_rightclick and
+                               not (placer and placer:get_player_control().sneak) then
+                       return udef.on_rightclick(under, node, placer, itemstack,
+                               pointed_thing) or itemstack
+               end
+
                if not pointed_thing.type == "node" then
                        return
                end
index c7ea161951f35cf6d88a1f9ea040379c8d42d7a2..51854b930a8552dd47af5b4121ab9c698b71af57 100644 (file)
@@ -384,12 +384,21 @@ minetest.register_tool("default:skeleton_key", {
        inventory_image = "default_key_skeleton.png",
        groups = {key = 1},
        on_place = function(itemstack, placer, pointed_thing)
+               local under = pointed_thing.under
+               local node = minetest.get_node(under)
+               local def = minetest.registered_nodes[node.name]
+               if def and def.on_rightclick and
+                               not (placer and placer:get_player_control().sneak) then
+                       return def.on_rightclick(under, node, placer, itemstack,
+                               pointed_thing) or itemstack
+               end
+
                if pointed_thing.type ~= "node" then
                        return itemstack
                end
 
                local pos = pointed_thing.under
-               local node = minetest.get_node(pos)
+               node = minetest.get_node(pos)
 
                if not node then
                        return itemstack
@@ -427,12 +436,20 @@ minetest.register_tool("default:key", {
        groups = {key = 1, not_in_creative_inventory = 1},
        stack_max = 1,
        on_place = function(itemstack, placer, pointed_thing)
+               local under = pointed_thing.under
+               local node = minetest.get_node(under)
+               local def = minetest.registered_nodes[node.name]
+               if def and def.on_rightclick and
+                               not (placer and placer:get_player_control().sneak) then
+                       return def.on_rightclick(under, node, placer, itemstack,
+                               pointed_thing) or itemstack
+               end
                if pointed_thing.type ~= "node" then
                        return itemstack
                end
 
                local pos = pointed_thing.under
-               local node = minetest.get_node(pos)
+               node = minetest.get_node(pos)
 
                if not node or node.name == "ignore" then
                        return itemstack
index b6e3ee3e8ee6eecc2b9313bfa5cd1b282b9ba9ae..0ba756cc756a7ca0451139c3b25cbd1525acc162 100644 (file)
@@ -313,6 +313,15 @@ farming.register_plant = function(name, def)
                }),
 
                on_place = function(itemstack, placer, pointed_thing)
+                       local under = pointed_thing.under
+                       local node = minetest.get_node(under)
+                       local udef = minetest.registered_nodes[node.name]
+                       if udef and udef.on_rightclick and
+                                       not (placer and placer:get_player_control().sneak) then
+                               return udef.on_rightclick(under, node, placer, itemstack,
+                                       pointed_thing) or itemstack
+                       end
+
                        return farming.place_seed(itemstack, placer, pointed_thing, mname .. ":seed_" .. pname)
                end,
                next_plant = mname .. ":" .. pname .. "_1",