v1.14 Distributor performance improved, chest commands added

This commit is contained in:
Joachim Stolberg 2018-09-10 22:36:09 +02:00
parent b9eee1f388
commit 9074a38b32
11 changed files with 157 additions and 48 deletions

@ -92,5 +92,7 @@ tubelib_addons1 optional: unified_inventory
- 2018-08-13 V1.11 * Detector node added
- 2018-08-14 V1.12 * Teleporter node added
- 2018-08-28 V1.13 * Smartline Controller completely revised. Liquid Sampler added
- 2018-09-10 V1.14 * Distributor performance improved, chest commands added
See ![releasenotes.txt](https://github.com/joe7575/techpack/blob/master/releasenotes.md) for further information

@ -459,8 +459,9 @@ minetest.register_craft({
minetest.register_craft({
output = "gravelsieve:auto_sieve",
type = "shapeless",
recipe = {
{"gravelsieve:sieve", "default:mese_crystal", "default:mese_crystal"},
"gravelsieve:sieve", "default:mese_crystal", "default:mese_crystal",
},
})

@ -1,6 +1,19 @@
# Release Notes of the ModPack TechPack [techpack]
## V1.14 Beta (2018-09-10)
### Additions
- The Tubelib chests now provide the states ("empty"/"loaded")
- The SmartLine Controller got the command "chest state request" for Tubelib chests
- Minetest fuel recipe for Bio Fuel added
### Changes
- The Distributor is now able to push up to 20 items per slot and phase (instead of 6).
- The Distributor now uses an unconfigured port for blocked/rejected items.
- The Tubelib Protected Chest got a new texture.
- The Harvester is now HighPerf Pusher compatible.
## V1.13.4 Beta (2018-09-08)
@ -8,6 +21,7 @@
- SmartLine Controller got some form/submenu updates
## V1.13.3 Beta (2018-09-06)
### Additions
@ -17,6 +31,7 @@
- Parameter 'side' bugfix (used e.g. for on_push_item(...))
## V1.13.2 Beta (2018-09-05)
### Changes
@ -25,6 +40,8 @@
### Fixes
- Recipe bug for SaferLua Controller fixed
## V1.13.1 Beta (2018-09-02)
### Changes
@ -36,6 +53,7 @@
in its own chest, the items went lost.
## V1.13 Beta (2018-08-28)
### Additions

@ -221,6 +221,45 @@ smartline.icta_register_condition("fuel", {
end,
})
smartline.icta_register_condition("chest", {
title = "chest state request",
formspec = {
{
type = "digits",
name = "number",
label = "chest number",
default = "",
},
{
type = "textlist",
name = "operand",
label = "",
choices = "is,is not",
default = "is",
},
{
type = "textlist",
name = "value",
label = "",
choices = "empty,loaded",
default = "empty",
},
{
type = "label",
name = "lbl",
label = "Read the state from a Tubelib chest\n"..
"and other similar nodes.",
},
},
button = function(data, environ) -- default button label
return 'sts('..sl.fmt_number(data.number)..","..data.operand..' '..data.value..')'
end,
code = function(data, environ)
return 'tubelib.send_request("'..data.number..'", "state", "")',
sl.operand(data.operand)..'"'..data.value..'"'
end,
})
smartline.icta_register_condition("signaltower", {
title = "Signal Tower state request",
formspec = {

@ -341,19 +341,20 @@ function tubelib.get_item(meta, listname)
return nil
end
-- Get one item from the given ItemList, specified by stack number (1..n).
-- Get one (or more) item(s) from the given ItemList, specified by stack number (1..n).
-- Returns nil if ItemList is empty.
function tubelib.get_this_item(meta, listname, number)
function tubelib.get_this_item(meta, listname, list_number, num_items)
if meta == nil or meta.get_inventory == nil then return nil end
local inv = meta:get_inventory()
if inv:is_empty(listname) then
return nil
end
local items = inv:get_stack(listname, number)
if num_items == nil then num_items = 1 end
local items = inv:get_stack(listname, list_number)
if items:get_count() > 0 then
local taken = items:take_item(1)
inv:set_stack(listname, number, items)
local taken = items:take_item(num_items)
inv:set_stack(listname, list_number, items)
return taken
end
return nil

@ -19,6 +19,7 @@
response is "running", "stopped", "standby", or "not supported"
]]--
local MAX_NUM_PER_CYC = 20 -- maximum number of items, which can be pushed per slot
local NUM_FILTER_ELEM = 6
local NUM_FILTER_SLOTS = 4
local TICKS_TO_SLEEP = 5
@ -50,16 +51,12 @@ local function invlist_num_entries(list)
return res
end
-- Return a flat table with all items
-- Return a gapless table with all items
local function invlist_entries_as_list(list)
local res = {}
for _,items in ipairs(list) do
local name = items:get_name()
local count = items:get_count()
if name ~= "" then
for i = 1,count do
res[#res+1] = name
end
if items:get_count() > 0 then
res[#res+1] = {items:get_name(), items:get_count()}
end
end
return res
@ -68,14 +65,27 @@ end
local function AddToTbl(kvTbl, new_items)
for _, l in ipairs(new_items) do
kvTbl[l] = true
kvTbl[l[1]] = true
end
return kvTbl
end
-- return the number of items to be pushed to an unconfigured slot
local function num_items(moved_items, name, filter_item_names, rejected_item_names)
if filter_item_names[name] == nil then -- not configured in one filter?
if moved_items < MAX_NUM_PER_CYC then
return math.min(4, MAX_NUM_PER_CYC - moved_items)
end
end
if rejected_item_names[name] then -- rejected item from another slot?
if moved_items < MAX_NUM_PER_CYC then
return math.min(rejected_item_names[name], MAX_NUM_PER_CYC - moved_items)
end
end
end
local function distributor_formspec(state, filter)
return "size[10,8.5]"..
return "size[10.5,8.5]"..
default.gui_bg..
default.gui_bg_img..
default.gui_slots..
@ -86,15 +96,15 @@ local function distributor_formspec(state, filter)
"checkbox[3,1;filter2;On;"..dump(filter[2]).."]"..
"checkbox[3,2;filter3;On;"..dump(filter[3]).."]"..
"checkbox[3,3;filter4;On;"..dump(filter[4]).."]"..
"image[3.6,0;0.3,1;tubelib_red.png]"..
"image[3.6,1;0.3,1;tubelib_green.png]"..
"image[3.6,2;0.3,1;tubelib_blue.png]"..
"image[3.6,3;0.3,1;tubelib_yellow.png]"..
"list[context;red;4,0;6,1;]"..
"list[context;green;4,1;6,1;]"..
"list[context;blue;4,2;6,1;]"..
"list[context;yellow;4,3;6,1;]"..
"list[current_player;main;1,4.5;8,4;]"..
"image[4,0;0.3,1;tubelib_red.png]"..
"image[4,1;0.3,1;tubelib_green.png]"..
"image[4,2;0.3,1;tubelib_blue.png]"..
"image[4,3;0.3,1;tubelib_yellow.png]"..
"list[context;red;4.5,0;6,1;]"..
"list[context;green;4.5,1;6,1;]"..
"list[context;blue;4.5,2;6,1;]"..
"list[context;yellow;4.5,3;6,1;]"..
"list[current_player;main;1.25,4.5;8,4;]"..
"listring[context;src]"..
"listring[current_player;main]"
end
@ -109,8 +119,8 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player)
end
if listname == "src" then
return stack:get_count()
elseif invlist_num_entries(list) < NUM_FILTER_ELEM then
return 1
elseif invlist_num_entries(list) < MAX_NUM_PER_CYC then
return stack:get_count()
end
return 0
end
@ -154,7 +164,8 @@ local function filter_settings(pos)
FilterCache[hash] = {
kvFilterItemNames = kvFilterItemNames,
kvSide2ItemNames = kvSide2ItemNames
kvSide2ItemNames = kvSide2ItemNames,
kvRejectedItemNames = {},
}
end
@ -225,25 +236,29 @@ local function keep_running(pos, elapsed)
-- read data from Cache
-- all filter items as key/value {<item:name> = true,...}
local kvFilterItemNames = FilterCache[hash].kvFilterItemNames
-- filter items of one slot as list {<item:name>,...}
local names = FilterCache[hash].kvSide2ItemNames[side]
-- filter items of one slot as list {{<item:name>, <num-items>},...}
local items = FilterCache[hash].kvSide2ItemNames[side]
-- rejected items from other filter slots
local rejected = FilterCache[hash].kvRejectedItemNames
if names == nil then
if items == nil then
-- this slot is empty
return true
end
local busy = false
-- move items from configured filters to the output
if next(names) then
for _,name in ipairs(names) do
if next(items) then
for _,item in ipairs(items) do
local name, num = item[1], item[2]
if kvSrc[name] then
local item = tubelib.get_this_item(meta, "src", kvSrc[name]) -- <<=== tubelib
local item = tubelib.get_this_item(meta, "src", kvSrc[name], num) -- <<=== tubelib
if item then
if not tubelib.push_items(pos, side, item, player_name) then -- <<=== tubelib
tubelib.put_item(meta, "src", item)
rejected[name] = num
else
counter[listname] = counter[listname] + 1
counter[listname] = counter[listname] + num
busy = true
end
end
@ -252,20 +267,27 @@ local function keep_running(pos, elapsed)
end
-- move additional items from unconfigured filters to the output
if next(names) == nil then
if next(items) == nil then
local moved_items = 0
for name,_ in pairs(kvSrc) do
if kvFilterItemNames[name] == nil then -- not in the filter so far?
local item = tubelib.get_this_item(meta, "src", kvSrc[name]) -- <<=== tubelib
local num = num_items(moved_items, name, kvFilterItemNames, rejected)
if num then
local item = tubelib.get_this_item(meta, "src", kvSrc[name], num) -- <<=== tubelib
if item then
if not tubelib.push_items(pos, side, item, player_name) then -- <<=== tubelib
tubelib.put_item(meta, "src", item)
else
counter[listname] = counter[listname] + 1
moved_items = moved_items + num
busy = true
end
end
end
end
-- delete list for next slot round
if moved_items > 0 then
FilterCache[hash].kvRejectedItemNames = {}
end
end
if busy == true then

@ -45,12 +45,12 @@ minetest.register_node("tubelib_addons1:chest", {
description = "Tubelib Protected Chest",
tiles = {
-- up, down, right, left, back, front
"default_chest_top.png",
"default_chest_top.png",
"default_chest_side.png",
"default_chest_side.png",
"default_chest_side.png",
"default_chest_lock.png",
"default_chest_top.png^tubelib_addons1_frame.png",
"default_chest_top.png^tubelib_addons1_frame.png",
"default_chest_side.png^tubelib_addons1_frame.png",
"default_chest_side.png^tubelib_addons1_frame.png",
"default_chest_side.png^tubelib_addons1_frame.png",
"default_chest_lock.png^tubelib_addons1_frame.png",
},
on_construct = function(pos)
@ -61,8 +61,10 @@ minetest.register_node("tubelib_addons1:chest", {
after_place_node = function(pos, placer)
local meta = minetest.get_meta(pos)
local number = tubelib.add_node(pos, "tubelib_addons1:chest")
meta:set_string("number", number)
meta:set_string("formspec", formspec())
meta:set_string("infotext", "Tubelib Protected Chest")
meta:set_string("infotext", "Tubelib Protected Chest "..number)
end,
can_dig = function(pos,player)
@ -76,6 +78,7 @@ minetest.register_node("tubelib_addons1:chest", {
on_dig = function(pos, node, puncher, pointed_thing)
minetest.node_dig(pos, node, puncher, pointed_thing)
tubelib.remove_node(pos)
end,
allow_metadata_inventory_put = allow_metadata_inventory_put,
@ -111,6 +114,11 @@ tubelib.register_node("tubelib_addons1:chest", {}, {
end,
on_recv_message = function(pos, topic, payload)
if topic == "state" then
local meta = minetest.get_meta(pos)
return tubelib.fuelstate(meta, "main")
else
return "unsupported"
end
end,
})

@ -414,6 +414,10 @@ minetest.register_craft({
tubelib.register_node("tubelib_addons1:harvester_base", {}, {
on_pull_stack = function(pos, side)
local meta = minetest.get_meta(pos)
return tubelib.get_stack(meta, "main")
end,
on_pull_item = function(pos, side)
local meta = minetest.get_meta(pos)
return tubelib.get_item(meta, "main")

@ -271,6 +271,12 @@ minetest.register_craftitem("tubelib_addons1:biofuel", {
inventory_image = "tubelib_addons1_biofuel.png",
})
minetest.register_craft({
type = "fuel",
recipe = "tubelib_addons1:biofuel",
burntime = 12,
})
minetest.register_craft({
output = "tubelib_addons1:reformer",

Binary file not shown.

After

Width:  |  Height:  |  Size: 269 B

@ -64,8 +64,10 @@ minetest.register_node("tubelib_addons3:chest", {
after_place_node = function(pos, placer)
local meta = minetest.get_meta(pos)
local number = tubelib.add_node(pos, "tubelib_addons3:chest")
meta:set_string("number", number)
meta:set_string("formspec", formspec())
meta:set_string("infotext", "HighPerf Chest")
meta:set_string("infotext", "HighPerf Chest "..number)
end,
can_dig = function(pos,player)
@ -79,6 +81,7 @@ minetest.register_node("tubelib_addons3:chest", {
on_dig = function(pos, node, puncher, pointed_thing)
minetest.node_dig(pos, node, puncher, pointed_thing)
tubelib.remove_node(pos)
end,
allow_metadata_inventory_put = allow_metadata_inventory_put,
@ -121,6 +124,11 @@ tubelib.register_node("tubelib_addons3:chest", {}, {
end,
on_recv_message = function(pos, topic, payload)
if topic == "state" then
local meta = minetest.get_meta(pos)
return tubelib.fuelstate(meta, "main")
else
return "unsupported"
end
end,
})