Improved can usage

Make the use of cans more like the digging and placement of ordinary
nodes, and specifically make it much closer to the use of buckets.
The main change is that left-click with a can is now only used to take
liquid; placing liquid is now done with a right-click.  This makes the use
of cans a lot less error-prone, compared to the old scheme of determining
the operation based on the type of node pointed to.  Other changes are
that liquid placement is now permitted to replace any buildable_to node,
and the cans obey node protection.
This commit is contained in:
Zefram 2014-07-21 00:22:47 +01:00
parent 6771ad9d33
commit 62e04b9c0d

@ -12,6 +12,14 @@ local function set_can_wear(itemstack, level, max_level)
itemstack:set_wear(temp) itemstack:set_wear(temp)
end end
local function get_can_level(itemstack)
if itemstack:get_metadata() == "" then
return 0
else
return tonumber(itemstack:get_metadata())
end
end
function technic.register_can(d) function technic.register_can(d)
local data = {} local data = {}
for k, v in pairs(d) do data[k] = v end for k, v in pairs(d) do data[k] = v end
@ -22,46 +30,44 @@ function technic.register_can(d)
wear_represents = "content_level", wear_represents = "content_level",
liquids_pointable = true, liquids_pointable = true,
on_use = function(itemstack, user, pointed_thing) on_use = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then if pointed_thing.type ~= "node" then return end
local node = minetest.get_node(pointed_thing.under)
if node.name ~= data.liquid_source_name then return end
local charge = get_can_level(itemstack)
if charge == data.can_capacity then return end
if minetest.is_protected(pointed_thing.under, user:get_player_name()) then
minetest.log("action", user:get_player_name().." tried to take "..node.name.." at protected position "..minetest.pos_to_string(pointed_thing.under).." with a "..data.can_name)
return return
end end
node = minetest.get_node(pointed_thing.under) minetest.remove_node(pointed_thing.under)
charge = charge + 1
local charge = nil itemstack:set_metadata(tostring(charge))
if itemstack:get_metadata() == "" then set_can_wear(itemstack, charge, data.can_capacity)
charge = 0 return itemstack
else end,
charge = tonumber(itemstack:get_metadata()) on_place = function(itemstack, user, pointed_thing)
if pointed_thing.type ~= "node" then return end
local pos = pointed_thing.under
local def = minetest.registered_nodes[minetest.get_node(pos).name] or {}
if def.on_rightclick and user and not user:get_player_control().sneak then
return def.on_rightclick(pos, minetest.get_node(pos), user, itemstack, pointed_thing)
end end
if node.name == data.liquid_source_name then if not def.buildable_to then
if charge < data.can_capacity then pos = pointed_thing.above
minetest.remove_node(pointed_thing.under) def = minetest.registered_nodes[minetest.get_node(pos).name] or {}
charge = charge + 1 if not def.buildable_to then return end
itemstack:set_metadata(tostring(charge))
set_can_wear(itemstack, charge, data.can_capacity)
end
return itemstack
end end
if charge == 0 then local charge = get_can_level(itemstack)
if charge == 0 then return end
if minetest.is_protected(pos, user:get_player_name()) then
minetest.log("action", user:get_player_name().." tried to place "..data.liquid_source_name.." at protected position "..minetest.pos_to_string(pos).." with a "..data.can_name)
return return
end end
minetest.set_node(pos, {name=data.liquid_source_name})
if node.name == data.liquid_flowing_name then charge = charge - 1
minetest.set_node(pointed_thing.under, {name=data.liquid_source_name}) itemstack:set_metadata(tostring(charge))
charge = charge - 1 set_can_wear(itemstack, charge, data.can_capacity)
itemstack:set_metadata(tostring(charge)) return itemstack
set_can_wear(itemstack, charge, data.can_capacity)
return itemstack
end
node = minetest.get_node(pointed_thing.above)
if node.name == "air" then
minetest.set_node(pointed_thing.above, {name=data.liquid_source_name})
charge = charge - 1
itemstack:set_metadata(tostring(charge))
set_can_wear(itemstack, charge, data.can_capacity)
return itemstack
end
end, end,
on_refill = function(stack) on_refill = function(stack)
stack:set_metadata(tostring(data.can_capacity)) stack:set_metadata(tostring(data.can_capacity))