Merge pull request 'Lava cauldrons and other cauldron/bucket fixes' (#2350) from lava_cauldron into master

Reviewed-on: MineClone2/MineClone2#2350
Reviewed-by: MysticTempest <mystictempest@noreply.git.minetest.land>
This commit is contained in:
cora 2022-06-22 10:41:20 +00:00
commit ecbc94e822
4 changed files with 76 additions and 60 deletions

View File

@ -29,15 +29,15 @@ local is_creative_enabled = minetest.is_creative_enabled
local is_protected = minetest.is_protected local is_protected = minetest.is_protected
local record_protection_violation = minetest.record_protection_violation local record_protection_violation = minetest.record_protection_violation
if mod_mcl_core then
minetest.register_craft({ minetest.register_craft({
output = "mcl_buckets:bucket_empty 1", output = "mcl_buckets:bucket_empty 1",
recipe = { recipe = {
{"mcl_core:iron_ingot", "", "mcl_core:iron_ingot"}, {"mcl_core:iron_ingot", "", "mcl_core:iron_ingot"},
{"", "mcl_core:iron_ingot", ""}, {"", "mcl_core:iron_ingot", ""},
}, },
}) })
end
mcl_buckets = { mcl_buckets = {
liquids = {}, liquids = {},
@ -88,9 +88,7 @@ end
local pointable_sources = {} local pointable_sources = {}
local function bucket_raycast(user) local function bucket_raycast(user)
--local pos = user:get_pos()
local pos = user:get_pos() local pos = user:get_pos()
--local pos = vector.add(user:get_pos(), user:get_bone_position("Head_Control"))
pos.y = pos.y + user:get_properties().eye_height pos.y = pos.y + user:get_properties().eye_height
local look_dir = user:get_look_dir() local look_dir = user:get_look_dir()
look_dir = vector.multiply(look_dir, 5) look_dir = vector.multiply(look_dir, 5)
@ -100,7 +98,6 @@ local function bucket_raycast(user)
if ray then if ray then
for pointed_thing in ray do for pointed_thing in ray do
if pointed_thing and pointable_sources[get_node(pointed_thing.above).name] then if pointed_thing and pointable_sources[get_node(pointed_thing.above).name] then
--minetest.chat_send_all("found!")
return {under=pointed_thing.under,above=pointed_thing.above} return {under=pointed_thing.under,above=pointed_thing.above}
end end
end end
@ -242,7 +239,6 @@ local function on_place_bucket_empty(itemstack, user, pointed_thing)
if liquid_name then if liquid_name then
local liquid_def = mcl_buckets.liquids[liquid_name] local liquid_def = mcl_buckets.liquids[liquid_name]
if liquid_def then if liquid_def then
--minetest.chat_send_all("test")
-- Fill bucket, but not in Creative Mode -- Fill bucket, but not in Creative Mode
-- FIXME: remove this line -- FIXME: remove this line
--if not is_creative_enabled(user:get_player_name()) then --if not is_creative_enabled(user:get_player_name()) then
@ -282,6 +278,12 @@ local function on_place_bucket_empty(itemstack, user, pointed_thing)
new_bucket = ItemStack("mcl_buckets:bucket_river_water") new_bucket = ItemStack("mcl_buckets:bucket_river_water")
end end
sound_take("mclx_core:river_water_source", pointed_thing.under) sound_take("mclx_core:river_water_source", pointed_thing.under)
elseif nn == "mcl_cauldrons:cauldron_3_lava" then
set_node(pointed_thing.under, {name="mcl_cauldrons:cauldron"})
if not is_creative_enabled(user:get_player_name()) then
new_bucket = ItemStack("mcl_buckets:bucket_lava")
end
sound_take("mcl_core:lava_source", pointed_thing.under)
end end
if new_bucket then if new_bucket then
return give_bucket(new_bucket, itemstack, user) return give_bucket(new_bucket, itemstack, user)
@ -366,7 +368,6 @@ minetest.register_craftitem("mcl_buckets:bucket_empty", {
_doc_items_longdesc = S("A bucket can be used to collect and release liquids."), _doc_items_longdesc = S("A bucket can be used to collect and release liquids."),
_doc_items_usagehelp = S("Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else."), _doc_items_usagehelp = S("Punch a liquid source to collect it. You can then use the filled bucket to place the liquid somewhere else."),
_tt_help = S("Collects liquids"), _tt_help = S("Collects liquids"),
--liquids_pointable = true,
inventory_image = "bucket.png", inventory_image = "bucket.png",
stack_max = 16, stack_max = 16,
_on_dispense = function(stack, pos, droppos, dropnode, dropdir) _on_dispense = function(stack, pos, droppos, dropnode, dropdir)

View File

@ -10,13 +10,6 @@ local function sound_place(itemname, pos)
end end
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, pitch = 1 + math.random(-10, 10)*0.005}, true)
end
end]]
if mod_mcl_core then if mod_mcl_core then
-- Lava bucket -- Lava bucket
mcl_buckets.register_liquid({ mcl_buckets.register_liquid({
@ -34,6 +27,16 @@ if mod_mcl_core then
awards.unlock(user:get_player_name(), "mcl:hotStuff") awards.unlock(user:get_player_name(), "mcl:hotStuff")
end end
end, end,
extra_check = function(pos, placer)
local nn = minetest.get_node(pos).name
if minetest.get_item_group(nn, "cauldron") ~= 0 then
if nn ~= "mcl_cauldrons:cauldron_3_lava" then
minetest.set_node(pos, {name="mcl_cauldrons:cauldron_3_lava"})
end
sound_place("mcl_core:lava_source", pos)
return false, true
end
end,
bucketname = "mcl_buckets:bucket_lava", bucketname = "mcl_buckets:bucket_lava",
inventory_image = "bucket_lava.png", inventory_image = "bucket_lava.png",
name = S("Lava Bucket"), name = S("Lava Bucket"),

View File

@ -5,7 +5,7 @@ local S = minetest.get_translator(minetest.get_current_modname())
-- TODO: Extinguish fire of burning entities -- TODO: Extinguish fire of burning entities
-- Convenience function because the cauldron nodeboxes are very similar -- Convenience function because the cauldron nodeboxes are very similar
local create_cauldron_nodebox = function(water_level) local function create_cauldron_nodebox(water_level)
local floor_y local floor_y
if water_level == 0 then -- empty if water_level == 0 then -- empty
floor_y = -0.1875 floor_y = -0.1875
@ -36,12 +36,6 @@ local create_cauldron_nodebox = function(water_level)
} }
end end
local cauldron_nodeboxes = {}
for w=0,3 do
cauldron_nodeboxes[w] = create_cauldron_nodebox(w)
end
-- Empty cauldron -- Empty cauldron
minetest.register_node("mcl_cauldrons:cauldron", { minetest.register_node("mcl_cauldrons:cauldron", {
description = S("Cauldron"), description = S("Cauldron"),
@ -55,7 +49,7 @@ minetest.register_node("mcl_cauldrons:cauldron", {
paramtype = "light", paramtype = "light",
is_ground_content = false, is_ground_content = false,
groups = {pickaxey=1, deco_block=1, cauldron=1}, groups = {pickaxey=1, deco_block=1, cauldron=1},
node_box = cauldron_nodeboxes[0], node_box = create_cauldron_nodebox(0),
selection_box = { type = "regular" }, selection_box = { type = "regular" },
tiles = { tiles = {
"mcl_cauldrons_cauldron_inner.png^mcl_cauldrons_cauldron_top.png", "mcl_cauldrons_cauldron_inner.png^mcl_cauldrons_cauldron_top.png",
@ -68,12 +62,15 @@ minetest.register_node("mcl_cauldrons:cauldron", {
}) })
-- Template function for cauldrons with water -- Template function for cauldrons with water
local register_filled_cauldron = function(water_level, description, river_water) local function register_filled_cauldron(water_level, description, liquid)
local id = "mcl_cauldrons:cauldron_"..water_level local id = "mcl_cauldrons:cauldron_"..water_level
local water_tex local water_tex
if river_water then if liquid == "river_water" then
id = id .. "r" id = id .. "r"
water_tex = "default_river_water_source_animated.png^[verticalframe:16:0" water_tex = "default_river_water_source_animated.png^[verticalframe:16:0"
elseif liquid == "lava" then
id = id .. "_lava"
water_tex = "default_lava_source_animated.png^[verticalframe:16:0"
else else
water_tex = "default_water_source_animated.png^[verticalframe:16:0" water_tex = "default_water_source_animated.png^[verticalframe:16:0"
end end
@ -85,8 +82,8 @@ local register_filled_cauldron = function(water_level, description, river_water)
paramtype = "light", paramtype = "light",
is_ground_content = false, is_ground_content = false,
groups = {pickaxey=1, not_in_creative_inventory=1, cauldron=(1+water_level), cauldron_filled=water_level, comparator_signal=water_level}, 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], node_box = create_cauldron_nodebox(water_level),
collision_box = cauldron_nodeboxes[0], collision_box = create_cauldron_nodebox(0),
selection_box = { type = "regular" }, selection_box = { type = "regular" },
tiles = { tiles = {
"("..water_tex..")^mcl_cauldrons_cauldron_top.png", "("..water_tex..")^mcl_cauldrons_cauldron_top.png",
@ -106,14 +103,12 @@ local register_filled_cauldron = function(water_level, description, river_water)
end end
-- Filled cauldrons (3 levels) -- Filled cauldrons (3 levels)
register_filled_cauldron(1, S("Cauldron (1/3 Water)")) for i=1,3 do
register_filled_cauldron(2, S("Cauldron (2/3 Water)")) register_filled_cauldron(i, S("Cauldron (" ..i .. "/3 Water)"))
register_filled_cauldron(3, S("Cauldron (3/3 Water)")) register_filled_cauldron(i, S("Cauldron (" ..i .. "/3 Water)"),"lava")
if minetest.get_modpath("mclx_core") then
if minetest.get_modpath("mclx_core") then register_filled_cauldron(i, S("Cauldron (" ..i .. "/3 Water)"),"river_water")
register_filled_cauldron(1, S("Cauldron (1/3 River Water)"), true) end
register_filled_cauldron(2, S("Cauldron (2/3 River Water)"), true)
register_filled_cauldron(3, S("Cauldron (3/3 River Water)"), true)
end end
minetest.register_craft({ minetest.register_craft({
@ -125,19 +120,36 @@ minetest.register_craft({
} }
}) })
minetest.register_abm({ local function cauldron_extinguish(obj,pos)
label = "cauldrons", local node = minetest.get_node(pos)
nodenames = {"group:cauldron_filled"},
interval = 0.5,
chance = 1,
action = function(pos, node)
for _, obj in pairs(minetest.get_objects_inside_radius(pos, 0.4)) do
if mcl_burning.is_burning(obj) then if mcl_burning.is_burning(obj) then
mcl_burning.extinguish(obj) mcl_burning.extinguish(obj)
local new_group = minetest.get_item_group(node.name, "cauldron_filled") - 1 local new_group = minetest.get_item_group(node.name, "cauldron_filled") - 1
minetest.swap_node(pos, {name = "mcl_cauldrons:cauldron" .. (new_group == 0 and "" or "_" .. new_group)}) minetest.swap_node(pos, {name = "mcl_cauldrons:cauldron" .. (new_group == 0 and "" or "_" .. new_group)})
break end
end
local etime = 0
minetest.register_globalstep(function(dtime)
etime = dtime + etime
if etime < 0.5 then return end
etime = 0
for _,pl in pairs(minetest.get_connected_players()) do
local n = minetest.find_node_near(pl:get_pos(),0.4,{"group:cauldron_filled"},true)
if n and not minetest.get_node(n).name:find("lava") then
cauldron_extinguish(pl,n)
elseif n and minetest.get_node(n).name:find("lava") then
mcl_burning.set_on_fire(pl, 5)
end
end
for _,ent in pairs(minetest.luaentities) do
if ent.object:get_pos() and ent.is_mob then
local n = minetest.find_node_near(ent.object:get_pos(),0.4,{"group:cauldron_filled"},true)
if n and not minetest.get_node(n).name:find("lava") then
cauldron_extinguish(ent.object,n)
elseif n and minetest.get_node(n).name:find("lava") then
mcl_burning.set_on_fire(ent.object, 5)
end end
end end
end end
}) end)

View File

@ -1,3 +1,3 @@
name = mcl_cauldrons name = mcl_cauldrons
depends = mcl_core, mcl_sounds depends = mcl_core, mcl_sounds
optional_depends = mclx_core, doc optional_depends = mclx_core, doc, mcl_burning