2019-03-08 00:40:43 +02:00
local S = minetest.get_translator ( " mcl_buckets " )
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 " )
2017-11-30 15:46:58 +02:00
local mod_mclx_core = minetest.get_modpath ( " mclx_core " )
2017-07-26 20:00:04 +03:00
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
2018-02-01 23:45:19 +02: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 } )
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)
2019-02-08 22:59:01 +02:00
-- extra_check(pos, placer) = optional function(pos) which can returns false to avoid placing the liquid.
-- placer is object/player who is placing the liquid, can be nil
2017-11-30 15:57:40 +02:00
-- groups = optional list of item groups
2017-08-16 19:49:46 +03:00
--
-- This function can be called from any mod (which depends on this one)
2017-11-30 15:57:40 +02:00
function mcl_buckets . register_liquid ( source_place , source_take , itemname , inventory_image , name , longdesc , usagehelp , extra_check , groups )
2017-08-16 19:49:46 +03:00
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 22:55:25 +02:00
_doc_items_longdesc = longdesc ,
_doc_items_usagehelp = usagehelp ,
2015-06-29 20:55:56 +03:00
inventory_image = inventory_image ,
2017-02-15 03:16:53 +02:00
stack_max = 16 ,
2015-06-29 20:55:56 +03:00
liquids_pointable = true ,
2017-11-30 15:57:40 +02:00
groups = groups ,
2015-06-29 20:55:56 +03:00
on_place = function ( itemstack , user , pointed_thing )
-- Must be pointing to node
if pointed_thing.type ~= " node " then
return
end
2017-03-01 19:31:59 +02: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 19:31:59 +02: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 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 19:31:59 +02:00
local item = itemstack : get_name ( )
2019-02-08 22:59:01 +02:00
if extra_check and extra_check ( place_pos , user ) == false then
2017-08-16 19:49:46 +03:00
-- Fail placement of liquid
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
2019-02-08 22:59:01 +02:00
minetest.record_protection_violation ( place_pos , pns )
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 17:52:38 +02: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 19:31:59 +02: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
2019-02-08 22:59:01 +02:00
minetest.record_protection_violation ( pointed_thing.above , pn )
2015-06-29 20:55:56 +03:00
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 17:52:38 +02: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 03:16:53 +02: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 03:16:53 +02:00
-- Drop empty bucket otherwise.
2017-08-03 17:36:55 +03:00
local new_bucket = ItemStack ( " mcl_buckets:bucket_empty " )
2017-02-15 03:16:53 +02: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
2019-02-01 07:33:07 +02:00
minetest.add_item ( user : get_pos ( ) , new_bucket )
2017-02-15 03:16:53 +02:00
end
itemstack : take_item ( )
return itemstack
end
2017-02-05 18:59:11 +02:00
else
2017-02-15 03:16:53 +02:00
return
2017-02-05 18:59:11 +02:00
end
2018-02-01 23:45:19 +02:00
end ,
_on_dispense = function ( stack , pos , droppos , dropnode , dropdir )
local iname = stack : get_name ( )
local buildable = minetest.registered_nodes [ dropnode.name ] . buildable_to
2019-02-08 22:59:01 +02:00
if extra_check and extra_check ( droppos , nil ) == false then
2018-02-01 23:45:19 +02:00
-- Fail placement of liquid
elseif buildable then
-- buildable; replace the node
local node_place
if type ( source_place ) == " function " then
node_place = source_place ( droppos )
else
node_place = source_place
end
place_liquid ( droppos , node_place )
stack : set_name ( " mcl_buckets:bucket_empty " )
end
return stack
end ,
2015-06-29 20:55:56 +03:00
} )
end
end
2017-08-03 17:36:55 +03:00
minetest.register_craftitem ( " mcl_buckets:bucket_empty " , {
2019-03-08 00:40:43 +02:00
description = S ( " Empty Bucket " ) ,
_doc_items_longdesc = S ( " A bucket can be used to collect and release liquids. " ) ,
_doc_items_usagehelp = S ( " 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. " ) ,
2017-03-02 22:55:25 +02:00
2015-06-29 20:55:56 +03:00
inventory_image = " bucket.png " ,
2017-02-15 03:16:53 +02:00
stack_max = 16 ,
2015-06-29 20:55:56 +03:00
liquids_pointable = true ,
2017-01-12 02:34:41 +02: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
2019-02-08 22:59:01 +02:00
return itemstack
2015-06-29 20:55:56 +03:00
end
2017-03-02 17:20:19 +02:00
-- Call on_rightclick if the pointed node defines it
2017-03-01 19:31:59 +02:00
local node = minetest.get_node ( pointed_thing.under )
local nn = node.name
2017-03-02 17:20:19 +02: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
2019-02-08 22:59:01 +02:00
-- Can't steal liquids
2019-02-11 21:03:56 +02:00
if minetest.is_protected ( pointed_thing.above , user : get_player_name ( ) ) then
2019-02-08 22:59:01 +02:00
minetest.record_protection_violation ( pointed_thing.under , user : get_player_name ( ) )
return itemstack
end
2017-03-02 17:20:19 +02:00
-- Check if pointing to a liquid source
2017-09-08 16:03:56 +03:00
local liquiddef = mcl_buckets.liquids [ nn ]
2017-03-01 19:31:59 +02: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 03:16:53 +02: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 17:52:38 +02:00
doc.mark_entry_as_revealed ( user : get_player_name ( ) , " nodes " , nn )
end
2017-03-01 19:31:59 +02: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-11-30 20:27:57 +02:00
elseif nn == " mcl_cauldrons:cauldron_3r " then
-- Take river water out of full cauldron
minetest.set_node ( pointed_thing.under , { name = " mcl_cauldrons:cauldron " } )
if not minetest.settings : get_bool ( " creative_mode " ) then
new_bucket = ItemStack ( " mcl_buckets:bucket_river_water " )
end
sound_take ( " mclx_core:river_water_source " , pointed_thing.under )
2017-03-01 19:31:59 +02:00
end
-- Add liquid bucket and put it into inventory, if possible.
-- Drop new bucket otherwise.
if new_bucket then
2017-02-15 03:16:53 +02: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
2019-02-01 07:33:07 +02:00
minetest.add_item ( user : get_pos ( ) , new_bucket )
2017-02-15 03:16:53 +02:00
end
2017-08-09 17:17:00 +03:00
if not minetest.settings : get_bool ( " creative_mode " ) then
2017-02-15 03:16:53 +02:00
itemstack : take_item ( )
end
return itemstack
end
2015-06-29 20:55:56 +03:00
end
end ,
2018-02-01 23:45:19 +02:00
_on_dispense = function ( stack , pos , droppos , dropnode , dropdir )
-- Fill empty bucket with liquid or drop bucket if no liquid
local collect_liquid = false
local liquiddef = mcl_buckets.liquids [ dropnode.name ]
local new_bucket
if liquiddef ~= nil and liquiddef.itemname ~= nil and ( dropnode.name == liquiddef.source_take ) then
-- Fill bucket
new_bucket = ItemStack ( { name = liquiddef.itemname , metadata = tostring ( dropnode.param2 ) } )
sound_take ( dropnode.name , droppos )
collect_liquid = true
end
if collect_liquid then
minetest.set_node ( droppos , { name = " air " } )
-- Fill bucket with liquid
stack = new_bucket
else
-- No liquid found: Drop empty bucket
minetest.add_item ( droppos , stack )
stack : take_item ( )
end
return stack
end ,
2015-06-29 20:55:56 +03:00
} )
2017-07-26 20:08:34 +03:00
if mod_mcl_core then
2017-11-30 15:46:58 +02:00
-- Lava bucket
mcl_buckets.register_liquid (
function ( pos )
local dim = mcl_worlds.pos_to_dimension ( pos )
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 " } ,
" mcl_buckets:bucket_lava " ,
" bucket_lava.png " ,
2019-03-08 00:40:43 +02:00
S ( " Lava Bucket " ) ,
S ( " A bucket can be used to collect and release liquids. This one is filled with hot lava, safely contained inside. Use with caution. " ) ,
S ( " 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. " )
2017-11-30 15:46:58 +02:00
)
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 " ,
2019-03-08 00:40:43 +02:00
S ( " Water Bucket " ) ,
S ( " A bucket can be used to collect and release liquids. This one is filled with water. " ) ,
S ( " Right-click on any block to empty the bucket and put a water source on this spot. " ) ,
2019-02-08 22:59:01 +02:00
function ( pos , placer )
-- Check protection
2019-02-09 00:17:08 +02:00
local placer_name = " "
if placer ~= nil then
placer_name = placer : get_player_name ( )
end
2019-02-09 00:29:12 +02:00
if placer and minetest.is_protected ( pos , placer_name ) then
2019-02-08 22:59:01 +02:00
minetest.record_protection_violation ( pos , placer_name )
return false
end
2017-08-21 19:39:41 +03:00
local nn = minetest.get_node ( pos ) . name
-- Pour water into cauldron
2017-11-30 20:27:57 +02:00
if minetest.get_item_group ( nn , " cauldron " ) ~= 0 then
2017-08-21 19:39:41 +03:00
-- Put water into cauldron
2017-11-30 20:27:57 +02:00
if nn ~= " mcl_cauldrons:cauldron_3 " then
minetest.set_node ( pos , { name = " mcl_cauldrons:cauldron_3 " } )
end
2017-08-21 19:39:41 +03:00
sound_place ( " mcl_core:water_source " , pos )
return false
-- Evaporate water if used in Nether (except on cauldron)
2017-08-16 19:49:46 +03:00
else
2017-11-24 04:10:02 +02:00
local dim = mcl_worlds.pos_to_dimension ( pos )
2017-08-21 19:39:41 +03:00
if dim == " nether " then
minetest.sound_play ( " fire_extinguish_flame " , { pos = pos , gain = 0.25 , max_hear_distance = 16 } )
return false
end
2017-08-16 19:49:46 +03:00
end
2017-11-30 15:57:40 +02:00
end ,
{ water_bucket = 1 }
2017-07-26 20:00:04 +03:00
)
2017-11-30 15:46:58 +02:00
end
2015-06-29 20:55:56 +03:00
2017-11-30 15:46:58 +02:00
if mod_mclx_core then
-- River water bucket
2017-08-03 17:36:55 +03:00
mcl_buckets.register_liquid (
2017-11-30 15:46:58 +02:00
" mclx_core:river_water_source " ,
{ " mclx_core:river_water_source " } ,
" mcl_buckets:bucket_river_water " ,
" bucket_river_water.png " ,
2019-03-08 00:40:43 +02:00
S ( " River Water Bucket " ) ,
S ( " A bucket can be used to collect and release liquids. This one is filled with river water. " ) ,
S ( " Right-click on any block to empty the bucket and put a river water source on this spot. " ) ,
2019-02-08 22:59:01 +02:00
function ( pos , placer )
-- Check protection
2019-02-09 00:17:08 +02:00
local placer_name = " "
if placer ~= nil then
placer_name = placer : get_player_name ( )
end
2019-02-09 00:29:12 +02:00
if placer and minetest.is_protected ( pos , placer_name ) then
2019-02-08 22:59:01 +02:00
minetest.record_protection_violation ( pos , placer_name )
return false
end
2017-11-30 15:46:58 +02:00
local nn = minetest.get_node ( pos ) . name
2017-11-30 20:27:57 +02:00
-- Pour into cauldron
if minetest.get_item_group ( nn , " cauldron " ) ~= 0 then
-- Put water into cauldron
if nn ~= " mcl_cauldrons:cauldron_3r " then
minetest.set_node ( pos , { name = " mcl_cauldrons:cauldron_3r " } )
end
sound_place ( " mcl_core:water_source " , pos )
2017-11-30 15:46:58 +02:00
return false
2017-11-30 20:27:57 +02:00
else
-- Evaporate water if used in Nether (except on cauldron)
local dim = mcl_worlds.pos_to_dimension ( pos )
if dim == " nether " then
minetest.sound_play ( " fire_extinguish_flame " , { pos = pos , gain = 0.25 , max_hear_distance = 16 } )
return false
end
2017-08-16 19:49:46 +03:00
end
2017-11-30 15:57:40 +02:00
end ,
{ water_bucket = 1 }
2017-07-26 20:00:04 +03:00
)
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 12:38:21 +02: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
} )