diff options
author | FaceDeer <derksenmobile@gmail.com> | 2017-11-16 16:53:01 -0700 |
---|---|---|
committer | FaceDeer <derksenmobile@gmail.com> | 2017-11-16 16:53:01 -0700 |
commit | 123e470544f2395ef7e06a7cf309c77c2472d128 (patch) | |
tree | 154708c35337b47e9b38c06de18776e06a157d77 | |
parent | 317877cda51f67cdae75314ac167d5dd69276d64 (diff) |
Add filters to prevent non-whitelisted craft items from being built
-rw-r--r-- | nodes/node_builders.lua | 9 | ||||
-rw-r--r-- | util_item_place_node.lua | 13 |
2 files changed, 19 insertions, 3 deletions
diff --git a/nodes/node_builders.lua b/nodes/node_builders.lua index 63d780c..8cc91b4 100644 --- a/nodes/node_builders.lua +++ b/nodes/node_builders.lua @@ -158,9 +158,16 @@ minetest.register_node("digtron:builder", { end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if minetest.get_item_group(stack:get_name(), "digtron") ~= 0 then + local stack_name = stack:get_name() + + if minetest.get_item_group(stack_name, "digtron") ~= 0 then return 0 -- don't allow builders to be set to build Digtron nodes, they'll just clog the output. end + + if not minetest.registered_nodes[stack_name] and not digtron.whitelisted_on_place(stack_name) then + return 0 -- don't allow craft items unless their on_place is whitelisted. + end + local inv = minetest.get_inventory({type="node", pos=pos}) inv:set_stack(listname, index, stack:take_item(1)) return 0 diff --git a/util_item_place_node.lua b/util_item_place_node.lua index 049bf71..3ff580d 100644 --- a/util_item_place_node.lua +++ b/util_item_place_node.lua @@ -32,7 +32,7 @@ local function has_prefix(str, prefix) return str:sub(1, string.len(prefix)) == prefix end -local function whitelisted_on_place(item_name) +digtron.whitelisted_on_place = function (item_name) for listed_item, value in pairs(digtron.builder_on_place_items) do if item_name == listed_item then return value end end @@ -76,6 +76,7 @@ local function check_attached_node(p, n) end digtron.item_place_node = function(itemstack, placer, place_to, param2) + local item_name = itemstack:get_name() local def = itemstack:get_definition() if not def then return itemstack, false @@ -87,7 +88,7 @@ digtron.item_place_node = function(itemstack, placer, place_to, param2) pointed_thing.under = {x=place_to.x, y=place_to.y - 1, z=place_to.z} -- Handle node-specific on_place calls as best we can. - if def.on_place and def.on_place ~= minetest.nodedef_default.on_place and whitelisted_on_place(itemstack:get_name()) then + if def.on_place and def.on_place ~= minetest.nodedef_default.on_place and digtron.whitelisted_on_place(item_name) then if def.paramtype2 == "facedir" then pointed_thing.under = vector.add(place_to, minetest.facedir_to_dir(param2)) elseif def.paramtype2 == "wallmounted" then @@ -110,6 +111,14 @@ digtron.item_place_node = function(itemstack, placer, place_to, param2) return returnstack, success end + if minetest.registered_nodes[item_name] == nil then + -- Permitted craft items are handled by the node-specific on_place call, above. + -- if we are a craft item and we get here then we're not whitelisted and we should fail. + -- Note that builders should be filtering out craft items like this, but this will protect us + -- just in case. + return itemstack, false + end + local oldnode = minetest.get_node_or_nil(place_to) --this should never happen, digtron is testing for adjacent unloaded nodes before getting here. |