forked from VoxeLibre/VoxeLibre
208 lines
8.1 KiB
Lua
208 lines
8.1 KiB
Lua
local S = minetest.get_translator("mcl_cauldron")
|
|
local modpath = minetest.get_modpath(minetest.get_current_modname())
|
|
|
|
mcl_cauldrons = {}
|
|
-- Cauldron mod, adds cauldrons.
|
|
|
|
dofile(modpath.."/utils.lua")
|
|
dofile(modpath.."/api.lua")
|
|
dofile(modpath.."/register.lua")
|
|
|
|
local function give_item(user, itemstack)
|
|
local inv = user:get_inventory()
|
|
if inv then
|
|
if inv:room_for_item("main", itemstack) then
|
|
inv:add_item("main", itemstack)
|
|
else
|
|
minetest.add_item(user:get_pos(), itemstack)
|
|
end
|
|
--end
|
|
end
|
|
return itemstack
|
|
end
|
|
|
|
-- Convenience function because the cauldron nodeboxes are very similar
|
|
local create_cauldron_nodebox = function(water_level)
|
|
local floor_y
|
|
if water_level == 0 then -- empty
|
|
floor_y = -0.1875
|
|
elseif water_level == 1 then -- 1/3 filled
|
|
floor_y = 1/16
|
|
elseif water_level == 2 then -- 2/3 filled
|
|
floor_y = 4/16
|
|
elseif water_level == 3 then -- full
|
|
floor_y = 7/16
|
|
end
|
|
return {
|
|
type = "fixed",
|
|
fixed = {
|
|
{-0.5, -0.1875, -0.5, -0.375, 0.5, 0.5}, -- Left wall
|
|
{0.375, -0.1875, -0.5, 0.5, 0.5, 0.5}, -- Right wall
|
|
{-0.375, -0.1875, 0.375, 0.375, 0.5, 0.5}, -- Back wall
|
|
{-0.375, -0.1875, -0.5, 0.375, 0.5, -0.375}, -- Front wall
|
|
{-0.5, -0.3125, -0.5, 0.5, floor_y, 0.5}, -- Floor
|
|
{-0.5, -0.5, -0.5, -0.375, -0.3125, -0.25}, -- Left front foot, part 1
|
|
{-0.375, -0.5, -0.5, -0.25, -0.3125, -0.375}, -- Left front foot, part 2
|
|
{-0.5, -0.5, 0.25, -0.375, -0.3125, 0.5}, -- Left back foot, part 1
|
|
{-0.375, -0.5, 0.375, -0.25, -0.3125, 0.5}, -- Left back foot, part 2
|
|
{0.375, -0.5, 0.25, 0.5, -0.3125, 0.5}, -- Right back foot, part 1
|
|
{0.25, -0.5, 0.375, 0.375, -0.3125, 0.5}, -- Right back foot, part 2
|
|
{0.375, -0.5, -0.5, 0.5, -0.3125, -0.25}, -- Right front foot, part 1
|
|
{0.25, -0.5, -0.5, 0.375, -0.3125, -0.375}, -- Right front foot, part 2
|
|
}
|
|
}
|
|
end
|
|
|
|
local cauldron_nodeboxes = {}
|
|
for w=0,3 do
|
|
cauldron_nodeboxes[w] = create_cauldron_nodebox(w)
|
|
end
|
|
|
|
|
|
--local cauldrons_list = {}
|
|
-- Empty cauldron
|
|
minetest.register_node("mcl_cauldrons:cauldron", {
|
|
description = S("Cauldron"),
|
|
_tt_help = S("Stores water"),
|
|
_doc_items_longdesc = S("Cauldrons are used to store water and slowly fill up under rain."),
|
|
_doc_items_usagehelp = S("Place a water pucket into the cauldron to fill it with water. Place an empty bucket on a full cauldron to retrieve the water. Place a water bottle into the cauldron to fill the cauldron to one third with water. Place a glass bottle in a cauldron with water to retrieve one third of the water."),
|
|
wield_image = "mcl_cauldrons_cauldron.png",
|
|
inventory_image = "mcl_cauldrons_cauldron.png",
|
|
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
|
|
drawtype = "nodebox",
|
|
paramtype = "light",
|
|
is_ground_content = false,
|
|
groups = {pickaxey=1, deco_block=1, cauldron=1},
|
|
node_box = cauldron_nodeboxes[0],
|
|
selection_box = { type = "regular" },
|
|
tiles = {
|
|
"mcl_cauldrons_cauldron_inner.png^mcl_cauldrons_cauldron_top.png",
|
|
"mcl_cauldrons_cauldron_inner.png^mcl_cauldrons_cauldron_bottom.png",
|
|
"mcl_cauldrons_cauldron_side.png"
|
|
},
|
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
|
_mcl_hardness = 2,
|
|
_mcl_blast_resistance = 2,
|
|
})
|
|
|
|
function mcl_cauldrons.set_cauldron_level(pos, type, level)
|
|
return minetest.set_node(pos, {name = mcl_cauldrons.get_cauldron_string(type, level)})
|
|
end
|
|
|
|
function mcl_cauldrons.get_cauldron_level(pos)
|
|
local nn = minetest.get_node(pos)
|
|
return minetest.get_item_group(nn.name, "cauldron")
|
|
end
|
|
|
|
function mcl_cauldrons.add_cauldron_level(pos, type, number)
|
|
local current = mcl_cauldrons.get_cauldron_level(pos)
|
|
local number = current + number
|
|
if number > 4 then number = 4 end
|
|
if number < 1 then number = 1 end
|
|
mcl_cauldrons.set_cauldron_level(pos, type, number)
|
|
return number, not current == number
|
|
end
|
|
|
|
function mcl_cauldrons.is_cauldron(name)
|
|
return minetest.get_item_group(name, "cauldron") ~= 0
|
|
end
|
|
|
|
function mcl_cauldrons.take_cauldron(pos, itemstack, user, sounds)
|
|
local nn = minetest.get_node(pos)
|
|
if mcl_cauldrons.registered_cauldrons[nn.name] and mcl_cauldrons.registered_cauldrons[nn.name].bucket then
|
|
if user and not minetest.is_creative_enabled(user:get_player_name()) then
|
|
minetest.set_node(pos, {name="mcl_cauldrons:cauldron"})
|
|
if sounds then minetest.sound_play(sounds.dug, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}, true) end
|
|
return give_item(user, ItemStack(mcl_cauldrons.registered_cauldrons[nn.name].bucket))
|
|
else
|
|
minetest.set_node(pos, {name="mcl_cauldrons:cauldron"})
|
|
if sounds then minetest.sound_play(sounds.dug, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}, true) end
|
|
return itemstack
|
|
end
|
|
else
|
|
minetest.set_node(pos, {name="mcl_cauldrons:cauldron"})
|
|
if sounds then minetest.sound_play(sounds.dug, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}, true) end
|
|
return itemstack
|
|
end
|
|
end
|
|
|
|
function mcl_cauldrons.take_small_cauldron(pos, itemstack, user, sounds)
|
|
local nn = minetest.get_node(pos)
|
|
if mcl_cauldrons.registered_cauldrons[nn.name] and mcl_cauldrons.registered_cauldrons[nn.name].bottle then
|
|
if user and not minetest.is_creative_enabled(user:get_player_name()) then
|
|
local number, changed = mcl_cauldrons.add_cauldron_level(pos, mcl_cauldrons.registered_cauldrons[nn.name].name, -1)
|
|
if changed then
|
|
if sounds then minetest.sound_play(sounds.dug, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}, true) end
|
|
local item_name = mcl_cauldrons.registered_cauldrons[nn.name].bottle
|
|
local inv = placer:get_inventory()
|
|
minetest.sound_play("mcl_potions_bottle_fill", {pos=pointed_thing.under, gain=0.5, max_hear_range=16}, true)
|
|
if minetest.is_creative_enabled(placer:get_player_name()) then
|
|
-- Don't replace empty bottle in creative for convenience reasons
|
|
if not inv:contains_item("main", item_name) then
|
|
inv:add_item("main", item_name)
|
|
end
|
|
elseif itemstack:get_count() == 1 then
|
|
return item_name
|
|
else
|
|
return give_item(user, ItemStack(mcl_cauldrons.registered_cauldrons[nn.name].bucket))
|
|
end
|
|
end
|
|
else
|
|
local number = mcl_cauldrons.add_cauldron_level(pos, mcl_cauldrons.registered_cauldrons[nn.name].name, -1)
|
|
if number ~= 0 then
|
|
if sounds then minetest.sound_play(sounds.dug, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}, true) end
|
|
end
|
|
return itemstack
|
|
end
|
|
else
|
|
local number = mcl_cauldrons.add_cauldron_level(pos, mcl_cauldrons.registered_cauldrons[nn.name].name, -1)
|
|
if number ~= 0 then
|
|
if sounds then minetest.sound_play(sounds.dug, {gain=1.0, pos = pos, pitch = 1 + math.random(-10, 10)*0.005}, true) end
|
|
end
|
|
return itemstack
|
|
end
|
|
end
|
|
|
|
function mcl_cauldrons.get_cauldron_string(type, level)
|
|
if mcl_cauldrons.registered_cauldrons["mcl_cauldrons:cauldron_"..type.."_"..level] then
|
|
return "mcl_cauldrons:cauldron_"..type.."_"..level
|
|
elseif level == 0 then
|
|
return "mcl_cauldrons:cauldron"
|
|
else
|
|
minetest.log("warning", "[mcl_cauldrons] trying to get string from invalid cauldron params")
|
|
return "air"
|
|
end
|
|
end
|
|
|
|
function mcl_cauldrons.register_cauldron_type(def)
|
|
for water_level = 1,3 do
|
|
local id = "mcl_cauldrons:cauldron_"..def.name.."_"..water_level
|
|
mcl_cauldrons.registered_cauldrons[id] = def
|
|
minetest.register_node(id, {
|
|
description = string.format(def.desc, water_level),
|
|
_doc_items_create_entry = false,
|
|
use_texture_alpha = minetest.features.use_texture_alpha_string_modes and "opaque" or false,
|
|
drawtype = "nodebox",
|
|
paramtype = "light",
|
|
is_ground_content = false,
|
|
groups = {pickaxey=1, not_in_creative_inventory=1, cauldron=(1+water_level), cauldron_filled=water_level, comparator_signal=water_level},
|
|
node_box = cauldron_nodeboxes[water_level],
|
|
collision_box = cauldron_nodeboxes[0],
|
|
selection_box = { type = "regular" },
|
|
tiles = {
|
|
"("..def.texture.."^[verticalframe:16:0"..")^mcl_cauldrons_cauldron_top.png",
|
|
"mcl_cauldrons_cauldron_inner.png^mcl_cauldrons_cauldron_bottom.png",
|
|
"mcl_cauldrons_cauldron_side.png"
|
|
},
|
|
sounds = mcl_sounds.node_sound_metal_defaults(),
|
|
drop = "mcl_cauldrons:cauldron",
|
|
_mcl_hardness = 2,
|
|
_mcl_blast_resistance = 2,
|
|
})
|
|
|
|
-- Add entry aliases for the Help
|
|
if minetest.get_modpath("doc") then
|
|
doc.add_entry_alias("nodes", "mcl_cauldrons:cauldron", "nodes", id)
|
|
end
|
|
end
|
|
end |