ta4_chest and display improvements

This commit is contained in:
Joachim Stolberg 2020-04-14 18:46:50 +02:00
parent 867227dbfd
commit 59a0a3248e
4 changed files with 59 additions and 48 deletions

View File

@ -27,6 +27,18 @@ local function gen_inv(nvm)
end end
end end
local function repair_inv(nvm)
nvm.inventory = nvm.inventory or {}
for i = 1,8 do
local item = nvm.inventory[i]
if not item or type(item) ~= "table"
or not item.name or type(item.name) ~= "string"
or not item.count or type(item.count) ~= "number" then
nvm.inventory[i] = {name = "", count = 0}
end
end
end
local function get_stack(nvm, idx) local function get_stack(nvm, idx)
nvm.inventory = nvm.inventory or {} nvm.inventory = nvm.inventory or {}
if nvm.inventory[idx] then if nvm.inventory[idx] then
@ -91,24 +103,26 @@ local function get_stacksize(pos)
end end
-- Sort the items into the nvm inventory -- Sort the items into the nvm inventory
-- If the nvm inventry is full, the items are stored in the main inventory local function sort_in(pos, nvm, stack)
-- If the main inventory is also full, false is returned local old_counts = {}
local function sort_in(pos, inv, nvm, stack) local orig_count = stack:get_count()
if inv:is_empty("main") then -- the main inv is used for the case the nvm-inventory is full for idx,item in ipairs(nvm.inventory or {}) do
for _,item in ipairs(nvm.inventory or {}) do if item.name and (item.name == "" or item.name == stack:get_name()) then
if item.name and (item.name == "" or item.name == stack:get_name()) then local count = math.min(stack:get_count(), get_stacksize(pos) - item.count)
local count = math.min(stack:get_count(), get_stacksize(pos) - item.count) old_counts[idx] = item.count -- store old value
item.count = item.count + count item.count = item.count + count
item.name = stack:get_name() item.name = stack:get_name()
stack:set_count(stack:get_count() - count) stack:set_count(stack:get_count() - count)
if stack:get_count() == 0 then if stack:get_count() == 0 then
return true return true
end
end end
end end
inv:add_item("main", stack)
return true
end end
-- restore old values
for idx,cnt in pairs(old_counts) do
nvm.inventory[idx].count = cnt
end
stack:set_count(orig_count)
return false return false
end end
@ -124,21 +138,10 @@ local function move_items_to_stack(item, stack, num)
return stack return stack
end end
local function get_item(pos, inv, nvm, item_name, count) local function get_item(pos, nvm, item_name, count)
local stack = {count = 0} local stack = {count = 0}
nvm.inventory = nvm.inventory or {} nvm.inventory = nvm.inventory or {}
if not inv:is_empty("main") then
if item_name then
local taken = inv:remove_item("main", {name = item_name, count = count})
if taken:get_count() > 0 then
return taken
end
else
return techage.get_items(pos, inv, "main", count)
end
end
if item_name then if item_name then
-- Take specified items from the chest -- Take specified items from the chest
for _,item in ipairs(nvm.inventory) do for _,item in ipairs(nvm.inventory) do
@ -327,6 +330,8 @@ end
local function on_rightclick(pos, node, clicker) local function on_rightclick(pos, node, clicker)
if M(pos):get_int("disabled") ~= 1 then if M(pos):get_int("disabled") ~= 1 then
local nvm = techage.get_nvm(pos)
repair_inv(nvm)
M(pos):set_string("formspec", formspec(pos)) M(pos):set_string("formspec", formspec(pos))
techage.set_activeformspec(pos, clicker) techage.set_activeformspec(pos, clicker)
end end
@ -482,8 +487,7 @@ minetest.register_node("techage:ta4_chest_dummy", {
techage.register_node({"techage:ta4_chest"}, { techage.register_node({"techage:ta4_chest"}, {
on_pull_item = function(pos, in_dir, num, item_name) on_pull_item = function(pos, in_dir, num, item_name)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
local inv = M(pos):get_inventory() local res = get_item(pos, nvm, item_name, num)
local res = get_item(pos, inv, nvm, item_name, num)
if techage.is_activeformspec(pos) then if techage.is_activeformspec(pos) then
M(pos):set_string("formspec", formspec(pos)) M(pos):set_string("formspec", formspec(pos))
end end
@ -491,8 +495,7 @@ techage.register_node({"techage:ta4_chest"}, {
end, end,
on_push_item = function(pos, in_dir, stack) on_push_item = function(pos, in_dir, stack)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
local inv = M(pos):get_inventory() local res = sort_in(pos, nvm, stack)
local res = sort_in(pos, inv, nvm, stack)
if techage.is_activeformspec(pos) then if techage.is_activeformspec(pos) then
M(pos):set_string("formspec", formspec(pos)) M(pos):set_string("formspec", formspec(pos))
end end
@ -500,8 +503,7 @@ techage.register_node({"techage:ta4_chest"}, {
end, end,
on_unpull_item = function(pos, in_dir, stack) on_unpull_item = function(pos, in_dir, stack)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
local inv = M(pos):get_inventory() local res = sort_in(pos, nvm, stack)
local res = sort_in(pos, inv, nvm, stack)
if techage.is_activeformspec(pos) then if techage.is_activeformspec(pos) then
M(pos):set_string("formspec", formspec(pos)) M(pos):set_string("formspec", formspec(pos))
end end

View File

@ -1349,9 +1349,7 @@ techage.manual_DE.aText = {
"\n", "\n",
"Die TA4 8x2000 Kiste hat kein normales Inventar wir andere Kisten\\, sondern verfügt über 8 Speicher\\, wobei jeder Speicher bis zu 2000 Items einer Sorte aufnehmen kann. Über die orangefarbenen Taster können Items in den Speicher verschoben bzw. wieder heraus geholt werden. Die Kiste kann auch wie sonst üblich mit einem Schieber (TA2\\, TA3 oder TA4) gefüllt bzw. geleert werden.\n".. "Die TA4 8x2000 Kiste hat kein normales Inventar wir andere Kisten\\, sondern verfügt über 8 Speicher\\, wobei jeder Speicher bis zu 2000 Items einer Sorte aufnehmen kann. Über die orangefarbenen Taster können Items in den Speicher verschoben bzw. wieder heraus geholt werden. Die Kiste kann auch wie sonst üblich mit einem Schieber (TA2\\, TA3 oder TA4) gefüllt bzw. geleert werden.\n"..
"\n".. "\n"..
"Wird die Kiste mit einem Schieber gefüllt\\, so füllen sich alle Speicherplätze von links nach rechts. Sind alle 8 Speicher voll und können keine weiteren Items hinzugefügt werden\\, so werden diese Items im Ein-/Ausgabe-Inventar gespeichert. Die Kiste ist damit für den Schieberbetrieb vollständig gefüllt und weitere Items werden abgewiesen.\n".. "Wird die Kiste mit einem Schieber gefüllt\\, so füllen sich alle Speicherplätze von links nach rechts. Sind alle 8 Speicher voll und können keine weiteren Items hinzugefügt werden\\, so werden weitere Items werden abgewiesen.\n"..
"\n"..
"Wird die Kiste über einen Schieber geleert\\, werden von Speicherplätzen Items entnommen.\n"..
"\n".. "\n"..
"*Reihenfunktion*\n".. "*Reihenfunktion*\n"..
"\n".. "\n"..

View File

@ -16,11 +16,25 @@ local NUM_ROWS = 5
local RADIUS = 6 local RADIUS = 6
local Param2ToFacedir = {[0] = 0, 0, 3, 1, 2, 0} local Param2ToFacedir = {[0] = 0, 0, 3, 1, 2, 0}
local function lcdlib_bugfix(text_tbl)
if text_tbl and next(text_tbl) then
local t = {}
for _,txt in ipairs(text_tbl) do
if txt == "" then
t[#t+1] = " "
else
t[#t+1] = txt
end
end
return table.concat(t, "\n")
end
return ""
end
local function display_update(pos, objref) local function display_update(pos, objref)
pos = vector.round(pos) pos = vector.round(pos)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
nvm.text = nvm.text or {""} local text = lcdlib_bugfix(nvm.text)
local text = table.concat(nvm.text, "\n")
local texture = lcdlib.make_multiline_texture( local texture = lcdlib.make_multiline_texture(
"default", text, "default", text,
70, 70, NUM_ROWS, "top", "#000") 70, 70, NUM_ROWS, "top", "#000")
@ -31,8 +45,7 @@ end
local function display_updateXL(pos, objref) local function display_updateXL(pos, objref)
pos = vector.round(pos) pos = vector.round(pos)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
nvm.text = nvm.text or {""} local text = lcdlib_bugfix(nvm.text)
local text = table.concat(nvm.text, "\n")
local texture = lcdlib.make_multiline_texture( local texture = lcdlib.make_multiline_texture(
"default", text, "default", text,
126, 70, NUM_ROWS, "top", "#000") 126, 70, NUM_ROWS, "top", "#000")
@ -175,7 +188,7 @@ minetest.register_craft({
local function add_line(pos, payload, cycle_time) local function add_line(pos, payload, cycle_time)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
local mem = techage.get_mem(pos) local mem = techage.get_mem(pos)
nvm.text = nvm.text or {""} nvm.text = nvm.text or {}
mem.ticks = mem.ticks or 0 mem.ticks = mem.ticks or 0
local str = tostring(payload) or "oops" local str = tostring(payload) or "oops"
@ -192,7 +205,7 @@ end
local function write_row(pos, payload, cycle_time) local function write_row(pos, payload, cycle_time)
local nvm = techage.get_nvm(pos) local nvm = techage.get_nvm(pos)
local mem = techage.get_mem(pos) local mem = techage.get_mem(pos)
nvm.text = nvm.text or {""} nvm.text = nvm.text or {}
mem.ticks = mem.ticks or 0 mem.ticks = mem.ticks or 0
local str = tostring(payload.str) or "oops" local str = tostring(payload.str) or "oops"
local row = tonumber(payload.row) or 1 local row = tonumber(payload.row) or 1
@ -209,8 +222,8 @@ local function write_row(pos, payload, cycle_time)
return return
end end
while #nvm.text <= row do while #nvm.text < row do
table.insert(nvm.text, " ") table.insert(nvm.text, "")
end end
nvm.text[row] = str nvm.text[row] = str
end end
@ -224,7 +237,7 @@ local function clear_screen(pos, cycle_time)
mem.ticks = cycle_time mem.ticks = cycle_time
end end
nvm.text = {""} nvm.text = {}
end end
techage.register_node({"techage:ta4_display"}, { techage.register_node({"techage:ta4_display"}, {

View File

@ -520,9 +520,7 @@ Die Funktion entspricht der von TA3. Die Kiste kann aber mehr Inhalt aufnehmen.
Die TA4 8x2000 Kiste hat kein normales Inventar wir andere Kisten, sondern verfügt über 8 Speicher, wobei jeder Speicher bis zu 2000 Items einer Sorte aufnehmen kann. Über die orangefarbenen Taster können Items in den Speicher verschoben bzw. wieder heraus geholt werden. Die Kiste kann auch wie sonst üblich mit einem Schieber (TA2, TA3 oder TA4) gefüllt bzw. geleert werden. Die TA4 8x2000 Kiste hat kein normales Inventar wir andere Kisten, sondern verfügt über 8 Speicher, wobei jeder Speicher bis zu 2000 Items einer Sorte aufnehmen kann. Über die orangefarbenen Taster können Items in den Speicher verschoben bzw. wieder heraus geholt werden. Die Kiste kann auch wie sonst üblich mit einem Schieber (TA2, TA3 oder TA4) gefüllt bzw. geleert werden.
Wird die Kiste mit einem Schieber gefüllt, so füllen sich alle Speicherplätze von links nach rechts. Sind alle 8 Speicher voll und können keine weiteren Items hinzugefügt werden, so werden diese Items im Ein-/Ausgabe-Inventar gespeichert. Die Kiste ist damit für den Schieberbetrieb vollständig gefüllt und weitere Items werden abgewiesen. Wird die Kiste mit einem Schieber gefüllt, so füllen sich alle Speicherplätze von links nach rechts. Sind alle 8 Speicher voll und können keine weiteren Items hinzugefügt werden, so werden weitere Items werden abgewiesen.
Wird die Kiste über einen Schieber geleert, werden von Speicherplätzen Items entnommen.
**Reihenfunktion** **Reihenfunktion**