From 39491e3908ef06b3731ff3e2b854780ed79363a1 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Mon, 11 Jan 2021 14:05:39 +0100 Subject: [PATCH] Add API --- init.lua | 107 +++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 97 insertions(+), 10 deletions(-) diff --git a/init.lua b/init.lua index d365af7..4899eed 100644 --- a/init.lua +++ b/init.lua @@ -1,23 +1,110 @@ -minetest.register_globalstep(function() +autodupe = {} + +local function prepare_item_collect(pos) + minetest.localplayer:set_pos(vector.subtract(pos, vector.new(0, 1, 0))) +end + +local function node_inv_str(pos) + return "nodemeta:" .. pos.x .. "," .. pos.y .. "," .. pos.z +end + +local function inv_empty(pos) + local inv = minetest.get_inventory(node_inv_str(pos)) + return not inv or not inv.src or inv.src[1]:get_name() == "" +end + +local function get_free_inv_slot() + for index, stack in ipairs(minetest.get_inventory("current_player").main) do + if stack:get_name() == "" then + return index + end + end + return 1 +end + +function autodupe.needed(index) + local player = minetest.localplayer + local ppos = player:get_pos() + local furnaces = minetest.find_nodes_near(ppos, 5, "mcl_furnaces:furnace", true) + local found_furnace = false + for _, fpos in ipairs(furnaces) do + if inv_empty(fpos) then + found_furnace = true + local invstr = node_inv_str(fpos) + local invact = InventoryAction("move") + invact:from("current_player", "main", index) + invact:to(invstr, "src", 1) + invact:apply() + minetest.interact("activate", {type = "nothing"}) + break + end + end + + if not found_furnace then + local airs = minetest.find_nodes_near(ppos, 5, "air", false) + for _, apos in ipairs(airs) do + if inv_empty(apos) then + if minetest.switch_to_item("mcl_furnaces:furnace") then + minetest.place_node(apos) + prepare_item_collect(apos) + end + return + end + end + end +end + +local function dupe_furnaces() + local furnace_index + for index, stack in ipairs(minetest.get_inventory("current_player").main) do + if stack:get_name() == "mcl_furnaces:furnace" then + if furnace_index then + return true + end + furnace_index = index + end + end + if furnace_index then + autodupe.needed(furnace_index) + end +end + +function autodupe.cleanup() + if not dupe_furnaces() then + return false + end + local player = minetest.localplayer + local ppos = player:get_pos() + local furnaces = minetest.find_nodes_near(ppos, 5, "mcl_furnaces:furnace", true) + for _, fpos in ipairs(furnaces) do + prepare_item_collect(fpos) + autotool.select_best_tool("mcl_furnaces:furnace") + minetest.dig_node(fpos) + return false + end + return true +end + +minetest.register_globalstep(function(dtime) if not minetest.settings:get_bool("autodupe") then return end local player = minetest.localplayer if not player then return end - local airs = minetest.find_nodes_near(player:get_pos(), 5, "air") + local airs = minetest.find_nodes_near(player:get_pos(), 5, "air", true) for _, p in ipairs(airs) do - local invstr = "nodemeta:" .. p.x .. "," .. p.y .. "," .. p.z - if minetest.get_inventory(invstr) then - local invact = InventoryAction("drop") + if not inv_empty(p) then + local invstr = node_inv_str(p) + local invact = InventoryAction("move") invact:from(invstr, "src", 1) - invact:set_count(0) + invact:to("current_player", "main", get_free_inv_slot()) invact:apply() end end - local furnaces = minetest.find_nodes_near(player:get_pos(), 5, "mcl_furnaces:furnace") + local furnaces = minetest.find_nodes_near(player:get_pos(), 5, "mcl_furnaces:furnace", true) local dug_any = false local index = player:get_wield_index() for _, p in ipairs(furnaces) do - local inv = minetest.get_inventory("nodemeta:" .. p.x .. "," .. p.y .. "," .. p.z) - if inv and inv.src and inv.src[1]:get_name() ~= "" then + local inv = minetest.get_inventory(node_inv_str(p)) + if not inv_empty(p) then if not dug_any then autotool.select_best_tool("mcl_furnaces:furnace") dug_any = true @@ -29,6 +116,6 @@ minetest.register_globalstep(function() player:set_wield_index(index) minetest.close_formspec("") end -end) +end) minetest.register_cheat("AutoDupe", "World", "autodupe") -- 2.44.0