From 3dbf81365b50a36d666d1756dac581d5d48a36d9 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sat, 11 Apr 2020 23:21:54 +0200 Subject: [PATCH] XL display, stackable 8x2000 chests added --- basic_machines/ta4_chest.lua | 106 ++++++++++++++++++++--- basis/networks.lua | 13 ++- doc/items.lua | 1 + doc/manual_DE.lua | 19 ++++ icta_controller/display.lua | 92 +++++++++++++++++++- lamps/growlight.lua | 21 +++-- lamps/lightblock.lua | 28 +++--- lamps/streetlamp2.lua | 2 +- locale/techage.de.tr | 3 +- locale/template.txt | 1 + logic/detector.lua | 1 - logic/gateblock.lua | 1 - lua_controller/server.lua | 3 - manuals/manual_ta4_DE.md | 18 ++++ manuals/toc_DE.md | 1 + oil/explore.lua | 1 - power/distribution.lua | 22 ++--- power/node_api.lua | 17 ++-- power/schedule.lua | 7 +- textures/techage_display.png | Bin 246 -> 148 bytes textures/techage_displayXL.png | Bin 0 -> 151 bytes textures/techage_display_inventoryXL.png | Bin 0 -> 229 bytes 22 files changed, 297 insertions(+), 60 deletions(-) create mode 100644 textures/techage_displayXL.png create mode 100644 textures/techage_display_inventoryXL.png diff --git a/basic_machines/ta4_chest.lua b/basic_machines/ta4_chest.lua index 2a3bab9..17dda49 100644 --- a/basic_machines/ta4_chest.lua +++ b/basic_machines/ta4_chest.lua @@ -13,6 +13,7 @@ ]]-- -- for lazy programmers +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end local M = minetest.get_meta local S = techage.S @@ -162,16 +163,65 @@ end local function formspec(pos) local nvm = techage.get_nvm(pos) local inv = M(pos):get_inventory() - return "size[8,7.2]".. + local size = M(pos):get_int("stacksize") + if size == 0 then size = STACK_SIZE end + return "size[8,7.6]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - formspec_container(0, 0, nvm, inv).. - "list[current_player;main;0,3.5;8,4;]".. + "label[0,-0.2;"..S("Size")..": 8x"..size.."]".. + formspec_container(0, 0.4, nvm, inv).. + "list[current_player;main;0,3.9;8,4;]".. "listring[context;main]".. "listring[current_player;main]" end +local function count_number_of_chests(pos) + local node = techage.get_node_lvm(pos) + local dir = techage.side_to_outdir("B", node.param2) + local pos1 = tubelib2.get_pos(pos, dir) + local cnt = 1 + while cnt < 50 do + node = techage.get_node_lvm(pos1) + if node.name ~= "techage:ta4_chest_dummy" then + break + end + pos1 = tubelib2.get_pos(pos1, dir) + cnt = cnt + 1 + end + M(pos):set_int("stacksize", STACK_SIZE * cnt) +end + +local function search_chest_in_front(pos, node) + local dir = techage.side_to_outdir("F", node.param2) + local pos1 = tubelib2.get_pos(pos, dir) + local cnt = 1 + while cnt < 50 do + node = techage.get_node_lvm(pos1) + if node.name ~= "techage:ta4_chest_dummy" then + break + end + pos1 = tubelib2.get_pos(pos1, dir) + cnt = cnt + 1 + end + if node.name == "techage:ta4_chest" then + minetest.after(1, count_number_of_chests, pos1) + return true + end + return false +end + +local function convert_to_chest_again(pos, node, player) + local dir = techage.side_to_outdir("B", node.param2) + local pos1 = tubelib2.get_pos(pos, dir) + local node1 = techage.get_node_lvm(pos1) + if node1.name == "techage:ta4_chest_dummy" then + node1.name = "techage:ta4_chest" + minetest.swap_node(pos1, node1) + M(pos1):set_int("disabled", 1) + end +end + local function allow_metadata_inventory_put(pos, listname, index, stack, player) if minetest.is_protected(pos, player:get_player_name()) then return 0 @@ -209,8 +259,10 @@ local function on_metadata_inventory_take(pos, listname, index, stack, player) end local function on_rightclick(pos, node, clicker) - M(pos):set_string("formspec", formspec(pos)) - techage.set_activeformspec(pos, clicker) + if M(pos):get_int("disabled") ~= 1 then + M(pos):set_string("formspec", formspec(pos)) + techage.set_activeformspec(pos, clicker) + end end -- take items from chest @@ -276,6 +328,7 @@ end local function after_dig_node(pos, oldnode, oldmetadata, digger) techage.remove_node(pos) + convert_to_chest_again(pos, oldnode, digger) end minetest.register_node("techage:ta4_chest", { @@ -287,7 +340,7 @@ minetest.register_node("techage:ta4_chest", { "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", - "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_front_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_front_ta4.png^techage_appl_warehouse.png", }, on_construct = function(pos) @@ -296,12 +349,18 @@ minetest.register_node("techage:ta4_chest", { end, after_place_node = function(pos, placer) - local nvm = techage.get_nvm(pos) - gen_inv(nvm) - local number = techage.add_node(pos, "techage:ta4_chest") - M(pos):set_string("owner", placer:get_player_name()) - M(pos):set_string("formspec", formspec(pos)) - M(pos):set_string("infotext", DESCRIPTION.." "..number) + local node = minetest.get_node(pos) + if search_chest_in_front(pos, node) then + node.name = "techage:ta4_chest_dummy" + minetest.swap_node(pos, node) + else + local nvm = techage.get_nvm(pos) + gen_inv(nvm) + local number = techage.add_node(pos, "techage:ta4_chest") + M(pos):set_string("owner", placer:get_player_name()) + M(pos):set_string("formspec", formspec(pos)) + M(pos):set_string("infotext", DESCRIPTION.." "..number) + end end, techage_set_numbers = function(pos, numbers, player_name) @@ -320,7 +379,28 @@ minetest.register_node("techage:ta4_chest", { on_metadata_inventory_take = on_metadata_inventory_take, paramtype2 = "facedir", - groups = {choppy=2, cracky=2, crumbly=2}, + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory = 1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("techage:ta4_chest_dummy", { + description = DESCRIPTION, + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta4.png^techage_frame_ta4_top.png", + "techage_filling_ta4.png^techage_frame_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_back_ta4.png", + "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_chest_front_ta4.png^techage_appl_warehouse.png", + }, + + on_rightclick = function(pos, node, clicker) + end, + paramtype2 = "facedir", + diggable = false, + groups = {not_in_creative_inventory = 1}, is_ground_content = false, sounds = default.node_sound_wood_defaults(), }) diff --git a/basis/networks.lua b/basis/networks.lua index a8ff892..dbd39c4 100644 --- a/basis/networks.lua +++ b/basis/networks.lua @@ -53,6 +53,16 @@ local function output(network, valid) print("Network ("..valid.."): "..table.concat(tbl, ", ")) end +local function debug(ntype) + local tbl = {} + for netID,netw in pairs(Networks[ntype] or {}) do + if type(netw) == "table" then + tbl[#tbl+1] = string.format("%X", netID) + end + end + return "Networks: "..table.concat(tbl, ", ") +end + local function hidden_node(pos, net_name) local name = M(pos):get_string("techage_hidden_nodename") local ndef = minetest.registered_nodes[name] @@ -257,7 +267,6 @@ local function remove_outdated_networks() end for _,item in ipairs(to_be_deleted) do local net_name, netID = unpack(item) - print("delete", net_name, netID) Networks[net_name][netID] = nil end minetest.after(60, remove_outdated_networks) @@ -296,6 +305,7 @@ end -- return network without maintainting the "alive" data function techage.networks.peek_network(tube_type, netID) + --print("peek_network", debug(tube_type)) return Networks[tube_type] and Networks[tube_type][netID] end @@ -326,6 +336,7 @@ function techage.networks.build_network(pos, outdir, tlib2, netID) end function techage.networks.get_network(tube_type, netID) + --print("get_network", string.format("%X", netID), debug(tube_type)) local netw = Networks[tube_type] and Networks[tube_type][netID] if netw then netw.alive = 3 -- monitored by scheduler (power) diff --git a/doc/items.lua b/doc/items.lua index f77df4a..6c3531c 100644 --- a/doc/items.lua +++ b/doc/items.lua @@ -141,6 +141,7 @@ techage.Items = { ta4_icta_controller = "techage:ta4_icta_controller", ta4_battery = "techage:ta4_battery", ta4_display = "techage:ta4_display", + ta4_displayXL = "techage:ta4_displayXL", ta4_signaltower = "techage:ta4_signaltower", ta4_lua_controller = "techage:ta4_lua_controller", ta4_lua_server = "techage:ta4_server", diff --git a/doc/manual_DE.lua b/doc/manual_DE.lua index 9514c57..5729596 100644 --- a/doc/manual_DE.lua +++ b/doc/manual_DE.lua @@ -144,6 +144,7 @@ techage.manual_DE.aTitel = { "3,TA4 ICTA Controller", "3,Batterie", "3,TA4 Display", + "3,TA4 Display XL", "3,TA4 Signal Tower", "2,TA4 Lua Controller", "3,TA4 Lua Server", @@ -1217,6 +1218,14 @@ techage.manual_DE.aText = { "\n", "Das Display zeigt nach dem Platzieren seine Nummer an. Über diese Nummer kann das Display angesprochen werden. Auf dem Display können Texte ausgegeben werden\\, wobei das Display 5 Zeilen und damit 5 unterschiedliche Texte darstellen kann.\n".. "\n".. + "Das Display wird maximal ein mal pro Sekunde aktualisiert.\n".. + "\n".. + "\n".. + "\n", + "Das TA4 Display XL hat die doppelte Größ wie das TA4 Display.\n".. + "\n".. + "Das Display wird maximal alle zwei Sekunden aktualisiert.\n".. + "\n".. "\n".. "\n", "Der Signal Tower kann rot\\, grün und orange anzeigen. Eine Kombination der 3 Farben ist nicht möglich.\n".. @@ -1335,6 +1344,14 @@ techage.manual_DE.aText = { "\n".. "Wird die Kiste über einen Schieber geleert\\, leeren sich auch die Speicher wieder von links nach rechts.\n".. "\n".. + "*Stapelfunktion*\n".. + "\n".. + "Mehrere TA4 8x2000 Kisten können zu einer großen Kiste mit mehr Inhalt verbunden werden. Dazu müssen die Kisten in einer Reihe hintereinander gesetzt werden.\n".. + "\n".. + "Zuerst muss die Front-Kiste gesetzt werden\\, dann werden die Stapel-Kisten mit gleicher Blickrichtung dahinter gesetzt (alle Kisten haben die Front in Richtung Spieler). Bei 2 Kisten in Reihe erhöht sich die Größe auf 8x4000\\, usw.\n".. + "\n".. + "Die angereihten Kisten können nun nicht mehr entfernt werden. Um die Kisten wieder abbauen zu können\\, muss zuerst die Frontkiste entfernt werden. Danach können die Kisten der Reihe nach wieder entfernt werden. \n".. + "\n".. "Die Kiste kann nur von den Spielern genutzt werden\\, die an diesem Ort auch bauen können\\, also Protection Rechte besitzen. Es spielt dabei keine Rolle\\, wer die Kiste setzt. \n".. "\n".. "Der Kiste besitzt ein zusätzliches Kommandos für den Lua Controller:\n".. @@ -1511,6 +1528,7 @@ techage.manual_DE.aItemName = { "ta4_icta_controller", "ta4_battery", "ta4_display", + "ta4_displayXL", "ta4_signaltower", "ta4_lua_controller", "ta4_lua_server", @@ -1711,5 +1729,6 @@ techage.manual_DE.aPlanTable = { "", "", "", + "", } diff --git a/icta_controller/display.lua b/icta_controller/display.lua index 2bd5d41..8f7bc3c 100644 --- a/icta_controller/display.lua +++ b/icta_controller/display.lua @@ -17,6 +17,7 @@ local RADIUS = 6 local Param2ToFacedir = {[0] = 0, 0, 3, 1, 2, 0} lcdlib.register_display_entity("techage:display_entity") +lcdlib.register_display_entity("techage:display_entityXL") local function display_update(pos, objref) local meta = minetest.get_meta(pos) @@ -29,10 +30,21 @@ local function display_update(pos, objref) visual_size = {x=0.94, y=0.94} }) end +local function display_updateXL(pos, objref) + local meta = minetest.get_meta(pos) + local text = meta:get_string("text") or "" + text = string.gsub(text, "|", " \n") + local texture = lcdlib.make_multiline_texture( + "default", text, + 126, 70, NUM_ROWS, "top", "#000") + objref:set_properties({ textures = {texture}, + visual_size = {x=0.94*1.9, y=0.94} }) +end + local function on_timer(pos) local node = minetest.get_node(pos) -- check if display is loaded and a player in front of the display - if node.name == "techage:ta4_display" then + if node.name == "techage:ta4_display" or node.name == "techage:ta4_displayXL" then local dir = minetest.facedir_to_dir(Param2ToFacedir[node.param2 % 6]) local pos2 = vector.add(pos, vector.multiply(dir, RADIUS)) for _, obj in pairs(minetest.get_objects_inside_radius(pos2, RADIUS)) do @@ -90,6 +102,51 @@ minetest.register_node("techage:ta4_display", { sounds = default.node_sound_glass_defaults(), }) +local lcd_boxXL = { + type = "fixed", + fixed = {-0.9, -8/16, -8/16, 0.9, -15/32, 8/16} +} + +minetest.register_node("techage:ta4_displayXL", { + description = "TA4 Display XL", + inventory_image = 'techage_display_inventoryXL.png', + tiles = {"techage_displayXL.png"}, + drawtype = "nodebox", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "wallmounted", + node_box = lcd_boxXL, + selection_box = lcd_boxXL, + light_source = 6, + + display_entities = { + ["techage:display_entityXL"] = { depth = 0.42, + on_display_update = display_updateXL}, + }, + + after_place_node = function(pos, placer) + local number = techage.add_node(pos, "techage:ta4_displayXL") + local meta = minetest.get_meta(pos) + meta:set_string("number", number) + meta:set_string("text", "My\nTechage\nTA4\nDisplay\nNo: "..number) + meta:set_int("startscreen", 1) + lcdlib.update_entities(pos) + end, + + after_dig_node = function(pos) + techage.remove_node(pos) + end, + + on_timer = on_timer, + on_place = lcdlib.on_place, + on_construct = lcdlib.on_construct, + on_destruct = lcdlib.on_destruct, + on_rotate = lcdlib.on_rotate, + groups = {cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_glass_defaults(), +}) + minetest.register_craft({ output = "techage:ta4_display", @@ -100,6 +157,14 @@ minetest.register_craft({ }, }) +minetest.register_craft({ + output = "techage:ta4_displayXL", + recipe = { + {"techage:ta4_display", "techage:ta4_display"}, + {"", ""}, + }, +}) + local function add_line(meta, payload) local text = meta:get_string("text") local rows @@ -147,7 +212,6 @@ end techage.register_node({"techage:ta4_display"}, { on_recv_message = function(pos, src, topic, payload) - local node = minetest.get_node(pos) local timer = minetest.get_node_timer(pos) if topic == "add" then -- add one line and scroll if necessary local meta = minetest.get_meta(pos) @@ -171,3 +235,27 @@ techage.register_node({"techage:ta4_display"}, { end, }) +techage.register_node({"techage:ta4_displayXL"}, { + on_recv_message = function(pos, src, topic, payload) + local timer = minetest.get_node_timer(pos) + if topic == "add" then -- add one line and scroll if necessary + local meta = minetest.get_meta(pos) + add_line(meta, payload) + if not timer:is_started() then + timer:start(2) + end + elseif topic == "set" then -- overwrite the given row + local meta = minetest.get_meta(pos) + write_row(meta, payload) + if not timer:is_started() then + timer:start(2) + end + elseif topic == "clear" then -- clear the screen + local meta = minetest.get_meta(pos) + meta:set_string("text", "") + if not timer:is_started() then + timer:start(2) + end + end + end, +}) diff --git a/lamps/growlight.lua b/lamps/growlight.lua index 5215a07..c0bfd79 100644 --- a/lamps/growlight.lua +++ b/lamps/growlight.lua @@ -15,6 +15,7 @@ local S = techage.S local CYCLE_TIME = 2 +local RANDOM_VAL = 20 local Cable = techage.ElectricCable local power = techage.power local Flowers = {} @@ -35,21 +36,31 @@ local Positions = { local function node_timer(pos, elapsed) power.consumer_alive(pos, Cable, CYCLE_TIME) local nvm = techage.get_nvm(pos) - nvm.tick = nvm.tick or math.random(15, 30) + local mem = techage.get_mem(pos) + mem.grow_pos = mem.grow_pos or {} -- keep the pos blank for same time + nvm.tick = nvm.tick or math.random(RANDOM_VAL, RANDOM_VAL*2) nvm.tick = nvm.tick - 1 if nvm.tick == 0 then - nvm.tick = math.random(15, 30) - local plant_pos = vector.add(pos, Positions[math.random(1, 9)]) + nvm.tick = math.random(RANDOM_VAL, RANDOM_VAL*2) + local plant_idx = math.random(1, 9) + local plant_pos = vector.add(pos, Positions[plant_idx]) local soil_pos = {x = plant_pos.x, y = plant_pos.y - 1, z = plant_pos.z} local plant_node = minetest.get_node(plant_pos) local soil_node = minetest.get_node(soil_pos) if soil_node and soil_node.name == "compost:garden_soil" then if plant_node and plant_node.name == "air" then - local idx = math.floor(math.random(1, #Flowers)) - minetest.set_node(plant_pos, {name = Flowers[idx]}) + if mem.grow_pos[plant_idx] then + local idx = math.floor(math.random(1, #Flowers)) + minetest.set_node(plant_pos, {name = Flowers[idx]}) + mem.grow_pos[plant_idx] = false + else + mem.grow_pos[plant_idx] = true + end elseif plant_node and Plants[plant_node.name] then local ndef = minetest.registered_nodes[plant_node.name] ndef.on_timer(plant_pos, 200) + else + mem.grow_pos[plant_idx] = false end end end diff --git a/lamps/lightblock.lua b/lamps/lightblock.lua index 753a12e..b4f089a 100644 --- a/lamps/lightblock.lua +++ b/lamps/lightblock.lua @@ -41,22 +41,24 @@ minetest.register_node("techage:lightblock", { groups = {not_in_creative_inventory=1}, }) -function techage.light_ring(center_pos, on) - for _,dir in ipairs(Positions) do - local pos1 = vector.add(center_pos, dir) - local node = techage.get_node_lvm(pos1) - if on then +function techage.light_ring(center_pos, on, large) + if on then + for _,dir in ipairs(Positions) do + if large then + dir = vector.multiply(dir, 2) + end + local pos1 = vector.add(center_pos, dir) + local node = techage.get_node_lvm(pos1) if node.name == "air" then minetest.set_node(pos1, {name = "techage:lightblock"}) end - else - if node.name == "techage:lightblock" then - minetest.remove_node(pos1) - end end + else + local pos1 = {x=center_pos.x-2, y=center_pos.y-2, z=center_pos.z-2} + local pos2 = {x=center_pos.x+2, y=center_pos.y+2, z=center_pos.z+2} + for _,pos in ipairs(minetest.find_nodes_in_area(pos1, pos2, "techage:lightblock")) do + minetest.remove_node(pos) + end + minetest.fix_light(pos1, pos2) end - local pos1 = {x=center_pos.x-2, y=center_pos.y-2, z=center_pos.z-2} - local pos2 = {x=center_pos.x+2, y=center_pos.y+2, z=center_pos.z+2} - minetest.fix_light(pos1, pos2) end - \ No newline at end of file diff --git a/lamps/streetlamp2.lua b/lamps/streetlamp2.lua index 11b30b6..68f2e42 100644 --- a/lamps/streetlamp2.lua +++ b/lamps/streetlamp2.lua @@ -15,7 +15,7 @@ local S = techage.S local function on_switch_lamp(pos, on) - techage.light_ring({x = pos.x, y = pos.y - 3, z = pos.z}, on) + techage.light_ring({x = pos.x, y = pos.y - 3, z = pos.z}, on, true) end techage.register_lamp("techage:streetlamp2", { diff --git a/locale/techage.de.tr b/locale/techage.de.tr index 41fdffc..bed4440 100644 --- a/locale/techage.de.tr +++ b/locale/techage.de.tr @@ -35,7 +35,7 @@ Build derrick=Errichte Ölturm Compressed Gravel=Komprimiertes Kies Consum. 1=Konsum. 1 Consum. 2=Konsum. 2 -Current power:=Aktueller Verbrauch: +Current power:=Strom aktuell: Depth=Tiefe Digging depth=Grabungstiefe Dirt with Ash=Erde mit Asche @@ -161,6 +161,7 @@ Send signal if nodes have been:=Sende ein Signal falls Blöcke: Show all forceload blocks in a 64x64x64 range=Zeige alle Forceload Blöcke im Umkreis von 64x64x64 Blöcken Sieved Basalt Gravel=Basaltkies gesiebt Sieved Gravel=Gesiebtes Kies +Size=Größe Solar system=Solaranlage Start level=Startebene Start level @= 0@nmeans the same level@nas the quarry is placed=Startebene @= 0@nbedeutet gleiche Ebene@nwie der Steinbrecher diff --git a/locale/template.txt b/locale/template.txt index a0a5be2..72b04ca 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -159,6 +159,7 @@ Send signal if nodes have been:= Show all forceload blocks in a 64x64x64 range= Sieved Basalt Gravel= Sieved Gravel= +Size= Solar system= Start level= Start level @= 0@nmeans the same level@nas the quarry is placed= diff --git a/logic/detector.lua b/logic/detector.lua index cc6bbce..8a2bc49 100644 --- a/logic/detector.lua +++ b/logic/detector.lua @@ -225,7 +225,6 @@ techage.register_node({"techage:ta4_detector_off", "techage:ta4_detector_on"}, { is_pusher = true, -- is a pulling/pushing node on_recv_message = function(pos, src, topic, payload) - print(topic, payload) if topic == "count" then local nvm = techage.get_nvm(pos) return nvm.counter or 0 diff --git a/logic/gateblock.lua b/logic/gateblock.lua index 00720ba..447f536 100644 --- a/logic/gateblock.lua +++ b/logic/gateblock.lua @@ -59,7 +59,6 @@ for idx,pgn in ipairs(tPgns) do end if fields.exit then meta:set_string("formspec", nil) - print(node.name) local number = techage.add_node(pos, node.name) meta:set_string("infotext", S("TechAge Gate Block").." "..number) end diff --git a/lua_controller/server.lua b/lua_controller/server.lua index 069a98a..a23e394 100644 --- a/lua_controller/server.lua +++ b/lua_controller/server.lua @@ -149,11 +149,8 @@ local function write_value(nvm, key, item) if nvm.data[key] then nvm.size = nvm.size - calc_size(nvm.data[key]) end - print(type(item)) if type(item) == "table" then - print("item1", dump(item)) item = safer_lua.datastruct_to_table(item) - print("item1", dump(item)) end nvm.size = nvm.size + calc_size(item) nvm.data[key] = item diff --git a/manuals/manual_ta4_DE.md b/manuals/manual_ta4_DE.md index 1813e98..61572a4 100644 --- a/manuals/manual_ta4_DE.md +++ b/manuals/manual_ta4_DE.md @@ -340,8 +340,18 @@ Die Batterie muss in unmittelbarer Nähe zum Controller platziert werden, also a Das Display zeigt nach dem Platzieren seine Nummer an. Über diese Nummer kann das Display angesprochen werden. Auf dem Display können Texte ausgegeben werden, wobei das Display 5 Zeilen und damit 5 unterschiedliche Texte darstellen kann. +Das Display wird maximal ein mal pro Sekunde aktualisiert. + [ta4_display|image] +### TA4 Display XL + +Das TA4 Display XL hat die doppelte Größ wie das TA4 Display. + +Das Display wird maximal alle zwei Sekunden aktualisiert. + +[ta4_displayXL|image] + ### TA4 Signal Tower @@ -514,6 +524,14 @@ Wird die Kiste mit einem Schieber gefüllt, so füllen sich alle Speicherplätze Wird die Kiste über einen Schieber geleert, leeren sich auch die Speicher wieder von links nach rechts. +**Stapelfunktion** + +Mehrere TA4 8x2000 Kisten können zu einer großen Kiste mit mehr Inhalt verbunden werden. Dazu müssen die Kisten in einer Reihe hintereinander gesetzt werden. + +Zuerst muss die Front-Kiste gesetzt werden, dann werden die Stapel-Kisten mit gleicher Blickrichtung dahinter gesetzt (alle Kisten haben die Front in Richtung Spieler). Bei 2 Kisten in Reihe erhöht sich die Größe auf 8x4000, usw. + +Die angereihten Kisten können nun nicht mehr entfernt werden. Um die Kisten wieder abbauen zu können, muss zuerst die Frontkiste entfernt werden. Danach können die Kisten der Reihe nach wieder entfernt werden. + Die Kiste kann nur von den Spielern genutzt werden, die an diesem Ort auch bauen können, also Protection Rechte besitzen. Es spielt dabei keine Rolle, wer die Kiste setzt. Der Kiste besitzt ein zusätzliches Kommandos für den Lua Controller: diff --git a/manuals/toc_DE.md b/manuals/toc_DE.md index 018a63b..f1eab16 100644 --- a/manuals/toc_DE.md +++ b/manuals/toc_DE.md @@ -143,6 +143,7 @@ - [TA4 ICTA Controller](./manual_ta4_DE.md#ta4-icta-controller) - [Batterie](./manual_ta4_DE.md#batterie) - [TA4 Display](./manual_ta4_DE.md#ta4-display) + - [TA4 Display XL](./manual_ta4_DE.md#ta4-display-xl) - [TA4 Signal Tower](./manual_ta4_DE.md#ta4-signal-tower) - [TA4 Lua Controller](./manual_ta4_DE.md#ta4-lua-controller) - [TA4 Lua Server](./manual_ta4_DE.md#ta4-lua-server) diff --git a/oil/explore.lua b/oil/explore.lua index 439c79c..21f3007 100644 --- a/oil/explore.lua +++ b/oil/explore.lua @@ -334,7 +334,6 @@ function techage.explore.dec_oil_amount(posC) if idx <= (OIL_BUBBLE_SIZE - 256) then -- first level is stone, too local pos = calc_vmdata_pos(posC, idx) local node = techage.get_node_lvm(pos) - print(idx, P2S(pos), node.name) if node.name == "techage:oil_source" then minetest.remove_node(pos) end diff --git a/power/distribution.lua b/power/distribution.lua index 804fabb..1e5faa8 100644 --- a/power/distribution.lua +++ b/power/distribution.lua @@ -50,13 +50,13 @@ local function stop_consumer(tbl, tlib_type) end end -local function get_generator_sum(tbl, tlib_type) +local function get_generator_sum(tbl, tlib_type, cycle_time) local sum = 0 for _,v in ipairs(tbl or {}) do local nvm = techage.get_nvm(v.pos) local def = nvm[tlib_type] -- power related network data if def and def["gstate"] ~= STOPPED then - def["galive"] = (def["galive"] or 1) - 1 + def["galive"] = (def["galive"] or 1) - cycle_time/2 if def["galive"] >= 0 then sum = sum + (def.curr_power or v.nominal) end @@ -65,13 +65,13 @@ local function get_generator_sum(tbl, tlib_type) return sum end -local function get_consumer_sum(tbl, tlib_type) +local function get_consumer_sum(tbl, tlib_type, cycle_time) local sum = 0 for _,v in ipairs(tbl or {}) do local nvm = techage.get_nvm(v.pos) local def = nvm[tlib_type] -- power related network data if def and def["cstate"] ~= STOPPED then - def["calive"] = (def["calive"] or 1) - 1 + def["calive"] = (def["calive"] or 1) - cycle_time/2 if def["calive"] >= 0 then sum = sum + v.nominal end @@ -123,13 +123,13 @@ local function set_taken_values(tbl, taken, tlib_type) return taken end -function techage.power.power_distribution(network, tlib_type, netID) +function techage.power.power_distribution(network, tlib_type, netID, cycle_time) -- calc maximum power values - network.available1 = get_generator_sum(network.gen1, tlib_type) - network.available2 = get_generator_sum(network.gen2, tlib_type) - network.needed1 = get_consumer_sum(network.con1, tlib_type) - network.needed2 = get_consumer_sum(network.con2, tlib_type) - --print(string.format("%X", netID), network.available1, network.available2, network.needed1, network.needed2, network.alive) + network.available1 = get_generator_sum(network.gen1, tlib_type, cycle_time) + network.available2 = get_generator_sum(network.gen2, tlib_type, cycle_time) + network.needed1 = get_consumer_sum(network.con1, tlib_type, cycle_time) + network.needed2 = get_consumer_sum(network.con2, tlib_type, cycle_time) + --print(string.format("%X", netID), network.available1, network.available2, network.needed1, network.needed2) -- store results network.on = network.available1 + network.available2 >= network.needed1 @@ -145,4 +145,4 @@ function techage.power.power_distribution(network, tlib_type, netID) stop_consumer(network.con1, tlib_type) set_taken_values(network.con2, 0, tlib_type) end -end \ No newline at end of file +end diff --git a/power/node_api.lua b/power/node_api.lua index 2225d65..41d10a7 100644 --- a/power/node_api.lua +++ b/power/node_api.lua @@ -91,6 +91,15 @@ local function trigger_network(pos, outdir, Cable) end end +local function build_network_consumer(pos, Cable) + local outdirs = techage.networks.get_node_connections(pos, Cable.tube_type) + if #outdirs == 1 then + local netID = determine_netID(pos, outdirs[1], Cable) + store_netID(pos, outdirs[1], netID, Cable) + networks.build_network(pos, outdirs[1], Cable, netID) + end +end + -- To be called from each node via 'tubelib2_on_update2' -- 'output' is optional and only needed for nodes with dedicated -- pipe sides (e.g. pumps). @@ -160,14 +169,12 @@ function techage.power.consumer_alive(pos, Cable, cycle_time) local nvm = techage.get_nvm(pos) local def = nvm[Cable.tube_type] -- power related network data if def then + if not def["netID"] or not networks.get_network(Cable.tube_type, def["netID"]) then + build_network_consumer(pos, Cable) + end local rv = (cycle_time / 2) + 1 if def["netID"] and def["calive"] and def["calive"] < rv then -- network available def["calive"] = rv - def["still_runing"] = true - return def["taken"] or 0 - elseif def["still_runing"] then - def["calive"] = rv - def["still_runing"] = false return def["taken"] or 0 elseif not def["cstate"] or def["cstate"] == RUNNING then local ndef = net_def(pos, Cable.tube_type) diff --git a/power/schedule.lua b/power/schedule.lua index a7832cf..ed7d9c9 100644 --- a/power/schedule.lua +++ b/power/schedule.lua @@ -22,7 +22,7 @@ local HEX = function(val) return string.format("%XH", val) end local power = techage.power local networks = techage.networks -local CYCLE_TIME = 1.8 +local CYCLE_TIME = 1 techage.schedule = {} @@ -57,7 +57,7 @@ minetest.register_globalstep(function(dtime) while item do local network = networks.peek_network(item.tube_type, item.netID) if network and network.alive and network.alive >= 0 then - power.power_distribution(network, item.tube_type, item.netID) + power.power_distribution(network, item.tube_type, item.netID, CYCLE_TIME) network.alive = network.alive - 1 push(item) else @@ -74,6 +74,9 @@ end) function techage.schedule.start(tube_type, netID) if not JobTable[netID] then + local network = networks.peek_network(tube_type, netID) + power.power_distribution(network, tube_type, netID, CYCLE_TIME/2) + network.alive = network.alive - 1 push({tube_type = tube_type, netID = netID}) JobTable[netID] = true end diff --git a/textures/techage_display.png b/textures/techage_display.png index 9e9e3e766bfa804038c45fa8896c58d3d7be217b..069a69413431a6b93735ab1ab0b00b1f4829ecb5 100644 GIT binary patch delta 131 zcmeyyIE8V7L=6)&0|Nt}$fR^2#ggvm>&U>cv7h@-A}f&3SRCZ;#IWw1%u67Lv%n*= z7^w6x2s0kfUy%Y54DbnY1=362xh5tgM9(^q2;_)(x;TbNTu$a_Wonyv#(~XC_Jj>X Xp`h<($&xljpge=8tDnm{r-UW|sHr2B delta 210 zcmbQj_>FObgfs^m0|P^GRn-?D#g^pl?gFHN;HUHM`iXWD_3R~{zOL+#7+Lsa*u$@T zTLGn-JzX3_A`ZX3zEG6OP@v^u{pS@7bISrQGuicCJfwB2b6M*gE4dku?Nn{1`8H2NHoCaZeY=5RLQ6 p9InhfiNS%G}U;vjb? zhIQv;UIICs1s;*bK&6L4nDKc2iWHDwfKQ04PiEngcdkHQ``zDDLE1`!{DK)Ap4~_T zaw0rk977~7Pd#VIb-;jw^+L?0hMTgpervqAw{-a$&Nh*klk878?^9elheb*HZQ23G zFOmX>yH6ypFj8FA^d>d?#%r7Jd55ZYhIui>F4*&PiZ%0}KOZ`C<~(8ju+eqG@wnyt Qfp#!>y85}Sb4q9e0MxorcK`qY literal 0 HcmV?d00001