diff --git a/mods/CORE/vl_legacy/API.md b/mods/CORE/vl_legacy/API.md index 7c1dde2e7..ceb11aad1 100644 --- a/mods/CORE/vl_legacy/API.md +++ b/mods/CORE/vl_legacy/API.md @@ -17,3 +17,19 @@ Arguments: * `old`: Itemstring to be converted * `new`: New item string +## `vl_legacy.convert_node(pos, node)` + +Converts legacy nodes to newer versions. + +Arguments: +* `pos`: Position of the node to attempt conversion +* `node`: Node definition to convert. The node will be loaded from map data if `nil`. + +The node definition for the old node must contain the field `_vl_legacy_convert` with +a value that is either a `function(pos, node)` or `string` for this call to have any +affect. If a function is provided, the function is called with `pos` and `node` as +arguments. If a string is provided, a node name conversion will occur. + +This mod provides an LBM and ABM that will automatically call this function for nodes +with `group:legacy` set. + diff --git a/mods/CORE/vl_legacy/init.lua b/mods/CORE/vl_legacy/init.lua index dd43a69c7..ca89f799c 100644 --- a/mods/CORE/vl_legacy/init.lua +++ b/mods/CORE/vl_legacy/init.lua @@ -35,6 +35,17 @@ function mod.convert_inventory(inv) mod.convert_inventory_lists(lists) inv:set_lists(lists) end +function mod.convert_node(pos, node) + local node = node or minetest.get_node(pos) + local node_def = minetest.registered_nodes[node.name] + local convert = node_def._vl_legacy_convert_node + if type(convert) == "function" then + convert(pos, node) + elseif type(convert) == "string" then + node.name = convert + minetest.swap_node(pos, node) + end +end minetest.register_on_joinplayer(function(player) mod.convert_inventory(player:get_inventory()) @@ -49,4 +60,16 @@ minetest.register_lbm({ mod.convert_inventory(meta:get_inventory()) end }) - +minetest.register_lbm({ + name = "vl_legacy:convert_nodes", + nodenames = "group:legacy", + run_at_every_load = true, + action = mod.convert_node, +}) +minetest.register_abm({ + label = "Convert Legacy Nodes", + nodenames = "group:legacy", + interval = 5, + chance = 1, + action = mod.convert_node, +}) diff --git a/mods/ENTITIES/mcl_minecarts/rails.lua b/mods/ENTITIES/mcl_minecarts/rails.lua index bb76cdc36..00c78616d 100644 --- a/mods/ENTITIES/mcl_minecarts/rails.lua +++ b/mods/ENTITIES/mcl_minecarts/rails.lua @@ -373,28 +373,24 @@ end local CURVY_RAILS_MAP = { ["mcl_minecarts:rail"] = "mcl_minecarts:rail_v2", } +local function convert_legacy_curvy_rails(pos, node) + node.name = CURVY_RAILS_MAP[node.name] + if node.name then + minetest.swap_node(pos, node) + mod.update_rail_connections(pos, { legacy = true, ignore_neighbor_connections = true }) + end +end for old,new in pairs(CURVY_RAILS_MAP) do local new_def = minetest.registered_nodes[new] minetest.register_node(old, { drawtype = "raillike", inventory_image = new_def.inventory_image, - groups = { rail = 1 }, + groups = { rail = 1, legacy = 1 }, tiles = { new_def.tiles[1], new_def.tiles[1], new_def.tiles[1], new_def.tiles[1] }, + _vl_legacy_convert_node = convert_legacy_curvy_rails }) vl_legacy.register_item_conversion(old, new) end -minetest.register_lbm({ - name = "mcl_minecarts:update_legacy_curvy_rails", - nodenames = mcl_util.table_keys(CURVY_RAILS_MAP), - run_at_every_load = true, - action = function(pos, node) - node.name = CURVY_RAILS_MAP[node.name] - if node.name then - minetest.swap_node(pos, node) - mod.update_rail_connections(pos, { legacy = true, ignore_neighbor_connections = true }) - end - end -}) local STRAIGHT_RAILS_MAP ={ ["mcl_minecarts:golden_rail"] = "mcl_minecarts:golden_rail_v2", ["mcl_minecarts:golden_rail_on"] = "mcl_minecarts:golden_rail_v2_on", @@ -403,39 +399,34 @@ local STRAIGHT_RAILS_MAP ={ ["mcl_minecarts:detector_rail"] = "mcl_minecarts:detector_rail_v2", ["mcl_minecarts:detector_rail_on"] = "mcl_minecarts:detector_rail_v2_on", } +local function convert_legacy_straight_rail(pos, node) + node.name = STRAIGHT_RAILS_MAP[node.name] + if node.name then + local connections = mod.get_rail_connections(pos, { legacy = true, ignore_neighbor_connections = true }) + if not mod.HORIZONTAL_STANDARD_RULES[connections] then + -- Drop an immortal object at this location + local item_entity = minetest.add_item(pos, ItemStack(node.name)) + if item_entity then + item_entity:get_luaentity()._immortal = true + end + + -- This is a configuration that doesn't exist in the new rail + -- Replace with a standard rail + node.name = "mcl_minecarts:rail_v2" + end + minetest.swap_node(pos, node) + mod.update_rail_connections(pos, { legacy = true, ignore_neighbor_connections = true }) + end +end for old,new in pairs(STRAIGHT_RAILS_MAP) do local new_def = minetest.registered_nodes[new] minetest.register_node(old, { drawtype = "raillike", inventory_image = new_def.inventory_image, - groups = { rail = 1 }, + groups = { rail = 1, legacy = 1 }, tiles = { new_def.tiles[1], new_def.tiles[1], new_def.tiles[1], new_def.tiles[1] }, + _vl_legacy_convert_node = convert_legacy_straight_rail, }) vl_legacy.register_item_conversion(old, new) end -minetest.register_lbm({ - name = "mcl_minecarts:update_legacy_straight_rails", - nodenames = mcl_util.table_keys(STRAIGHT_RAILS_MAP), - run_at_every_load = true, - action = function(pos, node) - node.name = STRAIGHT_RAILS_MAP[node.name] - if node.name then - local connections = mod.get_rail_connections(pos, { legacy = true, ignore_neighbor_connections = true }) - if not mod.HORIZONTAL_STANDARD_RULES[connections] then - -- Drop an immortal object at this location - local item_entity = minetest.add_item(pos, ItemStack(node.name)) - if item_entity then - item_entity:get_luaentity()._immortal = true - end - - -- This is a configuration that doesn't exist in the new rail - -- Replace with a standard rail - node.name = "mcl_minecarts:rail_v2" - end - minetest.swap_node(pos, node) - mod.update_rail_connections(pos, { legacy = true, ignore_neighbor_connections = true }) - end - end -}) -