v1.9 Controller commands get_counter() and clear_counter() added, Autocrafter got a command interface, some improvements to the robot, but still WIP(!)

This commit is contained in:
Joachim Stolberg 2018-07-22 22:40:47 +02:00
parent 965c272e57
commit b3563d6d24
9 changed files with 101 additions and 4 deletions

@ -1,4 +1,4 @@
# TechPack V1.08 # TechPack V1.09
TechPack, a Mining, Crafting, & Farming Modpack for Minetest. TechPack, a Mining, Crafting, & Farming Modpack for Minetest.
@ -84,3 +84,4 @@ Gravelsieve optional: moreores, hopper, pipeworks
- 2018-06-09 V1.06 * Recipes with API to grinder added - 2018-06-09 V1.06 * Recipes with API to grinder added
- 2018-06-17 V1.07 * Tube placement completely reworked - 2018-06-17 V1.07 * Tube placement completely reworked
- 2018-06-22 V1.08 * Lua Controller and SaferLua added - 2018-06-22 V1.08 * Lua Controller and SaferLua added
- 2018-07-22 V1.09 * Item counters for Pusher/Distributor and tubelib commands for Autocrafter added

@ -36,6 +36,30 @@ sl_controller.register_function("get_status", {
' example: sts = $get_status("1234")' ' example: sts = $get_status("1234")'
}) })
sl_controller.register_function("get_counter", {
cmnd = function(self, num)
num = tostring(num or "")
return tubelib.send_request(num, "counter", nil)
end,
help = " $get_counter(num)\n"..
" Read number of pushed items from a\n"..
" Pusher/Distributor node.\n"..
" The Pusher returns a single value (number)\n"..
" The Distributor returns a list with 4 values\n"..
" like: {red=1, green=0, blue=8, yellow=0}\n"..
' example: cnt = $get_counter("1234")\n'
})
sl_controller.register_function("clear_counter", {
cmnd = function(self, num)
num = tostring(num or "")
return tubelib.send_request(num, "clear_counter", nil)
end,
help = " $clear_counter(num)\n"..
" Set counter(s) from Pusher/Distributor to zero.\n"..
' example: $clear_counter("1234")'
})
sl_controller.register_function("get_fuel_status", { sl_controller.register_function("get_fuel_status", {
cmnd = function(self, num) cmnd = function(self, num)
num = tostring(num or "") num = tostring(num or "")

@ -25,7 +25,7 @@ sl_robot.register_action("get_ms_time", {
sl_robot.register_action("forward", { sl_robot.register_action("forward", {
cmnd = function(self, steps) cmnd = function(self, steps)
steps = math.min(tonumber(steps or 1), 9) steps = math.min(tonumber(steps or 1), 100)
local idx = 1 local idx = 1
while idx <= steps do while idx <= steps do
local meta = minetest.get_meta(self.meta.pos) local meta = minetest.get_meta(self.meta.pos)
@ -49,7 +49,7 @@ sl_robot.register_action("forward", {
sl_robot.register_action("backward", { sl_robot.register_action("backward", {
cmnd = function(self, steps) cmnd = function(self, steps)
steps = math.min(tonumber(steps or 1), 9) steps = math.min(tonumber(steps or 1), 100)
local idx = 1 local idx = 1
while idx <= steps do while idx <= steps do
local meta = minetest.get_meta(self.meta.pos) local meta = minetest.get_meta(self.meta.pos)
@ -216,3 +216,16 @@ sl_robot.register_action("stop", {
help = "tbd" help = "tbd"
}) })
--sl_robot.register_action("run", {
-- cmnd = function(self, sCmd, reverse)
-- slot = math.min(tonumber(slot or 1), 8)
-- 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")
-- for cmnd in sCmd:gmatch("%w+") do
-- if cmnd:byte()
-- end
-- end,
-- help = " "
--})

@ -347,6 +347,7 @@ function sl_robot.robot_dig(base_pos, robot_pos, param2, owner, dir, slot)
local src_inv = minetest.get_inventory({type="node", pos=base_pos}) local src_inv = minetest.get_inventory({type="node", pos=base_pos})
local src_list = src_inv:get_list("main") local src_list = src_inv:get_list("main")
src_list[slot]:add_item(item) src_list[slot]:add_item(item)
src_inv:set_list("main", src_list)
end end
end end
@ -373,6 +374,8 @@ minetest.register_node("sl_robot:robot", {
}, },
}, },
paramtype2 = "facedir", paramtype2 = "facedir",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false, is_ground_content = false,
groups = {crumbly=0, not_in_creative_inventory = 1}, groups = {crumbly=0, not_in_creative_inventory = 1},
sounds = default.node_sound_metal_defaults(), sounds = default.node_sound_metal_defaults(),
@ -389,6 +392,8 @@ minetest.register_node("sl_robot:robot_leg", {
}, },
}, },
paramtype2 = "facedir", paramtype2 = "facedir",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false, is_ground_content = false,
groups = {crumbly=0, not_in_creative_inventory = 1}, groups = {crumbly=0, not_in_creative_inventory = 1},
sounds = default.node_sound_metal_defaults(), sounds = default.node_sound_metal_defaults(),
@ -406,6 +411,8 @@ minetest.register_node("sl_robot:robot_foot", {
}, },
}, },
paramtype2 = "facedir", paramtype2 = "facedir",
paramtype = "light",
sunlight_propagates = true,
is_ground_content = false, is_ground_content = false,
groups = {crumbly=0, not_in_creative_inventory = 1}, groups = {crumbly=0, not_in_creative_inventory = 1},
sounds = default.node_sound_metal_defaults(), sounds = default.node_sound_metal_defaults(),

@ -23,13 +23,14 @@ local Version = minetest.deserialize(storage:get_string("Version")) or 1
local Number2Pos = minetest.deserialize(storage:get_string("Number2Pos")) or {} local Number2Pos = minetest.deserialize(storage:get_string("Number2Pos")) or {}
local function update_mod_storage() local function update_mod_storage()
minetest.log("action", "[Tubelib] Store data...")
storage:set_string("NextNumber", minetest.serialize(NextNumber)) storage:set_string("NextNumber", minetest.serialize(NextNumber))
storage:set_string("Version", minetest.serialize(Version)) storage:set_string("Version", minetest.serialize(Version))
storage:set_string("Number2Pos", minetest.serialize(Number2Pos)) storage:set_string("Number2Pos", minetest.serialize(Number2Pos))
storage:set_string("Key2Number", nil) -- not used any more storage:set_string("Key2Number", nil) -- not used any more
-- store data each hour -- store data each hour
minetest.after(60*60, update_mod_storage) minetest.after(60*60, update_mod_storage)
print("[Tubelib] Data stored") minetest.log("action", "[Tubelib] Data stored")
end end
minetest.register_on_shutdown(function() minetest.register_on_shutdown(function()

@ -213,6 +213,8 @@ local function keep_running(pos, elapsed)
local inv = meta:get_inventory() local inv = meta:get_inventory()
local list = inv:get_list("src") local list = inv:get_list("src")
local kvSrc = invlist_content_as_kvlist(list) local kvSrc = invlist_content_as_kvlist(list)
local counter = minetest.deserialize(meta:get_string("item_counter") or
{red=0, green=0, blue=0, yellow=0})
-- calculate the filter settings only once -- calculate the filter settings only once
local hash = minetest.hash_node_position(pos) local hash = minetest.hash_node_position(pos)
@ -241,6 +243,7 @@ local function keep_running(pos, elapsed)
if not tubelib.push_items(pos, side, item, player_name) then -- <<=== tubelib if not tubelib.push_items(pos, side, item, player_name) then -- <<=== tubelib
tubelib.put_item(meta, "src", item) tubelib.put_item(meta, "src", item)
else else
counter[listname] = counter[listname] + 1
busy = true busy = true
end end
end end
@ -257,6 +260,7 @@ local function keep_running(pos, elapsed)
if not tubelib.push_items(pos, side, item, player_name) then -- <<=== tubelib if not tubelib.push_items(pos, side, item, player_name) then -- <<=== tubelib
tubelib.put_item(meta, "src", item) tubelib.put_item(meta, "src", item)
else else
counter[listname] = counter[listname] + 1
busy = true busy = true
end end
end end
@ -276,6 +280,7 @@ local function keep_running(pos, elapsed)
end end
end end
meta:set_string("item_counter", minetest.serialize(counter))
meta:set_int("running", running) meta:set_int("running", running)
return true return true
end end
@ -357,6 +362,7 @@ minetest.register_node("tubelib:distributor", {
inv:set_size('green', 6) inv:set_size('green', 6)
inv:set_size('red', 6) inv:set_size('red', 6)
inv:set_size('blue', 6) inv:set_size('blue', 6)
meta:set_string("item_counter", minetest.serialize({red=0, green=0, blue=0, yellow=0}))
end, end,
on_receive_fields = on_receive_fields, on_receive_fields = on_receive_fields,
@ -462,6 +468,13 @@ tubelib.register_node("tubelib:distributor", {"tubelib:distributor_active"}, {
return tubelib.statestring(running) return tubelib.statestring(running)
elseif topic == "filter" then elseif topic == "filter" then
return change_filter_settings(pos, payload.slot, payload.val) return change_filter_settings(pos, payload.slot, payload.val)
elseif topic == "counter" then
local meta = minetest.get_meta(pos)
return minetest.deserialize(meta:get_string("item_counter") or
{red=0, green=0, blue=0, yellow=0})
elseif topic == "clear_counter" then
local meta = minetest.get_meta(pos)
meta:set_string("item_counter", minetest.serialize({red=0, green=0, blue=0, yellow=0}))
else else
return "unsupported" return "unsupported"
end end

@ -88,6 +88,7 @@ local function keep_running(pos, elapsed)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
return goto_blocked(pos, node) return goto_blocked(pos, node)
end end
meta:set_int("item_counter", meta:get_int("item_counter") + 1)
if running <= 0 then if running <= 0 then
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
return switch_on(pos, node) return switch_on(pos, node)
@ -123,6 +124,7 @@ minetest.register_node("tubelib:pusher", {
local number = tubelib.add_node(pos, "tubelib:pusher") -- <<=== tubelib local number = tubelib.add_node(pos, "tubelib:pusher") -- <<=== tubelib
meta:set_string("number", number) meta:set_string("number", number)
meta:set_string("infotext", "Pusher "..number..": stopped") meta:set_string("infotext", "Pusher "..number..": stopped")
meta:set_int("item_counter", 0)
end, end,
on_rightclick = function(pos, node, clicker) on_rightclick = function(pos, node, clicker)
@ -238,6 +240,12 @@ tubelib.register_node("tubelib:pusher", {"tubelib:pusher_active"}, {
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local running = meta:get_int("running") or tubelib.STATE_STOPPED local running = meta:get_int("running") or tubelib.STATE_STOPPED
return tubelib.statestring(running) return tubelib.statestring(running)
elseif topic == "counter" then
local meta = minetest.get_meta(pos)
return meta:get_int("item_counter")
elseif topic == "clear_counter" then
local meta = minetest.get_meta(pos)
return meta:set_int("item_counter", 0)
else else
return "not supported" return "not supported"
end end

@ -164,6 +164,8 @@ local function run_autocrafter(pos, elapsed)
return true return true
end end
meta:set_int("item_counter", meta:get_int("item_counter") + output_item:get_count())
if running <= 0 then if running <= 0 then
return start_crafter(pos) return start_crafter(pos)
else else
@ -381,6 +383,7 @@ minetest.register_node("tubelib_addons1:autocrafter", {
inv:set_size("output", 1) inv:set_size("output", 1)
meta:set_string("number", number) meta:set_string("number", number)
meta:set_int("running", 0) meta:set_int("running", 0)
meta:set_int("item_counter", 0)
update_meta(meta, tubelib.STOPPED) update_meta(meta, tubelib.STOPPED)
end, end,
@ -464,4 +467,23 @@ tubelib.register_node("tubelib_addons1:autocrafter", {"tubelib_addons1:autocraft
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
return tubelib.put_item(meta, "dst", item) return tubelib.put_item(meta, "dst", item)
end, end,
on_recv_message = function(pos, topic, payload)
if topic == "on" then
return start_crafter(pos)
elseif topic == "off" then
return stop_crafter(pos)
elseif topic == "state" then
local meta = minetest.get_meta(pos)
local running = meta:get_int("running")
return tubelib.statestring(running)
elseif topic == "counter" then
local meta = minetest.get_meta(pos)
return meta:get_int("item_counter")
elseif topic == "clear_counter" then
local meta = minetest.get_meta(pos)
return meta:set_int("item_counter", 0)
else
return "unsupported"
end
end,
}) })

@ -88,6 +88,7 @@ local function keep_running(pos, elapsed)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
return goto_blocked(pos, node) return goto_blocked(pos, node)
end end
meta:set_int("item_counter", meta:get_int("item_counter") + 1)
if running <= 0 then if running <= 0 then
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
return switch_on(pos, node) return switch_on(pos, node)
@ -123,6 +124,7 @@ minetest.register_node("tubelib_addons1:pusher_fast", {
local number = tubelib.add_node(pos, "tubelib_addons1:pusher_fast") local number = tubelib.add_node(pos, "tubelib_addons1:pusher_fast")
meta:set_string("number", number) meta:set_string("number", number)
meta:set_string("infotext", "Pusher "..number..": stopped") meta:set_string("infotext", "Pusher "..number..": stopped")
meta:set_int("item_counter", 0)
end, end,
on_rightclick = function(pos, node, clicker) on_rightclick = function(pos, node, clicker)
@ -238,6 +240,12 @@ tubelib.register_node("tubelib_addons1:pusher_fast", {"tubelib_addons1:pusher_fa
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local running = meta:get_int("running") or tubelib.STATE_STOPPED local running = meta:get_int("running") or tubelib.STATE_STOPPED
return tubelib.statestring(running) return tubelib.statestring(running)
elseif topic == "counter" then
local meta = minetest.get_meta(pos)
return meta:get_int("item_counter")
elseif topic == "clear_counter" then
local meta = minetest.get_meta(pos)
return meta:set_int("item_counter", 0)
else else
return "not supported" return "not supported"
end end