2015-06-29 19:55:56 +02:00
-- Minetest 0.4 mod: bucket
-- See README.txt for licensing and other information.
local LIQUID_MAX = 8 -- The number of water levels when liquid_finite is enabled
minetest.register_alias ( " bucket " , " bucket:bucket_empty " )
minetest.register_alias ( " bucket_water " , " bucket:bucket_water " )
minetest.register_alias ( " bucket_lava " , " bucket:bucket_lava " )
2017-07-26 19:00:04 +02: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 ( {
output = ' bucket:bucket_empty 1 ' ,
recipe = {
{ ' mcl_core:iron_ingot ' , ' ' , ' mcl_core:iron_ingot ' } ,
{ ' ' , ' mcl_core:iron_ingot ' , ' ' } ,
}
} )
end
2015-06-29 19:55:56 +02:00
bucket = { }
bucket.liquids = { }
2017-06-06 21:50:03 +02: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 19:55:56 +02:00
-- Register a new liquid
-- source = name of the source node
-- flowing = name of the flowing node
-- itemname = name of the new bucket item (or nil if liquid is not takeable)
-- inventory_image = texture of the new bucket item (ignored if itemname == nil)
-- This function can be called from any mod (that depends on bucket).
2017-03-02 21:55:25 +01:00
function bucket . register_liquid ( source , flowing , itemname , inventory_image , name , longdesc , usagehelp )
2015-06-29 19:55:56 +02:00
bucket.liquids [ source ] = {
source = source ,
flowing = flowing ,
itemname = itemname ,
}
bucket.liquids [ flowing ] = bucket.liquids [ source ]
if itemname ~= nil then
minetest.register_craftitem ( itemname , {
description = name ,
2017-03-02 21:55:25 +01:00
_doc_items_longdesc = longdesc ,
_doc_items_usagehelp = usagehelp ,
2015-06-29 19:55:56 +02:00
inventory_image = inventory_image ,
2017-02-15 02:16:53 +01:00
stack_max = 16 ,
2015-06-29 19:55:56 +02: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 18:31:59 +01:00
local node = minetest.get_node ( pointed_thing.under )
local nn = node.name
2015-06-29 19:55:56 +02: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-03-01 18:31:59 +01:00
return minetest.registered_nodes [ nn ] . on_rightclick ( pointed_thing.under , node , user , itemstack ) or itemstack
2015-06-29 19:55:56 +02:00
end
end
local place_liquid = function ( pos , node , source , flowing , fullness )
2017-06-06 21:50:03 +02:00
sound_place ( source , pos )
2015-06-29 19:55:56 +02:00
if math.floor ( fullness / 128 ) == 1 or ( not minetest.setting_getbool ( " liquid_finite " ) ) then
minetest.add_node ( pos , { name = source , param2 = fullness } )
return
elseif node.name == flowing then
fullness = fullness + node.param2
elseif node.name == source then
fullness = LIQUID_MAX
end
if fullness >= LIQUID_MAX then
minetest.add_node ( pos , { name = source , param2 = LIQUID_MAX } )
else
minetest.add_node ( pos , { name = flowing , param2 = fullness } )
end
end
-- Check if pointing to a buildable node
local fullness = tonumber ( itemstack : get_metadata ( ) )
if not fullness then fullness = LIQUID_MAX end
2017-03-01 18:31:59 +01:00
local item = itemstack : get_name ( )
if item == " bucket:bucket_water " and
( nn == " mcl_cauldrons:cauldron " or
nn == " mcl_cauldrons:cauldron_1 " or
nn == " mcl_cauldrons:cauldron_2 " ) then
-- Put water into cauldron
minetest.set_node ( pointed_thing.under , { name = " mcl_cauldrons:cauldron_3 " } )
2017-06-06 21:50:03 +02:00
sound_place ( " mcl_core:water_source " , pos )
2017-03-01 18:31:59 +01:00
elseif item == " bucket:bucket_water " and nn == " mcl_cauldrons:cauldron_3 " then
2017-06-06 21:50:03 +02:00
sound_place ( " mcl_core:water_source " , pos )
2017-06-29 13:02:53 +02:00
elseif minetest.registered_nodes [ nn ] and minetest.registered_nodes [ nn ] . buildable_to then
2015-06-29 19:55:56 +02:00
-- buildable; replace the node
local pns = user : get_player_name ( )
if minetest.is_protected ( pointed_thing.under , pns ) then
return itemstack
end
place_liquid ( pointed_thing.under , node , source , flowing , fullness )
2017-07-26 19:00:04 +02:00
if mod_doc and doc.entry_exists ( " nodes " , source ) then
2017-03-20 16:52:38 +01:00
doc.mark_entry_as_revealed ( user : get_player_name ( ) , " nodes " , source )
end
2015-06-29 19:55:56 +02:00
else
-- not buildable to; place the liquid above
-- check if the node above can be replaced
2017-03-01 18:31:59 +01:00
local abovenode = minetest.get_node ( pointed_thing.above )
2017-06-29 13:02:53 +02:00
if minetest.registered_nodes [ abovenode.name ] and minetest.registered_nodes [ abovenode.name ] . buildable_to then
2015-06-29 19:55:56 +02:00
local pn = user : get_player_name ( )
if minetest.is_protected ( pointed_thing.above , pn ) then
return itemstack
end
place_liquid ( pointed_thing.above , node , source , flowing , fullness )
2017-07-26 19:00:04 +02:00
if mod_doc and doc.entry_exists ( " nodes " , source ) then
2017-03-20 16:52:38 +01:00
doc.mark_entry_as_revealed ( user : get_player_name ( ) , " nodes " , source )
end
2015-06-29 19:55:56 +02:00
else
-- do not remove the bucket with the liquid
return
end
end
2017-02-15 02:16:53 +01:00
-- Handle bucket item and inventory stuff
2017-02-05 17:59:11 +01:00
if not minetest.setting_getbool ( " creative_mode " ) then
2017-06-06 21:50:03 +02:00
-- Add empty bucket and put it into inventory, if possible.
2017-02-15 02:16:53 +01:00
-- Drop empty bucket otherwise.
local new_bucket = ItemStack ( " bucket:bucket_empty " )
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 17:59:11 +01:00
else
2017-02-15 02:16:53 +01:00
return
2017-02-05 17:59:11 +01:00
end
2015-06-29 19:55:56 +02:00
end
} )
end
end
minetest.register_craftitem ( " bucket:bucket_empty " , {
description = " Empty Bucket " ,
2017-03-02 21:55:25 +01: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 19:55:56 +02:00
inventory_image = " bucket.png " ,
2017-02-15 02:16:53 +01:00
stack_max = 16 ,
2015-06-29 19:55:56 +02:00
liquids_pointable = true ,
2017-01-12 01:34:41 +01:00
on_place = function ( itemstack , user , pointed_thing )
2015-06-29 19:55:56 +02:00
-- Must be pointing to node
if pointed_thing.type ~= " node " then
return
end
2017-03-02 16:20:19 +01:00
-- Call on_rightclick if the pointed node defines it
2017-03-01 18:31:59 +01:00
local node = minetest.get_node ( pointed_thing.under )
local nn = node.name
2017-03-02 16:20:19 +01: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-03-01 18:31:59 +01:00
liquiddef = bucket.liquids [ nn ]
local new_bucket
if liquiddef ~= nil and liquiddef.itemname ~= nil and ( nn == liquiddef.source or
( nn == liquiddef.flowing and minetest.setting_getbool ( " liquid_finite " ) ) ) then
2015-06-29 19:55:56 +02:00
2017-05-23 22:06:03 +02:00
-- Fill bucket, but not in Creative Mode
if not minetest.setting_getbool ( " creative_mode " ) then
new_bucket = ItemStack ( { name = liquiddef.itemname , metadata = tostring ( node.param2 ) } )
end
2017-02-15 02:16:53 +01:00
2015-06-29 19:55:56 +02:00
minetest.add_node ( pointed_thing.under , { name = " air " } )
2017-06-06 21:50:03 +02:00
sound_take ( nn , pointed_thing.under )
2015-06-29 19:55:56 +02:00
2017-07-26 19:00:04 +02:00
if mod_doc and doc.entry_exists ( " nodes " , nn ) then
2017-03-20 16:52:38 +01:00
doc.mark_entry_as_revealed ( user : get_player_name ( ) , " nodes " , nn )
end
2017-03-01 18:31:59 +01: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-05-23 22:06:03 +02:00
if not minetest.setting_getbool ( " creative_mode " ) then
new_bucket = ItemStack ( " bucket:bucket_water " )
end
2017-06-06 21:50:03 +02:00
sound_take ( " mcl_core:water_source " , pointed_thing.under )
2017-03-01 18:31:59 +01:00
end
-- Add liquid bucket and put it into inventory, if possible.
-- Drop new bucket otherwise.
if new_bucket then
2017-02-15 02:16:53 +01: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
if not minetest.setting_getbool ( " creative_mode " ) then
itemstack : take_item ( )
end
return itemstack
end
2015-06-29 19:55:56 +02:00
end
end ,
} )
2017-07-26 19:08:34 +02:00
if mod_mcl_core then
2017-07-26 19:00:04 +02:00
bucket.register_liquid (
" mcl_core:water_source " ,
" mcl_core:water_flowing " ,
" bucket:bucket_water " ,
" bucket_water.png " ,
" Water Bucket " ,
" A bucket can be used to collect and release liquids. This one is filled with water. " ,
" Right-click on any block to empty the bucket and put a water source on this spot. "
)
2015-06-29 19:55:56 +02:00
2017-07-26 19:00:04 +02:00
bucket.register_liquid (
" mcl_core:lava_source " ,
" mcl_core:lava_flowing " ,
" bucket:bucket_lava " ,
" 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 19:55:56 +02:00
minetest.register_craft ( {
type = " fuel " ,
recipe = " bucket:bucket_lava " ,
2017-01-04 11:38:21 +01:00
burntime = 1000 ,
2015-06-29 19:55:56 +02:00
replacements = { { " bucket:bucket_lava " , " bucket:bucket_empty " } } ,
} )