diff --git a/.luacheckrc b/.luacheckrc index 06771d7..1706411 100644 --- a/.luacheckrc +++ b/.luacheckrc @@ -5,5 +5,10 @@ globals = { } read_globals = { - "mapsync", "mtt", "blockexchange", "travelnet", "display_api" + "mapsync", + "mtt", + "blockexchange", + "travelnet", + "display_api", + "advtrains" } diff --git a/compat/advtrains.lua b/compat/advtrains.lua new file mode 100644 index 0000000..0e6ad0b --- /dev/null +++ b/compat/advtrains.lua @@ -0,0 +1,57 @@ +assert(type(advtrains.ndb.update) == "function") + +local advtrains_nodeids = {} + +minetest.register_on_mods_loaded(function() + for nodename, nodedef in pairs(minetest.registered_nodes) do + if nodedef.groups and nodedef.groups.save_in_at_nodedb then + advtrains_nodeids[minetest.get_content_id(nodename)] = true + end + end +end) + +-- area-key -> table[pos] +local removed_nodes = {} + +local function get_area_key(pos1, pos2) + return minetest.pos_to_string(pos1) .. "-" .. minetest.pos_to_string(pos2) +end + +-- register to be removed nodedb positions +pick_and_place.register_on_before_remove(function(pos1, pos2, node_ids) + if not advtrains_nodeids[node_ids] then + -- nothing to do + return + end + + local poslist = minetest.find_nodes_in_area(pos1, pos2, {"group:save_in_at_nodedb"}) + local areakey = get_area_key(pos1, pos2) + removed_nodes[areakey] = poslist +end) + +-- update removed nodedb positions +pick_and_place.register_on_remove(function(pos1, pos2) + local areakey = get_area_key(pos1, pos2) + local poslist = removed_nodes[areakey] + if not poslist then + return + end + removed_nodes[areakey] = nil + + for _, pos in ipairs(poslist) do + advtrains.ndb.update(pos) + end +end) + +-- update all nodedb positions +pick_and_place.register_on_place(function(pos1, pos2, node_ids) + if not advtrains_nodeids[node_ids] then + -- nothing to do + return + end + + local poslist = minetest.find_nodes_in_area(pos1, pos2, {"group:save_in_at_nodedb"}) + for _, pos in ipairs(poslist) do + advtrains.ndb.update(pos) + end +end) \ No newline at end of file diff --git a/init.lua b/init.lua index 7819d06..784bf89 100644 --- a/init.lua +++ b/init.lua @@ -36,6 +36,10 @@ if minetest.get_modpath("display_api") then dofile(MP.."/compat/display_api.lua") end +if minetest.get_modpath("advtrains") then + dofile(MP.."/compat/advtrains.lua") +end + if minetest.get_modpath("mtt") and mtt.enabled then dofile(MP .. "/configure.spec.lua") dofile(MP .. "/create_tool.spec.lua") diff --git a/mod.conf b/mod.conf index 1f4cba2..ce65a17 100644 --- a/mod.conf +++ b/mod.conf @@ -1,5 +1,5 @@ name = pick_and_place description = Pick and place utility depends = wield_events -optional_depends = mapsync, mtt, blockexchange, travelnet, display_api +optional_depends = mapsync, mtt, blockexchange, travelnet, display_api, advtrains min_minetest_version = 5.5.0 \ No newline at end of file