2015-06-29 20:55:56 +03:00
-- Minetest 0.4 mod: bucket
-- See README.txt for licensing and other information.
2017-08-03 17:36:55 +03:00
minetest.register_alias ( " bucket:bucket_empty " , " mcl_buckets:bucket_empty " )
minetest.register_alias ( " bucket:bucket_water " , " mcl_buckets:bucket_water " )
minetest.register_alias ( " bucket:bucket_lava " , " mcl_buckets:bucket_lava " )
2015-06-29 20:55:56 +03:00
2017-07-26 20:00:04 +03:00
local mod_doc = minetest.get_modpath ( " doc " )
local mod_mcl_core = minetest.get_modpath ( " mcl_core " )
if mod_mcl_core then
minetest.register_craft ( {
2017-08-03 17:36:55 +03:00
output = ' mcl_buckets:bucket_empty 1 ' ,
2017-07-26 20:00:04 +03:00
recipe = {
{ ' mcl_core:iron_ingot ' , ' ' , ' mcl_core:iron_ingot ' } ,
{ ' ' , ' mcl_core:iron_ingot ' , ' ' } ,
}
} )
end
2015-06-29 20:55:56 +03:00
2017-08-03 17:36:55 +03:00
mcl_buckets = { }
mcl_buckets.liquids = { }
2015-06-29 20:55:56 +03:00
2017-06-06 22:50:03 +03:00
-- Sound helper functions for placing and taking liquids
local sound_place = function ( itemname , pos )
local def = minetest.registered_nodes [ itemname ]
if def and def.sounds and def.sounds . place then
minetest.sound_play ( def.sounds . place , { gain = 1.0 , pos = pos } )
end
end
local sound_take = function ( itemname , pos )
local def = minetest.registered_nodes [ itemname ]
if def and def.sounds and def.sounds . dug then
minetest.sound_play ( def.sounds . dug , { gain = 1.0 , pos = pos } )
end
end
2015-06-29 20:55:56 +03:00
-- Register a new liquid
2017-08-16 19:49:46 +03:00
-- source_place = a string or function.
-- * string: name of the node to place
-- * function(pos): will returns name of the node to place with pos being the placement position
-- source_take = table of liquid source node names to take
-- itemname = itemstring of the new bucket item (or nil if liquid is not takeable)
2015-06-29 20:55:56 +03:00
-- inventory_image = texture of the new bucket item (ignored if itemname == nil)
2017-08-16 19:49:46 +03:00
-- name = user-visible bucket description
-- longdesc = long explanatory description (for help)
-- usagehelp = short usage explanation (for help)
-- extra_check = optional function(pos) which can returns false to avoid placing the liquid
--
-- This function can be called from any mod (which depends on this one)
function mcl_buckets . register_liquid ( source_place , source_take , itemname , inventory_image , name , longdesc , usagehelp , extra_check )
for i = 1 , # source_take do
mcl_buckets.liquids [ source_take [ i ] ] = {
source_place = source_place ,
source_take = source_take [ i ] ,
itemname = itemname ,
}
if type ( source_place ) == " string " then
mcl_buckets.liquids [ source_place ] = mcl_buckets.liquids [ source_take [ i ] ]
end
end
2015-06-29 20:55:56 +03:00
if itemname ~= nil then
minetest.register_craftitem ( itemname , {
description = name ,
2017-03-02 23:55:25 +03:00
_doc_items_longdesc = longdesc ,
_doc_items_usagehelp = usagehelp ,
2015-06-29 20:55:56 +03:00
inventory_image = inventory_image ,
2017-02-15 04:16:53 +03:00
stack_max = 16 ,
2015-06-29 20:55:56 +03:00
liquids_pointable = true ,
on_place = function ( itemstack , user , pointed_thing )
-- Must be pointing to node
if pointed_thing.type ~= " node " then
return
end
2017-03-01 20:31:59 +03:00
local node = minetest.get_node ( pointed_thing.under )
2017-08-16 19:49:46 +03:00
local place_pos = pointed_thing.under
2017-03-01 20:31:59 +03:00
local nn = node.name
2015-06-29 20:55:56 +03:00
-- Call on_rightclick if the pointed node defines it
if user and not user : get_player_control ( ) . sneak then
if minetest.registered_nodes [ nn ] and minetest.registered_nodes [ nn ] . on_rightclick then
2017-08-16 19:49:46 +03:00
return minetest.registered_nodes [ nn ] . on_rightclick ( place_pos , node , user , itemstack ) or itemstack
2015-06-29 20:55:56 +03:00
end
end
2017-08-16 19:49:46 +03:00
local place_liquid = function ( pos , itemstring )
local fullness = minetest.registered_nodes [ itemstring ] . liquid_range
sound_place ( itemstring , pos )
minetest.add_node ( pos , { name = itemstring , param2 = fullness } )
2015-06-29 20:55:56 +03:00
end
2017-08-16 19:49:46 +03:00
local node_place
if type ( source_place ) == " function " then
node_place = source_place ( place_pos )
else
node_place = source_place
end
2015-06-29 20:55:56 +03:00
-- Check if pointing to a buildable node
2017-03-01 20:31:59 +03:00
local item = itemstack : get_name ( )
2017-08-16 19:49:46 +03:00
if extra_check and extra_check ( place_pos ) == false then
-- Fail placement of liquid
elseif item == " mcl_buckets:bucket_water " and
2017-03-01 20:31:59 +03:00
( nn == " mcl_cauldrons:cauldron " or
nn == " mcl_cauldrons:cauldron_1 " or
nn == " mcl_cauldrons:cauldron_2 " ) then
-- Put water into cauldron
2017-08-16 19:49:46 +03:00
minetest.set_node ( place_pos , { name = " mcl_cauldrons:cauldron_3 " } )
2017-06-06 22:50:03 +03:00
sound_place ( " mcl_core:water_source " , pos )
2017-08-03 17:36:55 +03:00
elseif item == " mcl_buckets:bucket_water " and nn == " mcl_cauldrons:cauldron_3 " then
2017-06-06 22:50:03 +03:00
sound_place ( " mcl_core:water_source " , pos )
2017-06-29 14:02:53 +03:00
elseif minetest.registered_nodes [ nn ] and minetest.registered_nodes [ nn ] . buildable_to then
2015-06-29 20:55:56 +03:00
-- buildable; replace the node
local pns = user : get_player_name ( )
2017-08-16 19:49:46 +03:00
if minetest.is_protected ( place_pos , pns ) then
2015-06-29 20:55:56 +03:00
return itemstack
end
2017-08-16 19:49:46 +03:00
place_liquid ( place_pos , node_place )
if mod_doc and doc.entry_exists ( " nodes " , node_place ) then
doc.mark_entry_as_revealed ( user : get_player_name ( ) , " nodes " , node_place )
2017-03-20 18:52:38 +03:00
end
2015-06-29 20:55:56 +03:00
else
-- not buildable to; place the liquid above
-- check if the node above can be replaced
2017-03-01 20:31:59 +03:00
local abovenode = minetest.get_node ( pointed_thing.above )
2017-06-29 14:02:53 +03:00
if minetest.registered_nodes [ abovenode.name ] and minetest.registered_nodes [ abovenode.name ] . buildable_to then
2015-06-29 20:55:56 +03:00
local pn = user : get_player_name ( )
if minetest.is_protected ( pointed_thing.above , pn ) then
return itemstack
end
2017-08-16 19:49:46 +03:00
place_liquid ( pointed_thing.above , node_place )
if mod_doc and doc.entry_exists ( " nodes " , node_place ) then
doc.mark_entry_as_revealed ( user : get_player_name ( ) , " nodes " , node_place )
2017-03-20 18:52:38 +03:00
end
2015-06-29 20:55:56 +03:00
else
-- do not remove the bucket with the liquid
return
end
end
2017-02-15 04:16:53 +03:00
-- Handle bucket item and inventory stuff
2017-08-09 17:17:00 +03:00
if not minetest.settings : get_bool ( " creative_mode " ) then
2017-06-06 22:50:03 +03:00
-- Add empty bucket and put it into inventory, if possible.
2017-02-15 04:16:53 +03:00
-- Drop empty bucket otherwise.
2017-08-03 17:36:55 +03:00
local new_bucket = ItemStack ( " mcl_buckets:bucket_empty " )
2017-02-15 04:16:53 +03:00
if itemstack : get_count ( ) == 1 then
return new_bucket
else
local inv = user : get_inventory ( )
if inv : room_for_item ( " main " , new_bucket ) then
inv : add_item ( " main " , new_bucket )
else
minetest.add_item ( user : getpos ( ) , new_bucket )
end
itemstack : take_item ( )
return itemstack
end
2017-02-05 19:59:11 +03:00
else
2017-02-15 04:16:53 +03:00
return
2017-02-05 19:59:11 +03:00
end
2015-06-29 20:55:56 +03:00
end
} )
end
end
2017-08-03 17:36:55 +03:00
minetest.register_craftitem ( " mcl_buckets:bucket_empty " , {
2015-06-29 20:55:56 +03:00
description = " Empty Bucket " ,
2017-03-02 23:55:25 +03:00
_doc_items_longdesc = " A bucket can be used to collect and release liquids. " ,
_doc_items_usagehelp = " Punch a liquid source to collect the liquid. With the filled bucket, you can right-click somewhere to empty the bucket which will create a liquid source at the position you've clicked at. " ,
2015-06-29 20:55:56 +03:00
inventory_image = " bucket.png " ,
2017-02-15 04:16:53 +03:00
stack_max = 16 ,
2015-06-29 20:55:56 +03:00
liquids_pointable = true ,
2017-01-12 03:34:41 +03:00
on_place = function ( itemstack , user , pointed_thing )
2015-06-29 20:55:56 +03:00
-- Must be pointing to node
if pointed_thing.type ~= " node " then
return
end
2017-03-02 18:20:19 +03:00
-- Call on_rightclick if the pointed node defines it
2017-03-01 20:31:59 +03:00
local node = minetest.get_node ( pointed_thing.under )
local nn = node.name
2017-03-02 18:20:19 +03:00
if user and not user : get_player_control ( ) . sneak then
if minetest.registered_nodes [ nn ] and minetest.registered_nodes [ nn ] . on_rightclick then
return minetest.registered_nodes [ nn ] . on_rightclick ( pointed_thing.under , node , user , itemstack ) or itemstack
end
end
-- Check if pointing to a liquid source
2017-08-03 17:36:55 +03:00
liquiddef = mcl_buckets.liquids [ nn ]
2017-03-01 20:31:59 +03:00
local new_bucket
2017-08-16 19:49:46 +03:00
if liquiddef ~= nil and liquiddef.itemname ~= nil and ( nn == liquiddef.source_take ) then
2015-06-29 20:55:56 +03:00
2017-05-23 23:06:03 +03:00
-- Fill bucket, but not in Creative Mode
2017-08-09 17:17:00 +03:00
if not minetest.settings : get_bool ( " creative_mode " ) then
2017-05-23 23:06:03 +03:00
new_bucket = ItemStack ( { name = liquiddef.itemname , metadata = tostring ( node.param2 ) } )
end
2017-02-15 04:16:53 +03:00
2015-06-29 20:55:56 +03:00
minetest.add_node ( pointed_thing.under , { name = " air " } )
2017-06-06 22:50:03 +03:00
sound_take ( nn , pointed_thing.under )
2015-06-29 20:55:56 +03:00
2017-07-26 20:00:04 +03:00
if mod_doc and doc.entry_exists ( " nodes " , nn ) then
2017-03-20 18:52:38 +03:00
doc.mark_entry_as_revealed ( user : get_player_name ( ) , " nodes " , nn )
end
2017-03-01 20:31:59 +03:00
elseif nn == " mcl_cauldrons:cauldron_3 " then
-- Take water out of full cauldron
minetest.set_node ( pointed_thing.under , { name = " mcl_cauldrons:cauldron " } )
2017-08-09 17:17:00 +03:00
if not minetest.settings : get_bool ( " creative_mode " ) then
2017-08-03 17:36:55 +03:00
new_bucket = ItemStack ( " mcl_buckets:bucket_water " )
2017-05-23 23:06:03 +03:00
end
2017-06-06 22:50:03 +03:00
sound_take ( " mcl_core:water_source " , pointed_thing.under )
2017-03-01 20:31:59 +03:00
end
-- Add liquid bucket and put it into inventory, if possible.
-- Drop new bucket otherwise.
if new_bucket then
2017-02-15 04:16:53 +03:00
if itemstack : get_count ( ) == 1 then
return new_bucket
else
local inv = user : get_inventory ( )
if inv : room_for_item ( " main " , new_bucket ) then
inv : add_item ( " main " , new_bucket )
else
minetest.add_item ( user : getpos ( ) , new_bucket )
end
2017-08-09 17:17:00 +03:00
if not minetest.settings : get_bool ( " creative_mode " ) then
2017-02-15 04:16:53 +03:00
itemstack : take_item ( )
end
return itemstack
end
2015-06-29 20:55:56 +03:00
end
end ,
} )
2017-07-26 20:08:34 +03:00
if mod_mcl_core then
2017-08-16 19:49:46 +03:00
-- Water bucket
2017-08-03 17:36:55 +03:00
mcl_buckets.register_liquid (
2017-07-26 20:00:04 +03:00
" mcl_core:water_source " ,
2017-08-16 19:49:46 +03:00
{ " mcl_core:water_source " } ,
2017-08-03 17:36:55 +03:00
" mcl_buckets:bucket_water " ,
2017-07-26 20:00:04 +03:00
" bucket_water.png " ,
" Water Bucket " ,
" A bucket can be used to collect and release liquids. This one is filled with water. " ,
2017-08-16 19:49:46 +03:00
" Right-click on any block to empty the bucket and put a water source on this spot. " ,
function ( pos )
local _ , dim = mcl_util.y_to_layer ( pos.y )
if dim == " nether " then
minetest.sound_play ( " fire_extinguish_flame " , { pos = pos , gain = 0.25 , max_hear_distance = 16 } )
return false
else
return true
end
end
2017-07-26 20:00:04 +03:00
)
2015-06-29 20:55:56 +03:00
2017-08-16 19:49:46 +03:00
-- Lava bucket
2017-08-03 17:36:55 +03:00
mcl_buckets.register_liquid (
2017-08-16 19:49:46 +03:00
function ( pos )
local _ , dim = mcl_util.y_to_layer ( pos.y )
if dim == " nether " then
return " mcl_nether:nether_lava_source "
else
return " mcl_core:lava_source "
end
end ,
{ " mcl_core:lava_source " , " mcl_nether:nether_lava_source " } ,
2017-08-03 17:36:55 +03:00
" mcl_buckets:bucket_lava " ,
2017-07-26 20:00:04 +03:00
" bucket_lava.png " ,
" Lava Bucket " ,
" A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution. " ,
" Choose a place where you want to empty the bucket, then get in a safe spot somewhere above it. Be prepared to run away when something goes wrong as the lava will soon start to flow after placing. To empty the bucket (which places a lava source), right-click on your chosen place. "
)
end
2015-06-29 20:55:56 +03:00
minetest.register_craft ( {
type = " fuel " ,
2017-08-03 17:36:55 +03:00
recipe = " mcl_buckets:bucket_lava " ,
2017-01-04 13:38:21 +03:00
burntime = 1000 ,
2017-08-03 17:36:55 +03:00
replacements = { { " mcl_buckets:bucket_lava " , " mcl_buckets:bucket_empty " } } ,
2015-06-29 20:55:56 +03:00
} )