238 lines
9.8 KiB
Lua
238 lines
9.8 KiB
Lua
local S = minetest.get_translator("rp_default")
|
|
|
|
local water_buckets = {
|
|
{ "water", S("Wooden Bucket with Water"), "default_bucket_water.png", "rp_default:water_source", S("Punch to empty the bucket") },
|
|
{ "river_water", S("Wooden Bucket with River Water"), "default_bucket_river_water.png", "rp_default:river_water_source", S("Punch to empty the bucket") },
|
|
{ "swamp_water", S("Wooden Bucket with Swamp Water"), "default_bucket_swamp_water.png", "rp_default:swamp_water_source", S("Punch to empty the bucket") },
|
|
}
|
|
|
|
local node_to_bucket = {}
|
|
for b=1, #water_buckets do
|
|
local data = water_buckets[b]
|
|
local bucket = "rp_default:bucket_"..data[1]
|
|
local nodename = data[4]
|
|
node_to_bucket[nodename] = bucket -- water source
|
|
node_to_bucket["rp_default:bucket_"..data[1]] = bucket -- filled bucket node
|
|
end
|
|
|
|
for b=1, #water_buckets do
|
|
local bucket = water_buckets[b]
|
|
local waterdef = minetest.registered_nodes[bucket[4]]
|
|
local watertile = waterdef.tiles[1]
|
|
minetest.register_node(
|
|
"rp_default:bucket_"..bucket[1],
|
|
{
|
|
description = bucket[2],
|
|
_tt_help = bucket[5],
|
|
|
|
drawtype = "mesh",
|
|
mesh = "rp_default_bucket.obj",
|
|
tiles = {
|
|
{name="rp_default_bucket_node_side_1.png",backface_culling=true},
|
|
{name="rp_default_bucket_node_side_2.png",backface_culling=true},
|
|
{name="rp_default_bucket_node_top_handle.png",backface_culling=true},
|
|
{name="rp_default_bucket_node_bottom_inside.png",backface_culling=true},
|
|
{name="rp_default_bucket_node_bottom_outside.png",backface_culling=true},
|
|
watertile,
|
|
},
|
|
use_texture_alpha = "blend",
|
|
paramtype = "light",
|
|
paramtype2 = "4dir",
|
|
is_ground_content = false,
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = { -6/16, -0.5, -6/16, 6/16, 5/16, 6/16 },
|
|
},
|
|
sounds = rp_sounds.node_sound_planks_defaults({
|
|
place = { name = "rp_default_place_bucket_water", gain = 0.65 },
|
|
dug = { name = "rp_default_dug_bucket_water", gain = 0.7 },
|
|
fall = { name = "rp_default_dug_bucket_water", gain = 0.5 },
|
|
footstep = {},
|
|
}),
|
|
walkable = false,
|
|
floodable = true,
|
|
on_flood = function(pos, oldnode, newnode)
|
|
minetest.add_item(pos, "rp_default:bucket_"..bucket[1])
|
|
end,
|
|
|
|
inventory_image = bucket[3],
|
|
wield_image = bucket[3],
|
|
stack_max = 1,
|
|
wield_scale = {x=1,y=1,z=2},
|
|
liquids_pointable = true,
|
|
groups = { bucket = 2, bucket_water = 1, tool = 1, dig_immediate = 3, attached_node = 1 },
|
|
on_use = function(itemstack, user, pointed_thing)
|
|
local handled, handled_itemstack = util.on_place_pointed_node_handler(itemstack, user, pointed_thing)
|
|
if handled then
|
|
return handled_itemstack
|
|
end
|
|
if util.handle_node_protection(user, pointed_thing) then
|
|
return itemstack
|
|
end
|
|
|
|
local inv=user:get_inventory()
|
|
|
|
local pos = pointed_thing.above
|
|
local above_node = minetest.get_node(pointed_thing.above)
|
|
local under_node = minetest.get_node(pointed_thing.under)
|
|
local above_nodedef = minetest.registered_nodes[above_node.name]
|
|
local under_nodedef = minetest.registered_nodes[under_node.name]
|
|
|
|
if under_nodedef and under_nodedef.buildable_to then
|
|
pos=pointed_thing.under
|
|
end
|
|
|
|
local bucket_placed = false
|
|
if minetest.get_item_group(under_node.name, "bucket") ~= 0 then
|
|
-- Pour water into bucket node
|
|
minetest.set_node(pointed_thing.under, {name = "rp_default:bucket_"..bucket[1], param2=under_node.param2 % 32})
|
|
minetest.sound_play({name="rp_default_bucket_fill_water"}, {pos=pos}, true)
|
|
bucket_placed = true
|
|
elseif not above_nodedef.walkable and above_nodedef.buildable_to then
|
|
-- Place water source node
|
|
minetest.add_node(pos, {name = bucket[4]})
|
|
minetest.sound_play({name="default_place_node_water", gain=0.5}, {pos=pos}, true)
|
|
bucket_placed = true
|
|
end
|
|
|
|
if bucket_placed then
|
|
-- Handle inventory stuff
|
|
if not minetest.is_creative_enabled(user:get_player_name()) then
|
|
if itemstack:get_count() == 1 then
|
|
itemstack:set_name("rp_default:bucket")
|
|
elseif inv:room_for_item("main", {name="rp_default:bucket"}) then
|
|
itemstack:take_item()
|
|
inv:add_item("main", "rp_default:bucket")
|
|
else
|
|
itemstack:take_item()
|
|
local pos = user:get_pos()
|
|
pos.y = math.floor(pos.y + 0.5)
|
|
minetest.add_item(pos, "rp_default:bucket")
|
|
end
|
|
end
|
|
end
|
|
|
|
return itemstack
|
|
end
|
|
})
|
|
end
|
|
|
|
minetest.register_node(
|
|
"rp_default:bucket",
|
|
{
|
|
description = S("Wooden Bucket"),
|
|
_tt_help = S("Punch to collect a liquid source"),
|
|
inventory_image = "default_bucket.png",
|
|
wield_image = "default_bucket.png",
|
|
|
|
drawtype = "mesh",
|
|
mesh = "rp_default_bucket.obj",
|
|
tiles = {
|
|
{name="rp_default_bucket_node_side_1.png",backface_culling=true},
|
|
{name="rp_default_bucket_node_side_2.png",backface_culling=true},
|
|
{name="rp_default_bucket_node_top_handle.png",backface_culling=true},
|
|
{name="rp_default_bucket_node_bottom_inside.png",backface_culling=true},
|
|
{name="rp_default_bucket_node_bottom_outside.png",backface_culling=true},
|
|
"blank.png",
|
|
},
|
|
selection_box = {
|
|
type = "fixed",
|
|
fixed = { -6/16, -0.5, -6/16, 6/16, 5/16, 6/16 },
|
|
},
|
|
sounds = rp_sounds.node_sound_planks_defaults({
|
|
place = { name = "rp_default_place_bucket", gain = 0.65 },
|
|
dug = { name = "rp_default_dug_bucket", gain = 0.7 },
|
|
fall = { name = "rp_default_dug_bucket", gain = 0.5 },
|
|
footstep = {},
|
|
}),
|
|
paramtype = "light",
|
|
paramtype2 = "4dir",
|
|
use_texture_alpha = "clip",
|
|
walkable = false,
|
|
floodable = true,
|
|
on_flood = function(pos, oldnode, newnode)
|
|
minetest.add_item(pos, "rp_default:bucket")
|
|
end,
|
|
|
|
stack_max = 10,
|
|
wield_scale = {x=1,y=1,z=2},
|
|
liquids_pointable = true,
|
|
groups = { bucket = 1, tool = 1, dig_immediate = 3, attached_node = 1, react_on_rain = 1 },
|
|
on_use = function(itemstack, user, pointed_thing)
|
|
if pointed_thing.type ~= "node" then return end
|
|
|
|
local pos_protected = minetest.get_pointed_thing_position(pointed_thing, true)
|
|
if minetest.is_protected(pos_protected, user:get_player_name()) and
|
|
not minetest.check_player_privs(user, "protection_bypass") then
|
|
minetest.record_protection_violation(pos_protected, user:get_player_name())
|
|
return
|
|
end
|
|
|
|
local nodename=minetest.get_node(pointed_thing.under).name
|
|
|
|
local replace_bucket = function(itemstack, new_bucket)
|
|
if minetest.is_creative_enabled(user:get_player_name()) then
|
|
-- no-op
|
|
elseif itemstack:get_count() == 1 then
|
|
itemstack:set_name(new_bucket)
|
|
else
|
|
itemstack:take_item()
|
|
|
|
local inv=user:get_inventory()
|
|
|
|
local bucket = node_to_bucket[nodename]
|
|
if not bucket then
|
|
return itemstack
|
|
end
|
|
|
|
if inv:room_for_item("main", {name=bucket}) then
|
|
inv:add_item("main", bucket)
|
|
else
|
|
local pos = user:get_pos()
|
|
pos.y = math.floor(pos.y + 0.5)
|
|
minetest.add_item(pos, bucket)
|
|
end
|
|
end
|
|
local oldnode = minetest.get_node(pointed_thing.under)
|
|
if minetest.get_item_group(oldnode.name, "bucket") == 2 then
|
|
-- Pick up liquid from bucket node
|
|
minetest.set_node(pointed_thing.under, {name="rp_default:bucket", param2 = oldnode.param2 % 32})
|
|
minetest.sound_play({name="rp_default_bucket_fill_water", pitch=0.95}, {pos=pointed_thing.under}, true)
|
|
else
|
|
-- Pick up liquid source node
|
|
minetest.remove_node(pointed_thing.under)
|
|
minetest.sound_play({name="default_dug_water", gain=0.5}, {pos=pointed_thing.under}, true)
|
|
end
|
|
return itemstack
|
|
end
|
|
|
|
local bucket = node_to_bucket[nodename]
|
|
if bucket then
|
|
itemstack = replace_bucket(itemstack, bucket)
|
|
end
|
|
|
|
return itemstack
|
|
end,
|
|
|
|
_rp_on_rain = function(pos, node)
|
|
-- Fill bucket with water when it rains.
|
|
-- Before the bucket fills, it first increases a hidden "fullness"
|
|
-- value. The rain callback must be called 3 times before the bucket
|
|
-- fills with water. The fullness value is stored in param2.
|
|
local p2 = node.param2
|
|
if p2 < 64 then
|
|
-- We increase param2 by 32 because it's a number divisible by 4 (4dir wraps around)
|
|
p2 = p2 + 32
|
|
minetest.set_node(pos, {name=node.name, param2 = p2})
|
|
minetest.log("verbose", "[rp_default] Bucket at "..minetest.pos_to_string(pos).." got its fullness increased in the rain (param2="..p2..")")
|
|
else
|
|
-- If param2 was 64 or greater, we know that the bucket
|
|
-- was rained into 2 times before. Therefore, this must
|
|
-- be now the 3rd time, so we add the water bucket node.
|
|
p2 = p2 % 32
|
|
minetest.set_node(pos, {name="rp_default:bucket_water", param2 = p2})
|
|
minetest.log("action", "[rp_default] Bucket at "..minetest.pos_to_string(pos).." was filled with water by rain")
|
|
end
|
|
end,
|
|
})
|