Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
215 changes: 102 additions & 113 deletions mods/bucket/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,38 @@
-- See README.txt for licensing and other information.

-- Load support for MT game translation.
local S = minetest.get_translator("bucket")
local S = core.get_translator("bucket")


minetest.register_alias("bucket", "bucket:bucket_empty")
minetest.register_alias("bucket_water", "bucket:bucket_water")
minetest.register_alias("bucket_lava", "bucket:bucket_lava")
core.register_alias("bucket", "bucket:bucket_empty")
core.register_alias("bucket_water", "bucket:bucket_water")
core.register_alias("bucket_lava", "bucket:bucket_lava")

minetest.register_craft({
output = "bucket:bucket_empty 1",
core.register_craft({
output = "bucket:bucket_empty",
recipe = {
{"default:steel_ingot", "", "default:steel_ingot"},
{"", "default:steel_ingot", ""},
}
})

bucket = {}
bucket.liquids = {}
bucket = {liquids = {}}

local function check_protection(pos, name, text)
if minetest.is_protected(pos, name) then
minetest.log("action", (name ~= "" and name or "A mod")
if core.is_protected(pos, name) then
core.log("action", (name ~= "" and name or "A mod")
.. " tried to " .. text
.. " at protected position "
.. minetest.pos_to_string(pos)
.. core.pos_to_string(pos)
.. " with a bucket")
minetest.record_protection_violation(pos, name)
core.record_protection_violation(pos, name)
return true
end
return false
end

local function log_action(pos, name, action)
minetest.log("action", (name ~= "" and name or "A mod")
.. " " .. action .. " at " .. minetest.pos_to_string(pos) .. " with a bucket")
core.log("action", (name ~= "" and name or "A mod")
.. " " .. action .. " at " .. core.pos_to_string(pos) .. " with a bucket")
end

-- Register a new liquid
Expand All @@ -61,137 +59,128 @@ function bucket.register_liquid(source, flowing, itemname, inventory_image, name
}
bucket.liquids[flowing] = bucket.liquids[source]

if itemname ~= nil then
minetest.register_craftitem(itemname_raw, {
description = name,
inventory_image = inventory_image,
stack_max = 1,
liquids_pointable = true,
groups = groups,

on_place = function(itemstack, user, pointed_thing)
-- Must be pointing to node
if pointed_thing.type ~= "node" then
return
end
if not itemname then
return
end

local node = minetest.get_node_or_nil(pointed_thing.under)
local ndef = node and minetest.registered_nodes[node.name]

-- Call on_rightclick if the pointed node defines it
if ndef and ndef.on_rightclick and
not (user and user:is_player() and
user:get_player_control().sneak) then
return ndef.on_rightclick(
pointed_thing.under,
node, user,
itemstack)
end
core.register_craftitem(itemname_raw, {
description = name,
inventory_image = inventory_image,
stack_max = 1,
liquids_pointable = true,
groups = groups,

local lpos
on_place = function(itemstack, user, pointed_thing)
-- Must be pointing to node
if pointed_thing.type ~= "node" then
return
end

-- Check if pointing to a buildable node
if ndef and ndef.buildable_to then
-- buildable; replace the node
lpos = pointed_thing.under
else
-- not buildable to; place the liquid above
-- check if the node above can be replaced
local node = core.get_node_or_nil(pointed_thing.under)
local ndef = node and core.registered_nodes[node.name]

-- Call on_rightclick if the pointed node defines it
if ndef and ndef.on_rightclick and
not (user and user:is_player() and
user:get_player_control().sneak) then
return ndef.on_rightclick(
pointed_thing.under,
node, user,
itemstack)
end

lpos = pointed_thing.above
node = minetest.get_node_or_nil(lpos)
local above_ndef = node and minetest.registered_nodes[node.name]
local lpos = pointed_thing.under

if not above_ndef or not above_ndef.buildable_to then
-- do not remove the bucket with the liquid
return itemstack
end
end
-- Check if node is not buildable_to
if not ndef or not ndef.buildable_to then
-- if node above can be replaced, place the liquid above
lpos = pointed_thing.above
node = core.get_node_or_nil(lpos)
local above_ndef = node and core.registered_nodes[node.name]

local pname = user and user:get_player_name() or ""
if check_protection(lpos, pname, "place "..source) then
return
if not above_ndef or not above_ndef.buildable_to then
-- do not remove the bucket with the liquid
return itemstack
end
end

minetest.set_node(lpos, {name = source})
log_action(lpos, pname, "placed " .. source)
return ItemStack("bucket:bucket_empty")
local pname = user and user:get_player_name() or ""
if check_protection(lpos, pname, "place " .. source) then
return
end
})
end

core.set_node(lpos, {name = source})
log_action(lpos, pname, "placed " .. source)
return ItemStack("bucket:bucket_empty")
end
})
end

minetest.register_craftitem("bucket:bucket_empty", {
core.register_craftitem("bucket:bucket_empty", {
description = S("Empty Bucket"),
inventory_image = "bucket.png",
groups = {tool = 1},
liquids_pointable = true,
on_use = function(itemstack, user, pointed_thing)
local wielded = user:get_wielded_item()
if pointed_thing.type == "object" then
pointed_thing.ref:punch(user, 1.0, { full_punch_interval=1.0 }, nil)
return user:get_wielded_item()
pointed_thing.ref:punch(user, 1.0, {full_punch_interval = 1.0}, nil)
return wielded
elseif pointed_thing.type ~= "node" then
-- do nothing if it's neither object nor node
return
end
-- Check if pointing to a liquid source
local pos = pointed_thing.under
local node = minetest.get_node(pos)
local node = core.get_node(pos)
local liquiddef = bucket.liquids[node.name]
local item_count = user:get_wielded_item():get_count()

if liquiddef ~= nil
and liquiddef.itemname ~= nil
and node.name == liquiddef.source then
local pname = user:get_player_name()
if check_protection(pos, pname, "take ".. node.name) then
return
if not liquiddef or not liquiddef.itemname
or node.name ~= liquiddef.source then
-- non-liquid nodes will have their on_punch triggered
local node_def = core.registered_nodes[node.name]
if node_def then
node_def.on_punch(pos, node, user, pointed_thing)
end
return wielded
end

-- default set to return filled bucket
local giving_back = liquiddef.itemname

-- check if holding more than 1 empty bucket
if item_count > 1 then

-- if space in inventory add filled bucked, otherwise drop as item
local inv = user:get_inventory()
if inv:room_for_item("main", {name=liquiddef.itemname}) then
inv:add_item("main", liquiddef.itemname)
else
local upos = user:get_pos()
upos.y = math.floor(upos.y + 0.5)
minetest.add_item(upos, liquiddef.itemname)
end
local pname = user:get_player_name()
if check_protection(pos, pname, "take " .. node.name) then
return
end

-- set to return empty buckets minus 1
giving_back = "bucket:bucket_empty "..tostring(item_count-1)
-- default set to return filled bucket
local giving_back = liquiddef.itemname

end
-- check if holding more than 1 empty bucket
local item_count = wielded:get_count()
if item_count > 1 then

-- force_renew requires a source neighbour
local source_neighbor = false
if liquiddef.force_renew then
source_neighbor =
minetest.find_node_near(pos, 1, liquiddef.source)
end
if source_neighbor and liquiddef.force_renew then
log_action(pos, pname, "picked up " .. liquiddef.source .. " (force renewed)")
-- if space in inventory add filled bucked, otherwise drop as item
local inv = user:get_inventory()
if inv:room_for_item("main", liquiddef.itemname) then
inv:add_item("main", liquiddef.itemname)
else
minetest.add_node(pos, {name = "air"})
log_action(pos, pname, "picked up " .. liquiddef.source)
local upos = user:get_pos()
upos.y = math.floor(upos.y + 0.5)
core.add_item(upos, liquiddef.itemname)
end

return ItemStack(giving_back)
-- set to return empty buckets minus 1
giving_back = "bucket:bucket_empty " .. tostring(item_count - 1)
end

-- force_renew requires a source neighbour
if liquiddef.force_renew and core.find_node_near(pos, 1, liquiddef.source) then
log_action(pos, pname, "picked up " .. liquiddef.source .. " (force renewed)")
else
-- non-liquid nodes will have their on_punch triggered
local node_def = minetest.registered_nodes[node.name]
if node_def then
node_def.on_punch(pos, node, user, pointed_thing)
end
return user:get_wielded_item()
core.remove_node(pos)
log_action(pos, pname, "picked up " .. liquiddef.source)
end
end,

return ItemStack(giving_back)
end
})

bucket.register_liquid(
Expand Down Expand Up @@ -228,15 +217,15 @@ bucket.register_liquid(
{tool = 1}
)

minetest.register_craft({
core.register_craft({
type = "fuel",
recipe = "bucket:bucket_lava",
burntime = 60,
replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}},
})

-- Register buckets as dungeon loot
if minetest.global_exists("dungeon_loot") then
if core.global_exists("dungeon_loot") then
dungeon_loot.register({
{name = "bucket:bucket_empty", chance = 0.55},
-- water in deserts/ice or above ground, lava otherwise
Expand Down
Loading