From 94da9c8a53d0059f05e7d69bf734339b416d4e0f Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sun, 15 Jul 2018 22:32:24 +0200 Subject: [PATCH] robby take/add commands added --- sl_robot/base.lua | 14 +++- sl_robot/commands.lua | 39 +++++++-- sl_robot/robot.lua | 157 +++++++++++++++++++++++++----------- tubelib_addons1/grinder.lua | 1 + 4 files changed, 156 insertions(+), 55 deletions(-) diff --git a/sl_robot/base.lua b/sl_robot/base.lua index 71285db..25be4ca 100644 --- a/sl_robot/base.lua +++ b/sl_robot/base.lua @@ -103,6 +103,17 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player return stack:get_count() end +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = minetest.get_meta(pos) + if meta:get_int("state") == tubelib.RUNNING then + return 0 + end + return count +end + local function formspec1(meta) local running = meta:get_int("state") == tubelib.RUNNING local cmnd = running and "stop;Stop" or "start;Start" @@ -233,7 +244,7 @@ local function reset_robot(pos, meta) minetest.log("action", "[robby] reset_robot "..meta:get_string("robot_pos")) if robot_pos then - minetest.after(5, minetest.remove_node, robot_pos) + minetest.after(5, minetest.remove_node, table.copy(robot_pos)) end local param2 = (minetest.get_node(pos).param2 + 1) % 4 @@ -436,6 +447,7 @@ minetest.register_node("sl_robot:base", { on_timer = on_timer, allow_metadata_inventory_put = allow_metadata_inventory_put, allow_metadata_inventory_take = allow_metadata_inventory_take, + allow_metadata_inventory_move = allow_metadata_inventory_move, paramtype = "light", sunlight_propagates = true, diff --git a/sl_robot/commands.lua b/sl_robot/commands.lua index 43d89a7..b738680 100644 --- a/sl_robot/commands.lua +++ b/sl_robot/commands.lua @@ -37,10 +37,7 @@ sl_robot.register_action("forward", { idx = idx + 1 end meta:set_string("robot_pos", minetest.pos_to_string(new_pos)) - minetest.log("action", "[robby] forward "..meta:get_string("robot_pos")) - else -- blocked - -- because of unloaded areas and the LBM replace blocked robots - --minetest.set_node(robot_pos, {name = "sl_robot:robot_dummy", param2 = robot_param2}) + --minetest.log("action", "[robby] forward "..meta:get_string("robot_pos")) end coroutine.yield() end @@ -55,7 +52,7 @@ sl_robot.register_action("left", { local robot_param2 = meta:get_int("robot_param2") robot_param2 = sl_robot.turn_robot(robot_pos, robot_param2, "L") meta:set_int("robot_param2", robot_param2) - minetest.log("action", "[robby] left "..meta:get_string("robot_pos")) + --minetest.log("action", "[robby] left "..meta:get_string("robot_pos")) coroutine.yield() end, help = "tbd" @@ -68,7 +65,7 @@ sl_robot.register_action("right", { local robot_param2 = meta:get_int("robot_param2") robot_param2 = sl_robot.turn_robot(robot_pos, robot_param2, "R") meta:set_int("robot_param2", robot_param2) - minetest.log("action", "[robby] right "..meta:get_string("robot_pos")) + --minetest.log("action", "[robby] right "..meta:get_string("robot_pos")) coroutine.yield() end, help = "tbd" @@ -86,7 +83,7 @@ sl_robot.register_action("up", { coroutine.yield() end meta:set_string("robot_pos", minetest.pos_to_string(new_pos)) - minetest.log("action", "[robby] up "..meta:get_string("robot_pos")) + --minetest.log("action", "[robby] up "..meta:get_string("robot_pos")) coroutine.yield() end, help = "tbd" @@ -104,12 +101,38 @@ sl_robot.register_action("down", { coroutine.yield() end meta:set_string("robot_pos", minetest.pos_to_string(new_pos)) - minetest.log("action", "[robby] down "..meta:get_string("robot_pos")) + --minetest.log("action", "[robby] down "..meta:get_string("robot_pos")) coroutine.yield() end, help = "tbd" }) +sl_robot.register_action("take", { + cmnd = function(self, num, slot) + local meta = minetest.get_meta(self.meta.pos) + local robot_pos = minetest.string_to_pos(meta:get_string("robot_pos")) + local robot_param2 = meta:get_int("robot_param2") + sl_robot.robot_take(self.meta.pos, robot_pos, robot_param2, self.meta.owner, num, slot) + minetest.log("action", "[robby] take "..meta:get_string("robot_pos")) + coroutine.yield() + end, + help = "take 'num' items from the nodes inventory\n".. + "in front of the robot and put into the own 'slot'" +}) + +sl_robot.register_action("add", { + cmnd = function(self, num, slot) + local meta = minetest.get_meta(self.meta.pos) + local robot_pos = minetest.string_to_pos(meta:get_string("robot_pos")) + local robot_param2 = meta:get_int("robot_param2") + sl_robot.robot_add(self.meta.pos, robot_pos, robot_param2, self.meta.owner, num, slot) + minetest.log("action", "[robby] add "..meta:get_string("robot_pos")) + coroutine.yield() + end, + help = "take 'num' items from the own 'slot' and\n".. + "add to the nodes inventory in front of the robot" +}) + sl_robot.register_action("stop", { cmnd = function(self) while true do diff --git a/sl_robot/robot.lua b/sl_robot/robot.lua index 463ce49..0e04ecb 100644 --- a/sl_robot/robot.lua +++ b/sl_robot/robot.lua @@ -21,10 +21,78 @@ local Face2Dir = {[0]= {x=0, y=1, z=0} } + +local Inventories = { + ["default:chest"] = {take = "main", add = "main", fuel = "main"}, + ["default:chest_locked"] = {take = "main", add = "main", fuel = "main"}, + ["default:chest_locked"] = {take = "main", add = "main", fuel = "main"}, + ["default:furnace"] = {take = "dst", add = "src", fuel = "fuel"}, + ["default:furnace_active"] = {take = "dst", add = "src", fuel = "fuel"}, + ["tubelib:distributor"] = {take = "src", add = "src", fuel = "src"}, + ["gravelsieve:sieve"] = {take = "dst", add = "src", fuel = "src"}, + ["gravelsieve:auto_sieve0"] = {take = "dst", add = "src", fuel = "src"}, + ["gravelsieve:auto_sieve1"] = {take = "dst", add = "src", fuel = "src"}, + ["gravelsieve:auto_sieve2"] = {take = "dst", add = "src", fuel = "src"}, + ["gravelsieve:auto_sieve3"] = {take = "dst", add = "src", fuel = "src"}, + ["tubelib_addons1:autocrafter"] = {take = "dst", add = "src", fuel = "src"}, + ["tubelib_addons1:autocrafter_active"] = {take = "dst", add = "src", fuel = "src"}, + ["tubelib_addons1:chest"] = {take = "main", add = "main", fuel = "main"}, + ["tubelib_addons1:fermenter"] = {take = "dst", add = "src", fuel = "src"}, + ["tubelib_addons1:reformer"] = {take = "dst", add = "src", fuel = "src"}, + ["tubelib_addons1:funnel"] = {take = "main", add = "main", fuel = "main"}, + ["tubelib_addons1:grinder"] = {take = "dst", add = "src", fuel = "src"}, + ["tubelib_addons1:grinder_active"] = {take = "dst", add = "src", fuel = "src"}, + ["tubelib_addons1:harvester_base"] = {take = "main", add = "main", fuel = "fuel"}, + ["tubelib_addons1:quarry"] = {take = "main", add = "main", fuel = "fuel"}, + ["tubelib_addons1:quarry_active"] = {take = "main", add = "main", fuel = "fuel"}, +-- [""] = {take = "", add = "", fuel = ""}, +-- [""] = {take = "", add = "", fuel = ""}, +-- [""] = {take = "", add = "", fuel = ""}, +-- [""] = {take = "", add = "", fuel = ""}, +-- [""] = {take = "", add = "", fuel = ""}, +-- [""] = {take = "", add = "", fuel = ""}, +-- [""] = {take = "", add = "", fuel = ""}, +-- [""] = {take = "", add = "", fuel = ""}, +-- [""] = {take = "", add = "", fuel = ""}, +-- [""] = {take = "", add = "", fuel = ""}, +} + +-- return the largest stack +local function peek(src_list) + local max_val = 0 + local slot = nil + for idx,stack in ipairs(src_list) do + if stack:get_count() > max_val then + max_val = stack:get_count() + slot = idx + end + end + return slot +end + +-- try to take the number of items from an inventory +local function take_num_items(src_list, num, dst_stack) + local slot = peek(src_list) + if slot then + local taken = src_list[slot]:take_item(num) + if dst_stack:item_fits(taken) then + dst_stack:add_item(taken) + return true + end + end + return false +end + function sl_robot.new_pos(pos, param2, step) return vector.add(pos, vector.multiply(Face2Dir[param2], step)) end +local function fake_player(name) + return { + get_player_name = function() return name end, + } +end + -- use Voxel Manipulator to read the node local function read_node_with_vm(pos) local vm = VoxelManip() @@ -169,6 +237,49 @@ function sl_robot.robot_down(pos, param2) return nil end +-- take items from another inventory and put it into the own inventory slot +function sl_robot.robot_take(base_pos, robot_pos, param2, owner, num, slot) + local pos1 = sl_robot.new_pos(robot_pos, param2, 1) + if minetest.is_protected(pos1, owner) then + return + end + local node = minetest.get_node(pos1) + if Inventories[node.name] then + local listname = Inventories[node.name].take + local src_inv = minetest.get_inventory({type="node", pos=pos1}) + if src_inv:is_empty(listname) then + return + end + local src_list = src_inv:get_list(listname) + local dst_inv = minetest.get_inventory({type="node", pos=base_pos}) + local dst_list = dst_inv:get_list("main") + if take_num_items(src_list, num, dst_list[slot]) then + src_inv:set_list(listname, src_list) + dst_inv:set_list("main", dst_list) + end + end +end + +function sl_robot.robot_add(base_pos, robot_pos, param2, owner, num, slot) + local pos1 = sl_robot.new_pos(robot_pos, param2, 1) + if minetest.is_protected(pos1, owner) then + return + end + local node = minetest.get_node(pos1) + if Inventories[node.name] then + local listname = Inventories[node.name].take + local dst_inv = minetest.get_inventory({type="node", pos=pos1}) + local dst_list = dst_inv:get_list(listname) + local src_inv = minetest.get_inventory({type="node", pos=base_pos}) + local src_list = src_inv:get_list("main") + local taken = src_list[slot]:take_item(num) + if dst_inv:room_for_item(listname, taken) then + dst_inv:add_item(listname, taken) + src_inv:set_list("main", src_list) + end + end +end + minetest.register_node("sl_robot:robot", { description = "SaferLua Robot", @@ -198,37 +309,6 @@ minetest.register_node("sl_robot:robot", { sounds = default.node_sound_metal_defaults(), }) ----- dummy robots are used as marker for stucked robots in unloaded areas ---minetest.register_node("sl_robot:robot_dummy", { --- description = "SaferLua Robot", --- -- up, down, right, left, back, front --- tiles = { --- "sl_robot_robot_top.png^[opacity:127", --- "sl_robot_robot_bottom.png^[opacity:127", --- "sl_robot_robot_right.png^[opacity:127", --- "sl_robot_robot_left.png^[opacity:127", --- "sl_robot_robot_front.png^[opacity:127", --- "sl_robot_robot_back.png^[opacity:127", --- }, --- drawtype = "nodebox", --- use_texture_alpha = true, --- node_box = { --- type = "fixed", --- fixed = { --- { -5/16, 3/16, -5/16, 5/16, 8/16, 5/16}, --- { -3/16, 2/16, -3/16, 3/16, 3/16, 3/16}, --- { -6/16, -7/16, -6/16, 6/16, 2/16, 6/16}, --- { -6/16, -8/16, -3/16, 6/16, -7/16, 3/16}, --- }, --- }, --- paramtype2 = "facedir", --- is_ground_content = false, --- walkable = false, --- drop = "", --- groups = {cracky = 3}, --- sounds = default.node_sound_metal_defaults(), ---}) - minetest.register_node("sl_robot:robot_leg", { description = "SaferLua Robot", tiles = {"sl_robot_robot.png^[transformR90]"}, @@ -262,18 +342,3 @@ minetest.register_node("sl_robot:robot_foot", { sounds = default.node_sound_metal_defaults(), }) - ---minetest.register_lbm({ --- label = "[sl_robot] Remove Robots", --- name = "sl_robot:update", --- nodenames = {"sl_robot:robot", "sl_robot:robot_leg", "sl_robot:robot_foot"}, --- run_at_every_load = true, --- action = function(pos, node) --- if node.name == "sl_robot:robot" then --- minetest.swap_node(pos, {name="sl_robot:robot_dummy", param2 = node.param2}) --- else --- minetest.remove_node(pos) --- end --- end ---}) - diff --git a/tubelib_addons1/grinder.lua b/tubelib_addons1/grinder.lua index af9e0b1..45b31af 100644 --- a/tubelib_addons1/grinder.lua +++ b/tubelib_addons1/grinder.lua @@ -325,6 +325,7 @@ tubelib.add_grinder_recipe({input="default:cobble", output="default:gravel"}) tubelib.add_grinder_recipe({input="default:desert_cobble", output="default:gravel"}) tubelib.add_grinder_recipe({input="default:mossycobble", output="default:gravel"}) tubelib.add_grinder_recipe({input="default:gravel", output="default:sand"}) +tubelib.add_grinder_recipe({input="default:coral_skeleton", output="default:silver_sand"}) if minetest.global_exists("skytest") then tubelib.add_grinder_recipe({input="default:desert_sand", output="skytest:dust"})