From 48eb27655a426cfd982ea45f0ba4001e75c792c1 Mon Sep 17 00:00:00 2001 From: Phaethon H Date: Sat, 6 Nov 2021 04:21:58 -0700 Subject: [PATCH] API changes to facilitiate lava/new-substances cauldron. --- mods/ITEMS/mcl_cauldrons/api.lua | 122 ++++++++++++++++++++------ mods/ITEMS/mcl_cauldrons/register.lua | 4 +- 2 files changed, 95 insertions(+), 31 deletions(-) diff --git a/mods/ITEMS/mcl_cauldrons/api.lua b/mods/ITEMS/mcl_cauldrons/api.lua index 52b87267e..00e4b032a 100644 --- a/mods/ITEMS/mcl_cauldrons/api.lua +++ b/mods/ITEMS/mcl_cauldrons/api.lua @@ -9,11 +9,8 @@ mcl_cauldrons.BOTTLE_FILL_LEVELS = 1 -- list of substances accepted by cauldron. --- N.B. hopefully this will be obsoleted by the liquids API. -mcl_cauldrons.substances = { - "cauldron_water", - "cauldron_river_water", -} +-- filled by register_cauldron() +mcl_cauldrons.substances = {} -- Find cauldron from registered cauldrons -> string, table @@ -42,22 +39,33 @@ function mcl_cauldrons.find_cauldron(substance, fill_level) end -- Test: node describes a cauldron -> boolean -function mcl_cauldrons.is_cauldron(node) +function mcl_cauldrons.is_cauldron_node(node) + if node == nil then return false end return (minetest.get_item_group(node.name, "cauldron") ~= 0) end +function mcl_cauldrons.is_cauldron_pos(pos) + local node = minetest.get_node(pos) + return mcl_cauldrons.is_cauldron_node(node) +end + -- Test: cauldron node contains specified substance -> boolean -function mcl_cauldrons.has_substance(node, substance) +function mcl_cauldrons.has_substance_node(node, substance) return (minetest.get_item_group(node.name, substance) ~= 0) end +function mcl_cauldrons.has_substance_pos(pos, substance) + local node = minetest.get_node(pos) + return mcl_cauldrons.has_substance_node(node) +end + -- list of supported substances -> table function mcl_cauldrons.list_substances() - return mcl_cauldron.substances + return mcl_cauldrons.substances end -- Get substance inside cauldron -> string or nil -function mcl_cauldrons.get_substance(node) +function mcl_cauldrons.get_substance_node(node) local nodename = node.name -- data-driven to avoid if-cascade. -- until liquids API is available, the substance name matches the group key in the node definition (e.g. "cauldron_water"). @@ -70,32 +78,36 @@ function mcl_cauldrons.get_substance(node) return nil end +function mcl_cauldrons.get_substance_pos(pos) + local node = minetest.get_node(pos) + return mcl_cauldrons.get_substance_node(node) +end + -- Get maximum number of levels available for cauldron node -> number --- Optionally specify `substance` (mainly to determine a change in cauldron substance, e.g. filling a full one with bucket of something else) --- substance == nil to ignore substance criteria -function mcl_cauldrons.get_maximum(node, substance) - local nodename - if substance == nil then - nodename = node.name - else - nodename = mcl_cauldrons.find_cauldron(substance, nil) - end +function mcl_cauldrons.get_maximum_node(node) + local nodename = node.name return minetest.get_item_group(nodename, "cauldron_maximum") end +function mcl_cauldrons.get_maximum_pos(pos) + local node = minetest.get_node(pos) + return mcl_cauldrons.get_maximum_node(node) +end + -- Get current level of cauldron -> number --- Optionally specify `substance`, substance==nil to indicate current content. -function mcl_cauldrons.get_level(node, substance) - if substance and (minetest.get_item_group(node.name, substance) == 0) then - return 0 - end +function mcl_cauldrons.get_level_node(node) return minetest.get_item_group(node.name, "cauldron_filled") end +function mcl_cauldrons.get_level_pos(pos) + local node = minetest.get_node(pos) + return mcl_cauldrons.get_level_node(node) +end + -- Test: cauldron is empty -> boolean -- (i.e. fill level is 0, or contents is empty) -function mcl_cauldrons.is_empty(node) - if not mcl_cauldrons.is_cauldron(node) then +function mcl_cauldrons.is_empty_node(node) + if not mcl_cauldrons.is_cauldron_node(node) then error("not a cauldron", node.name) end if minetest.get_item_group(node.name, "cauldron_filled") == 0 then @@ -104,18 +116,40 @@ function mcl_cauldrons.is_empty(node) return false end +function mcl_cauldrons.is_empty_pos(pos) + local node = minetest.get_node(pos) + return mcl_cauldrons.is_empty_node(node) +end + -- Test: cauldron is full -> boolean -- (i.e. current fill level matches maximum level. -function mcl_cauldrons.is_full(node) +function mcl_cauldrons.is_full_node(node) local maximum = mcl_cauldrons.get_maximum(node) local current = mcl_cauldrons.get_level(node) return (current >= maximum) end +function mcl_cauldrons.is_full_pos(pos) + local node = minetest.get_node(pos) + return mcl_cauldrons.is_full_node(node) +end + + +function mcl_cauldrons.make_cauldron_node(substance, fill_levels) + local nodename, nodedef = mcl_cauldrons.find_cauldron(substance, fill_level) + local newnode = { name = nodename } + return newnode +end + +function mcl_cauldrons.make_cauldron_pos(pos, substance, fill_level) + local node = mcl_cauldrons.make_cauldron_node(substance, fill_level) + minetest.set_node(pos, node) +end + -- Set fill level, bypassing game rules -> table -- Optionally indicate substance (to change cauldron content); nil to preserve. -- returns a node table as accepted by minetest.set_node() -function mcl_cauldrons.set_level(node, fill_level, substance) +function mcl_cauldrons.set_level_node(node, fill_level, substance) if substance == nil then -- determine current substance. substance = mcl_cauldrons.get_substance(node) @@ -125,24 +159,51 @@ function mcl_cauldrons.set_level(node, fill_level, substance) return newnode end +function mcl_cauldrons.set_level_pos(pos, fill_level, substance) + local node = minetest.get_node(pos) + local newnode = mcl_cauldrons.set_level_node(node, fill_level, substance) + minetest.set_node(pos, newnode) +end + -- Change content of cauldron by number of levels with indicated substance -> table -- Subject to game rules (delegated to node definition's on_fill callback) -- returns a node table as accepted by minetest.set_node() -function mcl_cauldrons.fill_levels(node, change_levels, substance) +function mcl_cauldrons.fill_levels_node(node, change_levels, substance) local nodedef = mcl_cauldrons.registered_cauldrons[node.name] local callback = nodedef._mcl_on_fill -- use callback if available, else revert. return callback and callback(node, change_levels, substance) or node end +function mcl_cauldrons.fill_levels_pos(pos, change_levels, substance) + local node = minetest.get_node(pos) + local newnode = mcl_cauldrons.fill_levels_node(node) + minetest.set_node(pos) +end + -- drain counterpart to fill_levels() -function mcl_cauldrons.drain_levels(node, change_levels, substance) +function mcl_cauldrons.drain_levels_node(node, change_levels, substance) local nodedef = mcl_cauldrons.registered_cauldrons[node.name] local callback = nodedef._mcl_on_drain -- use callback if available, else revert. return callback and callback(node, change_levels, substance) or node end +function mcl_cauldrons.drain_levels_pos(pos, change_levels, substance) + local node = minetest.get_node(pos) + local newnode = mcl_cauldrons.drain_levels_node(node) + minetest.set_node(pos) +end + + +local function list_member(member, lis) + for i, v in ipairs(lis) do + if v == member then + return member + end + end + return nil +end -- Wrapper to register cauldron-specific nodes. -- additional bookkeeping specific to mcl_cauldrons. @@ -152,5 +213,8 @@ function mcl_cauldrons.register_cauldron_node(nodename, nodedef, doc_alias) if doc_alias and has_doc then doc.add_entry_alias("nodes", doc_alias, "nodes", nodename) end + if not list_member(nodedef._mcl_cauldron_substance, mcl_cauldrons.substances) then + table.insert(mcl_cauldrons.substances, nodedef._mcl_cauldron_substance) + end end diff --git a/mods/ITEMS/mcl_cauldrons/register.lua b/mods/ITEMS/mcl_cauldrons/register.lua index 7a31398ee..ce740e99f 100644 --- a/mods/ITEMS/mcl_cauldrons/register.lua +++ b/mods/ITEMS/mcl_cauldrons/register.lua @@ -158,7 +158,6 @@ mcl_cauldrons.register_cauldron_node("mcl_cauldrons:cauldron_water_1", cauldron = 1, cauldron_filled = 1, cauldron_maximum = 3, - cauldron_water = 1, }, node_box = mcl_cauldrons.cauldron_nodeboxes[1], collision_box = mcl_cauldrons.cauldron_nodeboxes[0], @@ -168,6 +167,7 @@ mcl_cauldrons.register_cauldron_node("mcl_cauldrons:cauldron_water_1", "mcl_cauldrons_cauldron_side.png" }, drop = "mcl_cauldrons:cauldron", + _mcl_cauldron_substance = "water", }), "mcl_cauldrons:cauldron") -- water cauldron 2/3 as extension of 1/3. @@ -200,7 +200,6 @@ if minetest.get_modpath("mclx_core") then cauldron = 1, cauldron_filled = 1, cauldron_maximum = 3, - cauldron_river_water = 1, }, node_box = mcl_cauldrons.cauldron_nodeboxes[1], collision_box = mcl_cauldrons.cauldron_nodeboxes[0], @@ -210,6 +209,7 @@ if minetest.get_modpath("mclx_core") then "mcl_cauldrons_cauldron_side.png" }, drop = "mcl_cauldrons:cauldron", + _mcl_cauldron_substance = "river_water", }), "mcl_cauldrons:cauldron") -- water cauldron 2/3 as extension of 1/3. mcl_cauldrons.register_cauldron_node("mcl_cauldrons:cauldron_river_water_2",