From 10dabd04ffa9e13e828804555c008fe5980fbafa Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Mon, 11 Jul 2022 20:24:44 +0200 Subject: [PATCH] built on 11/07/2022 20:24:44 --- README.md | 8 +- hyperloop/tubecrowbar.lua | 2 +- lcdlib/README.md | 2 +- lcdlib/depends.txt | 0 lcdlib/mod.conf | 1 + minecart/baselib.lua | 28 +- minecart/tool.lua | 2 +- networks/liquid.lua | 13 +- signs_bot/README.md | 2 + signs_bot/basis.lua | 4 + signs_bot/cmd_farming.lua | 23 +- signs_bot/mod.conf | 2 +- signs_bot/nodes.lua | 55 +- signs_bot/robot.lua | 19 + ta4_jetpack/init.lua | 13 +- techage/README.md | 12 +- techage/basic_machines/chest.lua | 20 +- techage/basic_machines/concentrator.lua | 8 + techage/basic_machines/distributor.lua | 86 +++- techage/basic_machines/electronic_fab.lua | 11 +- techage/basic_machines/forceload.lua | 19 +- techage/basic_machines/gravelrinser.lua | 8 +- techage/basic_machines/gravelsieve.lua | 8 +- techage/basic_machines/grinder.lua | 13 +- techage/basic_machines/liquidsampler.lua | 8 +- techage/basic_machines/pusher.lua | 42 +- techage/basic_machines/quarry.lua | 13 +- techage/basic_machines/recycler.lua | 10 +- techage/basic_machines/ta4_chest.lua | 43 +- techage/basic_machines/ta4_injector.lua | 8 +- techage/basic_machines/ta5_chest.lua | 9 + techage/basis/assemble.lua | 3 +- techage/basis/command.lua | 44 ++ techage/basis/fly_lib.lua | 210 ++++++-- techage/basis/hyperloop.lua | 24 +- techage/basis/lib.lua | 125 ++--- techage/basis/mark.lua | 2 +- techage/basis/mark2.lua | 2 +- techage/basis/mark_lib.lua | 1 - techage/basis/node_states.lua | 74 ++- techage/basis/node_store.lua | 2 +- techage/basis/recipe_lib.lua | 7 +- techage/basis/submenu.lua | 2 +- techage/beduino/kv_store.lua | 60 +++ techage/carts/chest_cart.lua | 11 +- techage/chemistry/ta4_doser.lua | 8 +- techage/coal_power_station/firebox.lua | 14 +- techage/coal_power_station/generator.lua | 13 +- techage/coal_power_station/oilfirebox.lua | 14 +- techage/collider/detector.lua | 6 +- techage/doc/items.lua | 1 + techage/doc/manual_DE.lua | 23 +- techage/doc/manual_EN.lua | 23 +- techage/doc/plans.lua | 2 - techage/energy_storage/heatexchanger2.lua | 33 +- techage/fermenter/gasflare.lua | 2 +- techage/furnace/firebox.lua | 14 +- techage/furnace/furnace_top.lua | 13 +- techage/fusion_reactor/controller.lua | 7 + techage/fusion_reactor/heatexchanger2.lua | 37 +- techage/fusion_reactor/ta5_pump.lua | 6 + techage/hydrogen/electrolyzer.lua | 21 +- techage/hydrogen/fuelcell.lua | 15 +- techage/icta_controller/battery.lua | 10 +- techage/icta_controller/commands.lua | 18 +- techage/icta_controller/controller.lua | 28 +- techage/icta_controller/display.lua | 40 +- techage/icta_controller/signaltower.lua | 25 +- techage/init.lua | 11 +- techage/items/moreblocks.lua | 4 +- techage/items/registered_nodes.lua | 5 +- techage/liquids/pump.lua | 11 + techage/liquids/silo.lua | 21 +- techage/liquids/valve.lua | 25 +- techage/liquids/waterpump.lua | 8 +- techage/locale/techage.de.tr | 7 + techage/locale/template.txt | 7 + techage/logic/button.lua | 36 +- techage/logic/cart_detector.lua | 24 +- techage/logic/collector.lua | 13 +- techage/logic/detector.lua | 38 +- techage/logic/light_detector.lua | 189 +++++++ techage/logic/logic_block.lua | 27 +- techage/logic/lua_logic.lua | 16 +- techage/logic/mba_detector.lua | 19 +- techage/logic/node_detector.lua | 23 +- techage/logic/player_detector.lua | 18 +- techage/logic/sequencer.lua | 24 +- techage/logic/sequencer2.lua | 30 +- techage/logic/signallamp.lua | 15 +- techage/logic/signallamp_2x.lua | 21 +- techage/logic/signallamp_4x.lua | 21 +- techage/lua_controller/controller.lua | 25 +- techage/lua_controller/sensorchest.lua | 45 +- techage/manuals/manual_ta3_DE.md | 24 +- techage/manuals/manual_ta3_EN.md | 20 +- techage/manuals/manual_ta4_DE.md | 2 + techage/manuals/manual_ta4_EN.md | 2 + techage/manuals/ta4_lua_controller_EN.md | 11 +- techage/manuals/ta_iom.md | 85 ++++ techage/manuals/ta_kvstore.md | 78 +++ techage/manuals/toc_DE.md | 1 + techage/manuals/toc_EN.md | 1 + techage/move_controller/doorcontroller.lua | 13 +- techage/move_controller/doorcontroller2.lua | 93 ++-- techage/move_controller/flycontroller.lua | 29 +- techage/move_controller/movecontroller.lua | 108 +++- techage/move_controller/soundblock.lua | 45 +- techage/move_controller/turncontroller.lua | 63 ++- techage/oil/drillbox.lua | 10 +- techage/oil/pumpjack.lua | 20 +- techage/oil/reboiler.lua | 11 +- techage/power/power_line.lua | 12 +- techage/power/powerswitch.lua | 32 +- techage/recipe_checker.lua | 2 +- techage/settingtypes.txt | 6 +- techage/solar/inverter.lua | 13 +- techage/solar/minicell.lua | 16 +- techage/ta2_energy_storage/ta2_winch.lua | 8 +- techage/ta3_power/akkubox.lua | 13 +- techage/ta3_power/tiny_generator.lua | 15 +- techage/ta4_power/electricmeter.lua | 13 +- techage/ta4_power/laser.lua | 10 +- techage/ta4_power/transformer.lua | 8 +- techage/teleport/teleport_pipe.lua | 32 +- techage/teleport/teleport_tube.lua | 6 + .../textures/techage_appl_lightdetector.png | Bin 0 -> 1957 bytes .../techage_appl_lightdetector_on.png | Bin 0 -> 2250 bytes techage/tools/repairkit.lua | 5 + techage/wind_turbine/rotor.lua | 36 +- tubelib2/README.md | 4 +- tubelib2/depends.txt | 2 - tubelib2/i18n.py | 476 ++++++++++++++++++ tubelib2/init.lua | 6 +- tubelib2/internal1.lua | 23 +- tubelib2/internal2.lua | 18 +- tubelib2/intllib.lua | 45 -- tubelib2/locale/de.mo | Bin 686 -> 0 bytes tubelib2/locale/de.po | 45 -- tubelib2/locale/template.pot | 42 -- tubelib2/locale/template.txt | 8 + tubelib2/locale/tubelib2.de.tr | 8 + tubelib2/mod.conf | 2 + tubelib2/settingtypes.txt | 4 +- tubelib2/storage.lua | 14 +- tubelib2/tube_api.lua | 21 +- tubelib2/tube_test.lua | 14 +- unified_inventory/api.lua | 57 ++- unified_inventory/callbacks.lua | 27 +- unified_inventory/group.lua | 41 -- unified_inventory/init.lua | 39 +- unified_inventory/internal.lua | 68 ++- unified_inventory/legacy.lua | 55 ++ unified_inventory/screenshot.png | Bin 137234 -> 225046 bytes .../textures/ui_formbg_9_sliced.png | Bin 240 -> 510 bytes .../textures/ui_smallbg_9_sliced.png | Bin 139 -> 551 bytes 156 files changed, 3229 insertions(+), 748 deletions(-) delete mode 100644 lcdlib/depends.txt create mode 100644 lcdlib/mod.conf create mode 100644 techage/beduino/kv_store.lua create mode 100755 techage/logic/light_detector.lua create mode 100644 techage/manuals/ta_iom.md create mode 100644 techage/manuals/ta_kvstore.md create mode 100755 techage/textures/techage_appl_lightdetector.png create mode 100755 techage/textures/techage_appl_lightdetector_on.png delete mode 100644 tubelib2/depends.txt create mode 100644 tubelib2/i18n.py delete mode 100644 tubelib2/intllib.lua delete mode 100644 tubelib2/locale/de.mo delete mode 100644 tubelib2/locale/de.po delete mode 100644 tubelib2/locale/template.pot create mode 100644 tubelib2/locale/template.txt create mode 100644 tubelib2/locale/tubelib2.de.tr create mode 100644 unified_inventory/legacy.lua diff --git a/README.md b/README.md index 000e45d..f7d5006 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ This modpack covers all necessary and useful mods to be able to use techage. All mods have the own README.txt. For further information please consult these files. -This modpack includes: +This modpack contains: - techage: The main mod - ta4_jetpack: A Jetpack for techage with hydrogen as fuel and TA4 recipe - ta4_paraglider: A Paraglider for techage with TA4 recipe @@ -47,6 +47,12 @@ ta4_jetpack requires the modpack 3d_armor. 3d_armor is itself a modpack and can' ### History +#### 2022-07-11 + +Updated Mods: +- techage (fusion reactor added) + + #### 2022-01-28 Updated Mods: diff --git a/hyperloop/tubecrowbar.lua b/hyperloop/tubecrowbar.lua index a359e9e..2e616de 100644 --- a/hyperloop/tubecrowbar.lua +++ b/hyperloop/tubecrowbar.lua @@ -109,7 +109,7 @@ minetest.register_node("hyperloop:tube_crowbar", { description = S("Hyperloop Tube Crowbar"), inventory_image = "hyperloop_tubecrowbar.png", wield_image = "hyperloop_tubecrowbar.png", - use_texture_alpha = true, + use_texture_alpha = hyperloop.CLIP, groups = {cracky=1, book=1}, on_use = remove_tube, on_place = repair_tubes, diff --git a/lcdlib/README.md b/lcdlib/README.md index 3f620e3..4a658a1 100644 --- a/lcdlib/README.md +++ b/lcdlib/README.md @@ -2,7 +2,7 @@ This LCD Lib is based on Display Lib and Font Lib from Pierre-Yves Rollo -**Dependancies**: default +**Dependancies**: none **License**: LGPL diff --git a/lcdlib/depends.txt b/lcdlib/depends.txt deleted file mode 100644 index e69de29..0000000 diff --git a/lcdlib/mod.conf b/lcdlib/mod.conf new file mode 100644 index 0000000..4e0f72f --- /dev/null +++ b/lcdlib/mod.conf @@ -0,0 +1 @@ +name = lcdlib \ No newline at end of file diff --git a/minecart/baselib.lua b/minecart/baselib.lua index 53bd7ad..09fea93 100644 --- a/minecart/baselib.lua +++ b/minecart/baselib.lua @@ -144,7 +144,7 @@ minetest.register_entity("minecart:marker", { initial_properties = { visual = "upright_sprite", textures = {"minecart_marker_cube.png"}, - use_texture_alpha = true, + use_texture_alpha = minecart.CLIP, physical = false, glow = 12, static_save = false, @@ -196,23 +196,27 @@ function minecart.is_owner(player, owner) end function minecart.get_buffer_pos(pos, player_name) - local pos1 = minecart.find_node_near_lvm(pos, 1, {"minecart:buffer"}) - if pos1 then - local meta = minetest.get_meta(pos1) - if player_name == nil or player_name == meta:get_string("owner") then - return pos1 + if pos then + local pos1 = minecart.find_node_near_lvm(pos, 1, {"minecart:buffer"}) + if pos1 then + local meta = minetest.get_meta(pos1) + if player_name == nil or player_name == meta:get_string("owner") then + return pos1 + end end end end function minecart.get_buffer_name(pos) - local pos1 = minecart.find_node_near_lvm(pos, 1, {"minecart:buffer"}) - if pos1 then - local name = M(pos1):get_string("name") - if name ~= "" then - return name + if pos then + local pos1 = minecart.find_node_near_lvm(pos, 1, {"minecart:buffer"}) + if pos1 then + local name = M(pos1):get_string("name") + if name ~= "" then + return name + end + return P2S(pos1) end - return P2S(pos1) end end diff --git a/minecart/tool.lua b/minecart/tool.lua index 593d3de..55868a7 100644 --- a/minecart/tool.lua +++ b/minecart/tool.lua @@ -102,7 +102,7 @@ minetest.register_node("minecart:tool", { inventory_image = "minecart_tool.png", wield_image = "minecart_tool.png", liquids_pointable = true, - use_texture_alpha = true, + use_texture_alpha = minecart.CLIP, groups = {cracky=1, book=1}, on_use = click_left, on_place = click_right, diff --git a/networks/liquid.lua b/networks/liquid.lua index 59f2f8e..1082cc9 100644 --- a/networks/liquid.lua +++ b/networks/liquid.lua @@ -181,16 +181,16 @@ end function networks.liquid.srv_peek(nvm) nvm.liquid = nvm.liquid or {} - return nvm.liquid.name + nvm.liquid.amount = math.floor((nvm.liquid.amount or 0) + 0.5) + return nvm.liquid.amount > 0 and nvm.liquid.name end function networks.liquid.srv_put(nvm, name, amount, capa) assert(name) - assert(amount and amount >= 0) assert(capa and capa > 0) - + amount = math.floor((amount or 0) + 0.5) nvm.liquid = nvm.liquid or {} - amount = amount or 0 + if not nvm.liquid.name then nvm.liquid.name = name nvm.liquid.amount = amount @@ -210,10 +210,9 @@ function networks.liquid.srv_put(nvm, name, amount, capa) end function networks.liquid.srv_take(nvm, name, amount) - assert(amount and amount >= 0) - + amount = math.floor((amount or 0) + 0.5) nvm.liquid = nvm.liquid or {} - amount = amount or 0 + if not name or nvm.liquid.name == name then name = nvm.liquid.name nvm.liquid.amount = nvm.liquid.amount or 0 diff --git a/signs_bot/README.md b/signs_bot/README.md index 05f711e..377bfd1 100644 --- a/signs_bot/README.md +++ b/signs_bot/README.md @@ -184,4 +184,6 @@ optional: farming redo, node_io, doc, techage, minecart, xdecor, compost - 2021-05-04 v1.08 * Add print command, improve error msg - 2021-08-22 v1.09 * Add soup commands and signs, add aspen sign - 2021-09-18 v1.10 * Add techage command 'set ' to the Bot Control Unit +- 2022-03-19 V1.11 * Extend farming (and add ethereal) support (Thanks to nixnoxus) + diff --git a/signs_bot/basis.lua b/signs_bot/basis.lua index ef5e1c3..aacd1dc 100644 --- a/signs_bot/basis.lua +++ b/signs_bot/basis.lua @@ -417,6 +417,10 @@ minetest.register_node("signs_bot:box", { end, after_place_node = function(pos, placer, itemstack) + if not placer or not placer:is_player() then + minetest.remove_node(pos) + minetest.add_item(pos, itemstack) + end local mem = tubelib2.init_mem(pos) mem.running = false mem.error = false diff --git a/signs_bot/cmd_farming.lua b/signs_bot/cmd_farming.lua index 905be0e..83519f6 100644 --- a/signs_bot/cmd_farming.lua +++ b/signs_bot/cmd_farming.lua @@ -19,9 +19,9 @@ local lib = signs_bot.lib local bot_inv_put_item = signs_bot.bot_inv_put_item local bot_inv_take_item = signs_bot.bot_inv_take_item -local function soil_availabe(pos) +local function soil_availabe(pos, trellis) local node = minetest.get_node_or_nil(pos) - if node.name == "air" then + if node.name == (trellis or "air") then node = minetest.get_node_or_nil({x=pos.x, y=pos.y-1, z=pos.z}) if node and minetest.get_item_group(node.name, "soil") >= 1 then return true @@ -33,13 +33,13 @@ end local function planting(base_pos, mem, slot) local pos = mem.pos_tbl and mem.pos_tbl[mem.steps] mem.steps = (mem.steps or 1) + 1 - if pos and lib.not_protected(base_pos, pos) and soil_availabe(pos) then + if pos and lib.not_protected(base_pos, pos) then local stack = bot_inv_take_item(base_pos, slot, 1) if stack and stack ~= "" then local plant = stack:get_name() if plant then local item = signs_bot.FarmingSeed[plant] - if item then + if item and soil_availabe(pos, signs_bot.FarmingNeedTrellis[item]) then if minetest.registered_nodes[item] then local p2 = minetest.registered_nodes[item].place_param2 or 1 minetest.set_node(pos, {name = item, param2 = p2}) @@ -87,13 +87,20 @@ local function harvesting(base_pos, mem) if pos and lib.not_protected(base_pos, pos) then local node = minetest.get_node_or_nil(pos) if signs_bot.FarmingCrop[node.name] then - minetest.remove_node(pos) + local trellis = signs_bot.FarmingKeepTrellis[node.name] + if trellis then + minetest.set_node(pos, {name = trellis}) + elseif not trellis then + minetest.remove_node(pos) + end -- Do not cache the result of get_node_drops; it is a probabilistic function! local drops = minetest.get_node_drops(node.name) for _,itemstring in ipairs(drops) do - local leftover = bot_inv_put_item(base_pos, 0, ItemStack(itemstring)) - if leftover and leftover:get_count() > 0 then - signs_bot.lib.drop_items(mem.robot_pos, leftover) + if not trellis or trellis ~= itemstring then + local leftover = bot_inv_put_item(base_pos, 0, ItemStack(itemstring)) + if leftover and leftover:get_count() > 0 then + signs_bot.lib.drop_items(mem.robot_pos, leftover) + end end end end diff --git a/signs_bot/mod.conf b/signs_bot/mod.conf index 7e84aab..d649484 100644 --- a/signs_bot/mod.conf +++ b/signs_bot/mod.conf @@ -1,4 +1,4 @@ name=signs_bot depends = default,farming,basic_materials,tubelib2 -optional_depends = node_io,techage,doc,minecart,bucket,fire,xdecor +optional_depends = node_io,techage,doc,minecart,bucket,fire,xdecor,ethereal description = A robot controlled by signs diff --git a/signs_bot/nodes.lua b/signs_bot/nodes.lua index e46837d..46cd452 100644 --- a/signs_bot/nodes.lua +++ b/signs_bot/nodes.lua @@ -14,14 +14,20 @@ signs_bot.FarmingSeed = {} signs_bot.FarmingCrop = {} +signs_bot.FarmingNeedTrellis = {} +signs_bot.FarmingKeepTrellis = {} signs_bot.TreeSaplings = {} -- inv_seed is the seed inventory name -- plantlet is what has to be placed on the ground (stage 1) -- crop is the farming crop in the final stage -function signs_bot.register_farming_plant(inv_seed, plantlet, crop) +function signs_bot.register_farming_plant(inv_seed, plantlet, crop, trellis) signs_bot.FarmingCrop[crop] = true signs_bot.FarmingSeed[inv_seed] = plantlet + if trellis then + signs_bot.FarmingNeedTrellis[plantlet] = trellis + signs_bot.FarmingKeepTrellis[crop] = trellis + end end -- inv_sapling is the sapling inventory name @@ -44,42 +50,27 @@ end -- Farming Redo ------------------------------------------------------------------------------- if farming.mod == "redo" then - fp("farming:seed_wheat", "farming:wheat_1", "farming:wheat_8") - fp("farming:seed_cotton", "farming:cotton_1", "farming:cotton_8") - fp("farming:carrot", "farming:carrot_1", "farming:carrot_8") - fp("farming:potato", "farming:potato_1", "farming:potato_4") - fp("farming:tomato", "farming:tomato_1", "farming:tomato_8") - fp("farming:cucumber", "farming:cucumber_1", "farming:cucumber_4") - fp("farming:corn", "farming:corn_1", "farming:corn_8") - fp("farming:coffee_beans", "farming:coffee_1", "farming:coffee_5") - fp("farming:melon_slice", "farming:melon_1", "farming:melon_8") - fp("farming:pumpkin_slice", "farming:pumpkin_1", "farming:pumpkin_8") - fp("farming:raspberries", "farming:raspberry_1", "farming:raspberry_4") - fp("farming:blueberries", "farming:blueberry_1", "farming:blueberry_4") - fp("farming:rhubarb", "farming:rhubarb_1", "farming:rhubarb_3") - fp("farming:beans", "farming:beanpole_1", "farming:beanpole_5") - fp("farming:grapes", "farming:grapes_1", "farming:grapes_8") - fp("farming:seed_barley", "farming:barley_1", "farming:barley_7") - fp("farming:chili_pepper", "farming:chili_1", "farming:chili_8") - fp("farming:seed_hemp", "farming:hemp_1", "farming:hemp_8") - fp("farming:seed_oat", "farming:oat_1", "farming:oat_8") - fp("farming:seed_rye", "farming:rye_1", "farming:rye_8") - fp("farming:seed_rice", "farming:rice_1", "farming:rice_8") - fp("farming:beetroot", "farming:beetroot_1", "farming:beetroot_5") - fp("farming:cocoa_beans", "farming:cocoa_1", "farming:cocoa_4") - fp("farming:garlic_clove", "farming:garlic_1", "farming:garlic_5") - fp("farming:onion", "farming:onion_1", "farming:onion_5") - fp("farming:pea_pod", "farming:pea_1", "farming:pea_5") - fp("farming:peppercorn", "farming:pepper_1", "farming:pepper_5") - fp("farming:pineapple_top", "farming:pineapple_1", "farming:pineapple_8") + local fp_grows = function(def, step) + local crop = def.crop .. "_" .. step + local node = minetest.registered_nodes[crop] + if node then + fp(def.seed, def.crop .. "_1", crop, def.trellis) + return node.groups and node.groups.growing + end + end + + for name, def in pairs(farming.registered_plants) do + -- everything except cocoa (these can only be placed on jungletree) + if name ~= "farming:cocoa_beans" then + local step = def.steps + while fp_grows(def, step) do step = step + 1 end + end + end end ------------------------------------------------------------------------------- -- Ethereal Farming ------------------------------------------------------------------------------- ---fn("ethereal:strawberry_8", "ethereal:strawberry 2", "ethereal:strawberry 1") ---fn("ethereal:onion_5", "ethereal:wild_onion_plant 2", "ethereal:onion_1") - --fn("ethereal:willow_trunk", "ethereal:willow_trunk", "ethereal:willow_sapling") --fn("ethereal:redwood_trunk", "ethereal:redwood_trunk", "ethereal:redwood_sapling") diff --git a/signs_bot/robot.lua b/signs_bot/robot.lua index b305606..55e501a 100644 --- a/signs_bot/robot.lua +++ b/signs_bot/robot.lua @@ -121,3 +121,22 @@ minetest.register_node("signs_bot:robot_foot", { }, sounds = default.node_sound_metal_defaults(), }) + +minetest.register_lbm({ + label = "[signs_bot] Remove lost robots", + name = "signs_bot:lost_robot_remove", + nodenames = {"signs_bot:robot"}, + run_at_every_load = true, + action = function(pos, node) + local found = false + tubelib2.walk_over_all(function(npos, node, mem) + if node.name == "signs_bot:box" and mem.robot_pos and + vector.equals(pos, mem.robot_pos) then + found = true + end + end, "robot_pos") + if not found then + signs_bot.remove_robot({robot_pos = pos}) + end + end +}) diff --git a/ta4_jetpack/init.lua b/ta4_jetpack/init.lua index 53eb16b..ca977dc 100644 --- a/ta4_jetpack/init.lua +++ b/ta4_jetpack/init.lua @@ -14,6 +14,7 @@ local S = minetest.get_translator("ta4_jetpack") local liquid = networks.liquid +local LQD = function(pos) return (minetest.registered_nodes[tubelib2.get_node_lvm(pos).name] or {}).liquid end local ta4_jetpack = {} @@ -333,12 +334,12 @@ local function load_fuel(itemstack, user, pointed_thing) local value = get_fuel_value(name) local newvalue - if user:get_player_control().sneak then -- back to tank? - local amount = math.min(value, FUEL_UNIT) - local rest = liquid.srv_put(nvm, "techage:hydrogen", amount, MAX_FUEL) - newvalue = value - amount + rest + if user:get_player_control().sneak then -- back to tank? + local amount = math.max(math.min(value, FUEL_UNIT), 0) + local rest = liquid.srv_put(nvm, "techage:hydrogen", amount, LQD(pos).capa) + newvalue = value - (amount - rest) else - local amount = math.min(FUEL_UNIT, MAX_FUEL - value) + local amount = math.max(math.min(FUEL_UNIT, MAX_FUEL - value), 0) local taken = liquid.srv_take(nvm, "techage:hydrogen", amount) newvalue = value + taken end @@ -552,4 +553,4 @@ ta4_jetpack.register_forbidden_item("techage:cylinder_large_hydrogen") ta4_jetpack.register_forbidden_item("techage:cylinder_small_hydrogen") ta4_jetpack.register_forbidden_item("techage:hydrogen") ta4_jetpack.register_forbidden_item("digtron:loaded_crate") -ta4_jetpack.register_forbidden_item("digtron:loaded_locked_crate") \ No newline at end of file +ta4_jetpack.register_forbidden_item("digtron:loaded_locked_crate") diff --git a/techage/README.md b/techage/README.md index 42ee4f0..8fbab06 100644 --- a/techage/README.md +++ b/techage/README.md @@ -2,12 +2,9 @@ Tech Age, a mod to go through 5 tech ages in search of wealth and power. -**Tech Age (techage) is the successor to TechPack V2, at first glance similar and yet completely different!** - ![screenshot](https://github.com/joe7575/techage/blob/master/screenshot.png) - Important facts: - techage is not backwards compatible and cannot be installed on a server together with TechPack - techage is significantly more extensive, since additional mods are integrated @@ -22,6 +19,10 @@ Important facts: In contrast to TechPack, the resources are more limited and it is much more difficult to pass all levels. (no endless ore generation by means of cobble generators) +**Techage blocks store information outside of the block. This is for performance reasons. +If you move, place, or remove blocks with any tool, at best, only the information is lost. +In the worst case, the server crashes.** + [Manuals](https://github.com/joe7575/techage/wiki) @@ -75,11 +76,14 @@ For the installation of 'luarocks' (if not already available), see [luarocks](ht Available worlds will be converted to 'lsqlite3', but there is no way back, so: -** Never disable 'lsqlite3' for a world that has already been used!** +**Never disable 'lsqlite3' for a world that has already been used!** ### History +**2022-06-06 V1.08** +- Native support for the mod Beduino added + **2022-01-22 V1.07** - TA5 fusion reactor added diff --git a/techage/basic_machines/chest.lua b/techage/basic_machines/chest.lua index b07f824..ed7b58d 100644 --- a/techage/basic_machines/chest.lua +++ b/techage/basic_machines/chest.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -180,6 +180,15 @@ techage.register_node({"techage:chest_ta2", "techage:chest_ta3"}, { return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 131 then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return 0, {techage.get_inv_state_num(inv, "main")} + else + return 2, "" + end + end, }) @@ -412,6 +421,15 @@ techage.register_node({"techage:chest_ta4"}, { return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 131 then + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return 0, {techage.get_inv_state_num(inv, "main")} + else + return 2, "" + end + end, }) minetest.register_craft({ diff --git a/techage/basic_machines/concentrator.lua b/techage/basic_machines/concentrator.lua index cba0f58..b2a4d67 100644 --- a/techage/basic_machines/concentrator.lua +++ b/techage/basic_machines/concentrator.lua @@ -65,6 +65,10 @@ local names = networks.register_junction("techage:concentrator", 2/8, Boxes, Tub end, }, 27) +for _, name in ipairs(names) do + Tube:set_valid_sides(name, {"B", "R", "F", "L", "D", "U"}) +end + techage.register_node(names, { on_push_item = function(pos, in_dir, stack) local push_dir = M(pos):get_int("push_dir") @@ -110,6 +114,10 @@ names = networks.register_junction("techage:ta4_concentrator", 2/8, Boxes, Tube, end, }, 27) +for _, name in ipairs(names) do + Tube:set_valid_sides(name, {"B", "R", "F", "L", "D", "U"}) +end + techage.register_node(names, { on_push_item = function(pos, in_dir, stack) local push_dir = M(pos):get_int("push_dir") diff --git a/techage/basic_machines/distributor.lua b/techage/basic_machines/distributor.lua index 6df2639..66dd51c 100644 --- a/techage/basic_machines/distributor.lua +++ b/techage/basic_machines/distributor.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -34,6 +34,7 @@ local INFO = [[Turn port on/off or read its state: command = 'port', payload = r --local Side2Color = {B="red", L="green", F="blue", R="yellow"} local SlotColors = {"red", "green", "blue", "yellow"} +local SlotNumbers = {red = 1, green = 2, blue = 3, yellow = 4} local Num2Ascii = {"B", "L", "F", "R"} local FilterCache = {} -- local cache for filter settings @@ -383,16 +384,16 @@ end -- techage command to turn on/off filter channels local function change_filter_settings(pos, slot, val) - local slots = {["red"] = 1, ["green"] = 2, ["blue"] = 3, ["yellow"] = 4} local meta = M(pos) local filter = minetest.deserialize(meta:get_string("filter")) or {false,false,false,false} - local num = slots[slot] or 1 + local num = SlotNumbers[slot] or 1 if num >= 1 and num <= 4 then filter[num] = val == "on" end meta:set_string("filter", minetest.serialize(filter)) - filter_settings(pos) + local hash = minetest.hash_node_position(pos) + FilterCache[hash] = nil local nvm = techage.get_nvm(pos) meta:set_string("formspec", formspec(CRD(pos).State, pos, nvm)) @@ -401,9 +402,45 @@ end -- techage command to read filter channel status (on/off) local function read_filter_settings(pos, slot) - local slots = {["red"] = 1, ["green"] = 2, ["blue"] = 3, ["yellow"] = 4} local filter = minetest.deserialize(M(pos):get_string("filter")) or {false,false,false,false} - return filter[slots[slot]] and "on" or "off" + return filter[SlotNumbers[slot]] and "on" or "off" +end + +local function get_payload_values(payload) + local color + local idx = 0 + local items = {ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack(""), ItemStack("")} + for s in payload:gmatch("[^%s]+") do --- white spaces + if not color then + if SlotNumbers[s] then + color = s + else + return "red", {} + end + else + idx = idx + 1 + if idx <= 6 then + items[idx] = ItemStack(s) + end + end + end + return color, items +end + +local function str_of_inv_items(pos, color) + color = SlotColors[color] or color + if SlotNumbers[color] then + local inv = M(pos):get_inventory() + local t = {} + for idx = 1, 6 do + local item = inv:get_stack(color, idx) + if item:get_count() > 0 then + t[#t + 1] = item:get_name() + end + end + return table.concat(t, " ") + end + return "" end local function can_dig(pos, player) @@ -474,10 +511,47 @@ local tubing = { else return change_filter_settings(pos, slot, val) end + elseif topic == "config" then + local color, items = get_payload_values(payload) + local inv = M(pos):get_inventory() + for idx,item in ipairs(items) do + inv:set_stack(color, idx, item) + end + local hash = minetest.hash_node_position(pos) + FilterCache[hash] = nil + return true + elseif topic == "get" then + return str_of_inv_items(pos, payload) else return CRD(pos).State:on_receive_message(pos, topic, payload) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 4 then + local slot = SlotColors[payload[1]] + local state = payload[2] == 1 and "on" or "off" + change_filter_settings(pos, slot, state) + return 0 + elseif topic == 67 then + local color, items = get_payload_values(payload) + local inv = M(pos):get_inventory() + for idx,item in ipairs(items) do + inv:set_stack(color, idx, item) + end + local hash = minetest.hash_node_position(pos) + FilterCache[hash] = nil + return 0 + else + return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 148 then + return 0, str_of_inv_items(pos, payload[1]) + else + return CRD(pos).State:on_beduino_request_data(pos, topic, payload) + end + end, on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, diff --git a/techage/basic_machines/electronic_fab.lua b/techage/basic_machines/electronic_fab.lua index 6487412..e6a2640 100644 --- a/techage/basic_machines/electronic_fab.lua +++ b/techage/basic_machines/electronic_fab.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -74,8 +74,9 @@ local function allow_metadata_inventory_take(pos, listname, index, stack, player end local function making(pos, crd, nvm, inv) + local owner = M(pos):get_string("owner") local rtype = RecipeType[crd.stage] - local recipe = recipes.get(nvm, rtype) + local recipe = recipes.get(nvm, rtype, owner) local output = ItemStack(recipe.output.name.." "..recipe.output.num) if inv:room_for_item("dst", output) then for _,item in ipairs(recipe.input) do @@ -202,6 +203,12 @@ local tubing = { on_recv_message = function(pos, src, topic, payload) return CRD(pos).State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_request_data(pos, topic, payload) + end, on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, diff --git a/techage/basic_machines/forceload.lua b/techage/basic_machines/forceload.lua index 121d8ab..adecd64 100644 --- a/techage/basic_machines/forceload.lua +++ b/techage/basic_machines/forceload.lua @@ -91,13 +91,13 @@ local function set_pos_list(player, lPos) meta:set_string("techage_forceload_blocks", minetest.serialize(lPos)) end -local function shoe_flbs(pos, name, range) +local function show_flbs(pos, name, range) local pos1 = {x=pos.x-range, y=pos.y-range, z=pos.z-range} local pos2 = {x=pos.x+range, y=pos.y+range, z=pos.z+range} for _,npos in ipairs(minetest.find_nodes_in_area(pos1, pos2, {"techage:forceload", "techage:forceloadtile"})) do local _pos1, _pos2 = calc_area(npos) local owner = M(npos):get_string("owner") - techage.mark_region(name, _pos1, _pos2, owner) + techage.mark_region(name, _pos1, _pos2, owner .. " " .. P2S(npos)) end end @@ -204,6 +204,7 @@ minetest.register_node("techage:forceload", { paramtype = "light", sunlight_propagates = true, + use_texture_alpha = techage.CLIP, groups = {choppy=2, cracky=2, crumbly=2, digtron_protected = 1, not_in_creative_inventory = techage.max_num_forceload_blocks == 0 and 1 or 0}, @@ -292,15 +293,11 @@ minetest.register_chatcommand("forceload", { params = "", description = S("Show all forceload blocks in a 64x64x64 range"), func = function(name, param) - if minetest.check_player_privs(name, "superminer") then - local player = minetest.get_player_by_name(name) - if player then - local pos = player:get_pos() - pos = vector.round(pos) - shoe_flbs(pos, name, 64) - end - else - return false, S("Priv missing") + local player = minetest.get_player_by_name(name) + if player then + local pos = player:get_pos() + pos = vector.round(pos) + show_flbs(pos, name, 64) end end, }) diff --git a/techage/basic_machines/gravelrinser.lua b/techage/basic_machines/gravelrinser.lua index cff4611..43ef7b9 100644 --- a/techage/basic_machines/gravelrinser.lua +++ b/techage/basic_machines/gravelrinser.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -249,6 +249,12 @@ local tubing = { on_recv_message = function(pos, src, topic, payload) return CRD(pos).State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_request_data(pos, topic, payload) + end, on_node_load = function(pos) remove_objects({x=pos.x, y=pos.y+1, z=pos.z}) CRD(pos).State:on_node_load(pos) diff --git a/techage/basic_machines/gravelsieve.lua b/techage/basic_machines/gravelsieve.lua index 0d61593..f12c581 100644 --- a/techage/basic_machines/gravelsieve.lua +++ b/techage/basic_machines/gravelsieve.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -174,6 +174,12 @@ local tubing = { on_recv_message = function(pos, src, topic, payload) return CRD(pos).State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_request_data(pos, topic, payload) + end, on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, diff --git a/techage/basic_machines/grinder.lua b/techage/basic_machines/grinder.lua index 48a9efc..97a8340 100644 --- a/techage/basic_machines/grinder.lua +++ b/techage/basic_machines/grinder.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -56,7 +56,10 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) return 0 end if listname == "src" then - CRD(pos).State:start_if_standby(pos) + local state = CRD(pos).State + if state then + state:start_if_standby(pos) + end end return stack:get_count() end @@ -206,6 +209,12 @@ local tubing = { on_recv_message = function(pos, src, topic, payload) return CRD(pos).State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_request_data(pos, topic, payload) + end, on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, diff --git a/techage/basic_machines/liquidsampler.lua b/techage/basic_machines/liquidsampler.lua index 0a4ca84..4467a18 100644 --- a/techage/basic_machines/liquidsampler.lua +++ b/techage/basic_machines/liquidsampler.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -173,6 +173,12 @@ local tubing = { on_recv_message = function(pos, src, topic, payload) return CRD(pos).State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_request_data(pos, topic, payload) + end, } local node_name_ta2, node_name_ta3, _ = diff --git a/techage/basic_machines/pusher.lua b/techage/basic_machines/pusher.lua index fd03895..f9ff656 100644 --- a/techage/basic_machines/pusher.lua +++ b/techage/basic_machines/pusher.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -181,13 +181,21 @@ local function can_start(pos, nvm, state) end local function config_item(pos, payload) - local name, count = unpack(payload:split(" ")) - if name and (minetest.registered_nodes[name] or minetest.registered_items[name] - or minetest.registered_craftitems[name]) then - count = tonumber(count) or 1 - local inv = M(pos):get_inventory() - inv:set_stack("main", 1, {name = name, count = 1}) - return count + if type(payload) == "string" then + if payload == "" then + local inv = M(pos):get_inventory() + inv:set_stack("main", 1, nil) + return 0 + else + local name, count = unpack(payload:split(" ")) + if name and (minetest.registered_nodes[name] or minetest.registered_items[name] + or minetest.registered_craftitems[name]) then + count = tonumber(count) or 1 + local inv = M(pos):get_inventory() + inv:set_stack("main", 1, {name = name, count = 1}) + return count + end + end end return 0 end @@ -256,6 +264,24 @@ local tubing = { return CRD(pos).State:on_receive_message(pos, topic, payload) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 64 then -- Start pusher + local nvm = techage.get_nvm(pos) + CRD(pos).State:stop(pos, nvm) + nvm.item_count = math.min(config_item(pos, payload), 12) + nvm.rmt_num = src + CRD(pos).State:start(pos, nvm) + return 0 + elseif topic == 65 then -- Config Pusher + local nvm = techage.get_nvm(pos) + CRD(pos).State:stop(pos, nvm) + config_item(pos, payload) + CRD(pos).State:start(pos, nvm) + return 0 + else + return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) + end + end, } local node_name_ta2, node_name_ta3, node_name_ta4 = diff --git a/techage/basic_machines/quarry.lua b/techage/basic_machines/quarry.lua index 90aaf87..33be5ec 100644 --- a/techage/basic_machines/quarry.lua +++ b/techage/basic_machines/quarry.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -368,6 +368,17 @@ local tubing = { return CRD(pos).State:on_receive_message(pos, topic, payload) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 133 then -- Quarry Depth + local nvm = techage.get_nvm(pos) + return 0, {nvm.level or 0} + else + return CRD(pos).State:on_beduino_request_data(pos, topic, payload) + end + end, on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, diff --git a/techage/basic_machines/recycler.lua b/techage/basic_machines/recycler.lua index e2442a2..5e82e49 100644 --- a/techage/basic_machines/recycler.lua +++ b/techage/basic_machines/recycler.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -45,7 +45,7 @@ local SpecialItems = { ["dye:black"] = "", ["techage:basalt_glass_thin"] = "", ["group:stone"] = "techage:sieved_gravel", - ["basic_materials:plastic_sheet"] = "", + --["basic_materials:plastic_sheet"] = "", ["group:wood"] = "default:stick 5", ["techage:basalt_glass"] = "", ["default:junglewood"] = "default:stick 5", @@ -235,6 +235,12 @@ local tubing = { on_recv_message = function(pos, src, topic, payload) return CRD(pos).State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_request_data(pos, topic, payload) + end, on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, diff --git a/techage/basic_machines/ta4_chest.lua b/techage/basic_machines/ta4_chest.lua index 096eaef..49bdb83 100644 --- a/techage/basic_machines/ta4_chest.lua +++ b/techage/basic_machines/ta4_chest.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -92,6 +92,18 @@ local function inv_state(nvm) return "loaded" end +local function inv_state_num(nvm) + local num = 0 + for _,item in ipairs(nvm.inventory or {}) do + if item.count and item.count > 0 then + num = num + 1 + end + end + if num == 0 then return 0 end + if num == 8 then return 2 end + return 1 +end + local function max_stacksize(item_name) -- It is sufficient to use minetest.registered_items as all registration -- functions (node, craftitems, tools) add the definitions there. @@ -324,12 +336,17 @@ 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 param2 = node.param2 local cnt = 1 while cnt < 50 do node = techage.get_node_lvm(pos1) if node.name ~= "techage:ta4_chest_dummy" then break end + local meta = M(pos1) + if meta:contains("param2") and meta:get_int("param2") ~= param2 then + break + end pos1 = tubelib2.get_pos(pos1, dir) cnt = cnt + 1 end @@ -339,12 +356,17 @@ 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 param2 = node.param2 local cnt = 1 while cnt < 50 do node = techage.get_node_lvm(pos1) if node.name ~= "techage:ta4_chest_dummy" then break end + local meta = M(pos1) + if meta:contains("param2") and meta:get_int("param2") ~= param2 then + break + end pos1 = tubelib2.get_pos(pos1, dir) cnt = cnt + 1 end @@ -517,6 +539,7 @@ minetest.register_node("techage:ta4_chest", { if search_chest_in_front(pos, node) then node.name = "techage:ta4_chest_dummy" minetest.swap_node(pos, node) + M(pos):set_int("param2", node.param2) else local nvm = techage.get_nvm(pos) gen_inv(nvm) @@ -597,10 +620,10 @@ techage.register_node({"techage:ta4_chest"}, { on_recv_message = function(pos, src, topic, payload) if topic == "count" then local nvm = techage.get_nvm(pos) - return get_count(nvm, tonumber(payload) or 0) + return get_count(nvm, tonumber(payload or 1) or 1) elseif topic == "itemstring" then local nvm = techage.get_nvm(pos) - return get_itemstring(nvm, tonumber(payload) or 0) + return get_itemstring(nvm, tonumber(payload or 1) or 1) elseif topic == "state" then local nvm = techage.get_nvm(pos) return inv_state(nvm) @@ -608,6 +631,20 @@ techage.register_node({"techage:ta4_chest"}, { return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 140 and payload[1] == 1 then -- Inventory Item Count + local nvm = techage.get_nvm(pos) + return 0, {get_count(nvm, tonumber(payload[2] or 1) or 1)} + elseif topic == 140 and payload[1] == 2 then -- Inventory Item Name + local nvm = techage.get_nvm(pos) + return 0, get_itemstring(nvm, tonumber(payload[2] or 1) or 1) + elseif topic == 131 then -- Chest State + local nvm = techage.get_nvm(pos) + return 0, {inv_state_num(nvm)} + else + return 2, "" + end + end, }) techage.register_node({"techage:ta4_chest_dummy"}, { diff --git a/techage/basic_machines/ta4_injector.lua b/techage/basic_machines/ta4_injector.lua index 4332e17..e08bfd0 100644 --- a/techage/basic_machines/ta4_injector.lua +++ b/techage/basic_machines/ta4_injector.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -242,6 +242,12 @@ local tubing = { on_recv_message = function(pos, src, topic, payload) return CRD(pos).State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_request_data(pos, topic, payload) + end, on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, diff --git a/techage/basic_machines/ta5_chest.lua b/techage/basic_machines/ta5_chest.lua index 1d56064..d99b051 100644 --- a/techage/basic_machines/ta5_chest.lua +++ b/techage/basic_machines/ta5_chest.lua @@ -175,6 +175,15 @@ techage.register_node({"techage:ta5_hl_chest"}, { return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 131 then -- Chest State + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return 0, {techage.get_inv_state_num(inv, "main")} + else + return 2, "" + end + end, }) diff --git a/techage/basis/assemble.lua b/techage/basis/assemble.lua index c4d81d9..8763d2d 100644 --- a/techage/basis/assemble.lua +++ b/techage/basis/assemble.lua @@ -173,13 +173,14 @@ local function remove_inv(pos, inv, param2, AssemblyPlan, player_name, idx) if inv:room_for_item("src", stack) then local node = minetest.get_node(pos1) if node.name == node_name then + local meta = M(pos1):to_table() minetest.remove_node(pos1) inv:add_item("src", stack) play_sound(pos, "default_dig_cracky") local ndef = minetest.registered_nodes[node_name] if ndef and ndef.after_dig_node then local digger = minetest.get_player_by_name(player_name) - ndef.after_dig_node(pos1, pos, ItemStack(node_name), {}, digger) + ndef.after_dig_node(pos1, node, meta, digger) end end end diff --git a/techage/basis/command.lua b/techage/basis/command.lua index f2b4362..e17400e 100644 --- a/techage/basis/command.lua +++ b/techage/basis/command.lua @@ -406,6 +406,33 @@ function techage.transfer(pos, outdir, topic, payload, network, nodenames) return false end +------------------------------------------------------------------- +-- Beduino functions (see "bep-005_ta_cmnd.md") +------------------------------------------------------------------- +function techage.beduino_send_cmnd(src, number, topic, payload) + --print("beduino_send_cmnd", src, number, topic) + local ninfo = NodeInfoCache[number] or update_nodeinfo(number) + if ninfo and ninfo.name and ninfo.pos then + local ndef = NodeDef[ninfo.name] + if ndef and ndef.on_beduino_receive_cmnd then + return ndef.on_beduino_receive_cmnd(ninfo.pos, src, topic, payload or {}) + end + end + return 1, "" +end + +function techage.beduino_request_data(src, number, topic, payload) + --print("beduino_request_data", src, number, topic) + local ninfo = NodeInfoCache[number] or update_nodeinfo(number) + if ninfo and ninfo.name and ninfo.pos then + local ndef = NodeDef[ninfo.name] + if ndef and ndef.on_beduino_request_data then + return ndef.on_beduino_request_data(ninfo.pos, src, topic, payload or {}) + end + end + return 1, "" +end + ------------------------------------------------------------------- -- Client side Push/Pull item functions ------------------------------------------------------------------- @@ -564,6 +591,23 @@ function techage.get_inv_state(inv, listname) return state end +-- Beduino variant +function techage.get_inv_state_num(inv, listname) + local state + if inv:is_empty(listname) then + state = 0 + else + local list = inv:get_list(listname) + state = 2 + for _, item in ipairs(list) do + if item:is_empty() then + return 1 + end + end + end + return state +end + minetest.register_chatcommand("ta_send", { description = minetest.formspec_escape( "Send a techage command to the block with the number given: /ta_send []"), diff --git a/techage/basis/fly_lib.lua b/techage/basis/fly_lib.lua index 4ae48b2..be1a137 100644 --- a/techage/basis/fly_lib.lua +++ b/techage/basis/fly_lib.lua @@ -134,13 +134,39 @@ local function dest_offset(lpath) return offs end +------------------------------------------------------------------------------- +-- Protect the doors from being opened by hand +------------------------------------------------------------------------------- +local function new_on_rightclick(old_on_rightclick) + return function(pos, node, clicker, itemstack, pointed_thing) + if M(pos):contains("ta_door_locked") then + return itemstack + end + if old_on_rightclick then + return old_on_rightclick(pos, node, clicker, itemstack, pointed_thing) + else + return itemstack + end + end +end + +function flylib.protect_door_from_being_opened(name) + -- Change on_rightclick function. + local ndef = minetest.registered_nodes[name] + if ndef then + local old_on_rightclick = ndef.on_rightclick + minetest.override_item(ndef.name, { + on_rightclick = new_on_rightclick(old_on_rightclick) + }) + end +end + ------------------------------------------------------------------------------- -- Entity / Move / Attach / Detach ------------------------------------------------------------------------------- local MIN_SPEED = 0.4 local MAX_SPEED = 8 local CORNER_SPEED = 4 -local SimpleNodes = techage.logic.SimpleNodes local function calc_speed(v) return math.sqrt(v.x * v.x + v.y * v.y + v.z * v.z) @@ -292,8 +318,7 @@ local function entity_to_node(pos, obj) local nvm = techage.get_nvm(self.base_pos) nvm.running = nil end - obj:remove() - + minetest.after(0.1, obj.remove, obj) local node = minetest.get_node(pos) local ndef1 = minetest.registered_nodes[name] local ndef2 = minetest.registered_nodes[node.name] @@ -303,6 +328,7 @@ local function entity_to_node(pos, obj) minetest.set_node(pos, {name=name, param2=param2}) meta:from_table(metadata) meta:set_string("ta_move_block", "") + meta:set_int("ta_door_locked", 1) return end local meta = M(pos) @@ -326,11 +352,14 @@ local function node_to_entity(start_pos) node = minetest.deserialize(meta:get_string("ta_move_block")) metadata = {} meta:set_string("ta_move_block", "") - else + meta:set_string("ta_block_locked", "true") + elseif not meta:contains("ta_block_locked") then -- Block with other metadata node = minetest.get_node(start_pos) metadata = meta:to_table() - minetest.remove_node(start_pos) + minetest.after(0.1, minetest.remove_node, start_pos) + else + return end local obj = minetest.add_entity(start_pos, "techage:move_item") if obj then @@ -388,36 +417,38 @@ end -- Handover the entity to the next movecontroller local function handover_to(obj, self, pos1) - local info = techage.get_node_info(self.handover) - if info and info.name == "techage:ta4_movecontroller" then - local meta = M(info.pos) - if self.move2to1 then - self.handover = meta:contains("handoverA") and meta:get_string("handoverA") - else - self.handover = meta:contains("handoverB") and meta:get_string("handoverB") - end - - self.lpath = flylib.to_path(meta:get_string("path")) - if pos1 and self.lpath then - self.path_idx = 2 + if self.handover then + local info = techage.get_node_info(self.handover) + if info and info.name == "techage:ta4_movecontroller" then + local meta = M(info.pos) if self.move2to1 then - self.lpath[1] = vector.multiply(self.lpath[1], - 1) + self.handover = meta:contains("handoverA") and meta:get_string("handoverA") or nil + else + self.handover = meta:contains("handoverB") and meta:get_string("handoverB") or nil end - local pos2 = next_path_pos(pos1, self.lpath, 1) - local dir = determine_dir(pos1, pos2) - --print("handover_to", P2S(pos1), P2S(pos2), P2S(dir), P2S(info.pos), meta:get_string("path")) - if not self.handover then - local nvm = techage.get_nvm(info.pos) - nvm.lpos1 = nvm.lpos1 or {} - if self.move2to1 then - nvm.lpos1[self.pos1_idx] = pos2 - else - nvm.lpos1[self.pos1_idx] = pos1 + self.lpath = flylib.to_path(meta:get_string("path")) + if pos1 and self.lpath then + self.path_idx = 2 + if self.move2to1 then + self.lpath[1] = vector.multiply(self.lpath[1], - 1) end + local pos2 = next_path_pos(pos1, self.lpath, 1) + local dir = determine_dir(pos1, pos2) + --print("handover_to", P2S(pos1), P2S(pos2), P2S(dir), P2S(info.pos), meta:get_string("path")) + if not self.handover then + local nvm = techage.get_nvm(info.pos) + nvm.lpos1 = nvm.lpos1 or {} + if self.move2to1 then + nvm.lpos1[self.pos1_idx] = pos2 + + else + nvm.lpos1[self.pos1_idx] = pos1 + end + end + move_entity(obj, pos2, dir) + return true end - move_entity(obj, pos2, dir) - return true end end end @@ -473,7 +504,7 @@ minetest.register_entity("techage:move_item", { self.object:set_properties({wield_item = self.item}) --print("tbl.respawn", tbl.respawn) if tbl.respawn then - entity_to_node(self.start_pos, self.object) + entity_to_node(self.dest_pos, self.object) end end end, @@ -552,8 +583,7 @@ minetest.register_entity("techage:move_item", { local function is_valid_dest(pos) local node = minetest.get_node(pos) - local ndef = minetest.registered_nodes[node.name] - if ndef and ndef.buildable_to then + if techage.is_air_like(node.name) then return true end if not M(pos):contains("ta_move_block") then @@ -563,20 +593,9 @@ local function is_valid_dest(pos) end local function is_simple_node(pos) - -- special handling - local name = minetest.get_node(pos).name - if SimpleNodes[name] ~= nil then - return SimpleNodes[name] - end - - local ndef = minetest.registered_nodes[name] - if not ndef or name == "air" or name == "ignore" then return false end - -- don't remove nodes with some intelligence or undiggable nodes - if ndef.drop == "" then return false end - if ndef.diggable == false then return false end - if ndef.after_dig_node then return false end - - return true + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + return not techage.is_air_like(node.name) and techage.can_dig_node(node.name, ndef) end local function move_node(pos, pos1_idx, start_pos, lpath, max_speed, height, move2to1, handover, cpos) @@ -649,6 +668,43 @@ local function move_nodes(pos, meta, nvm, lpath, max_speed, height, move2to1, ha return true end +-- Move nodes from lpos1 by the given x/y/z 'line' +local function move_nodes2(pos, meta, lpos1, line, max_speed, height) + --print("move_nodes2", dump(lpos1), dump(line), max_speed, height) + local owner = meta:get_string("owner") + techage.counting_add(owner, #lpos1) + + local lpos2 = {} + for idx = 1, #lpos1 do + + local pos1 = lpos1[idx] + local pos2 = vector.add(lpos1[idx], line) + lpos2[idx] = pos2 + + if not minetest.is_protected(pos1, owner) and not minetest.is_protected(pos2, owner) then + if is_simple_node(pos1) and is_valid_dest(pos2) then + move_node(pos, idx, pos1, {line}, max_speed, height, false, false) + else + if not is_simple_node(pos1) then + meta:set_string("status", S("No valid node at the start position")) + else + meta:set_string("status", S("No valid destination position")) + end + end + else + if minetest.is_protected(pos1, owner) then + meta:set_string("status", S("Start position is protected")) + else + meta:set_string("status", S("Destination position is protected")) + end + return false, lpos1 + end + end + + meta:set_string("status", "") + return true, lpos2 +end + function flylib.move_to_other_pos(pos, move2to1) local meta = M(pos) local nvm = techage.get_nvm(pos) @@ -671,13 +727,36 @@ function flylib.move_to_other_pos(pos, move2to1) nvm.lpos2 = lvect_add_vec(nvm.lpos1, offs) if move2to1 then - handover = meta:contains("handoverA") and meta:get_string("handoverA") + handover = meta:contains("handoverA") and meta:get_string("handoverA") or nil else - handover = meta:contains("handoverB") and meta:get_string("handoverB") + handover = meta:contains("handoverB") and meta:get_string("handoverB") or nil end return move_nodes(pos, meta, nvm, lpath, max_speed, height, move2to1, handover) end +function flylib.move_to(pos, line) + local meta = M(pos) + local nvm = techage.get_nvm(pos) + local height = techage.in_range(meta:contains("height") and meta:get_float("height") or 1, 0, 1) + local max_speed = meta:contains("max_speed") and meta:get_int("max_speed") or MAX_SPEED + local resp + + resp, nvm.lastpos = move_nodes2(pos, meta, nvm.lastpos or nvm.lpos1, line, max_speed, height) + return resp +end + +function flylib.reset_move(pos) + local meta = M(pos) + local nvm = techage.get_nvm(pos) + local height = techage.in_range(meta:contains("height") and meta:get_float("height") or 1, 0, 1) + local max_speed = meta:contains("max_speed") and meta:get_int("max_speed") or MAX_SPEED + local move = vector.subtract(nvm.lpos1[1], (nvm.lastpos or nvm.lpos1)[1]) + local resp + + resp, nvm.lastpos = move_nodes2(pos, meta, nvm.lastpos or nvm.lpos1, move, max_speed, height) + return resp +end + -- rot is one of "l", "r", "2l", "2r" -- cpos is the center pos (optional) function flylib.rotate_nodes(pos, posses1, rot) @@ -712,6 +791,39 @@ function flylib.rotate_nodes(pos, posses1, rot) return posses2 end +function flylib.exchange_node(pos, name, param2) + local meta = M(pos) + local move_block + + -- consider stored "objects" + if meta:contains("ta_move_block") then + move_block = meta:get_string("ta_move_block") + end + + minetest.swap_node(pos, {name = name, param2 = param2}) + + if move_block then + meta:set_string("ta_move_block", move_block) + end +end + +function flylib.remove_node(pos) + local meta = M(pos) + local move_block + + -- consider stored "objects" + if meta:contains("ta_move_block") then + move_block = meta:get_string("ta_move_block") + end + + minetest.remove_node(pos) + + if move_block then + local node = minetest.deserialize(move_block) + minetest.add_node(pos, node) + meta:set_string("ta_move_block", "") + end +end minetest.register_on_joinplayer(function(player) unlock_player(player) diff --git a/techage/basis/hyperloop.lua b/techage/basis/hyperloop.lua index a694e32..e89b972 100644 --- a/techage/basis/hyperloop.lua +++ b/techage/basis/hyperloop.lua @@ -57,16 +57,19 @@ local function get_remote_pos(pos, rmt_name) end local function get_free_server_list(pos, owner) - local tbl = {M(pos):get_string("remote_name")} - for key,item in pairs(Stations:get_node_table(pos)) do - if item.single and item.owner == owner then - if M(pos):get_string("node_type") == M(S2P(key)):get_string("node_type") then - tbl[#tbl+1] = item.conn_name + if Stations and Stations.get_node_table then + local tbl = {M(pos):get_string("remote_name")} + for key,item in pairs(Stations:get_node_table(pos) or {}) do + if item.single and item.owner == owner then + if M(pos):get_string("node_type") == M(S2P(key)):get_string("node_type") then + tbl[#tbl+1] = item.conn_name + end end end + tbl[#tbl+1] = "" + return tbl end - tbl[#tbl+1] = "" - return tbl + return {} end local function on_lose_connection(pos, node_type) @@ -78,8 +81,11 @@ local function on_lose_connection(pos, node_type) end local function on_dropdown(pos) - local owner = M(pos):get_string("owner") - return table.concat(get_free_server_list(pos, owner), ",") + if pos then + local owner = M(pos):get_string("owner") + return table.concat(get_free_server_list(pos, owner), ",") or "" + end + return "" end local function update_node_data(pos, state, conn_name, remote_name, rmt_pos) diff --git a/techage/basis/lib.lua b/techage/basis/lib.lua index d47f5ac..6311bc5 100644 --- a/techage/basis/lib.lua +++ b/techage/basis/lib.lua @@ -76,7 +76,7 @@ for _,row in ipairs(ROTATION) do end function techage.facedir_to_rotation(facedir) - return FACEDIR_TO_ROT[facedir] + return FACEDIR_TO_ROT[facedir] or FACEDIR_TO_ROT[0] end function techage.param2_turn_left(param2) @@ -129,7 +129,6 @@ function techage.param2_turn_up(facedir, param2) end - ------------------------------------------------------------------------------- -- Rotate nodes around the center ------------------------------------------------------------------------------- @@ -181,12 +180,12 @@ function techage.rotate_around_center(nodes1, turn, cpos) return nodes2 end --- allowed for digging -local RegisteredNodesToBeDug = {} -function techage.register_node_to_be_dug(name) - RegisteredNodesToBeDug[name] = true -end +------------------------------------------------------------------------------- +-- Helper functions +------------------------------------------------------------------------------- +-- allowed for digging +local SimpleNodes = {} -- translation from param2 to dir (out of the node upwards) local Param2Dir = {} @@ -244,6 +243,17 @@ function techage.add_to_set(set, x) end end +-- techage.tbl_filter({"a", "b", "c", "d"}, function(v, k, t) return v >= "c" end) --> {"c","d"} +techage.tbl_filter = function(t, filterIter) + local out = {} + + for k, v in pairs(t) do + if filterIter(v, k, t) then out[k] = v end + end + + return out +end + function techage.get_node_lvm(pos) local node = minetest.get_node_or_nil(pos) if node then @@ -273,21 +283,54 @@ function techage.is_air_like(name) end -- returns true, if node can be dug, otherwise false -function techage.can_node_dig(node, ndef) - if RegisteredNodesToBeDug[node.name] then +function techage.can_dig_node(name, ndef) + if not ndef then return false end + if SimpleNodes[name] ~= nil then + return SimpleNodes[name] + end + + if ndef.groups and ndef.groups.techage_door == 1 then + SimpleNodes[name] = true return true end - if not ndef then return false end - if node.name == "ignore" then return false end - if node.name == "air" then return true end - if ndef.buildable_to == true then return true end - if ndef.diggable == false then return false end - if ndef.after_dig_node then return false end + if name == "ignore" then + SimpleNodes[name] = false + return false + end + if name == "air" then + SimpleNodes[name] = true + return true + end + if ndef.buildable_to == true then + SimpleNodes[name] = true + return true + end + -- don't remove nodes with some intelligence or undiggable nodes + if ndef.drop == "" then + SimpleNodes[name] = false + return false + end + if ndef.diggable == false then + SimpleNodes[name] = false + return false + end + if ndef.after_dig_node then + SimpleNodes[name] = false + return false + end -- add it to the white list - RegisteredNodesToBeDug[node.name] = true + SimpleNodes[name] = true return true end +-- Simple nodes +function techage.register_simple_nodes(node_names, is_valid) + if is_valid == nil then is_valid = true end + for _,name in ipairs(node_names or {}) do + SimpleNodes[name] = is_valid + end +end + techage.dig_states = { NOT_DIGGABLE = 1, INV_FULL = 2, @@ -421,50 +464,6 @@ function techage.item_image_small(x, y, itemname, tooltip_prefix) tooltip end -function techage.mydump(o, indent, nested, level) - local t = type(o) - if not level and t == "userdata" then - -- when userdata (e.g. player) is passed directly, print its metatable: - return "userdata metatable: " .. techage.mydump(getmetatable(o)) - end - if t ~= "table" then - return basic_dump(o) - end - -- Contains table -> true/nil of currently nested tables - nested = nested or {} - if nested[o] then - return "" - end - nested[o] = true - indent = " " - level = level or 1 - local t = {} - local dumped_indexes = {} - for i, v in ipairs(o) do - t[#t + 1] = techage.mydump(v, indent, nested, level + 1) - dumped_indexes[i] = true - end - for k, v in pairs(o) do - if not dumped_indexes[k] then - if type(k) ~= "string" or not is_valid_identifier(k) then - k = "["..techage.mydump(k, indent, nested, level + 1).."]" - end - v = techage.mydump(v, indent, nested, level + 1) - t[#t + 1] = k.." = "..v - end - end - nested[o] = nil - if indent ~= "" then - local indent_str = string.rep(indent, level) - local end_indent_str = string.rep(indent, level - 1) - return string.format("{%s%s%s}", - indent_str, - table.concat(t, ","..indent_str), - end_indent_str) - end - return "{"..table.concat(t, ", ").."}" -end - function techage.vector_dump(posses) local t = {} for _,pos in ipairs(posses) do @@ -493,6 +492,10 @@ function techage.register_mobs_mods(mod) techage.RegisteredMobsMods[mod] = true end +function techage.beduino_signed_var(val) + val = val or 0 + return val >= 32768 and val - 0x10000 or val +end ------------------------------------------------------------------------------- -- Terminal history buffer @@ -561,6 +564,8 @@ function techage.add_expoint(player, number) end end +-- Delete number with: `//lua minetest.get_player_by_name(""):get_meta():set_string("techage_collider_number", "")` + function techage.on_remove_collider(player) if player and player.get_meta then local meta = player:get_meta() diff --git a/techage/basis/mark.lua b/techage/basis/mark.lua index 8058b1f..9400789 100644 --- a/techage/basis/mark.lua +++ b/techage/basis/mark.lua @@ -82,7 +82,7 @@ minetest.register_entity(":techage:region_cube", { initial_properties = { visual = "upright_sprite", textures = {"techage_cube_mark.png"}, - use_texture_alpha = true, + use_texture_alpha = techage.BLEND, physical = false, glow = 12, }, diff --git a/techage/basis/mark2.lua b/techage/basis/mark2.lua index ab1124e..449765b 100644 --- a/techage/basis/mark2.lua +++ b/techage/basis/mark2.lua @@ -70,7 +70,7 @@ minetest.register_entity(":techage:position_cube", { "techage_cube_mark.png", "techage_cube_mark.png", }, - use_texture_alpha = true, + use_texture_alpha = techage.BLEND, physical = false, visual_size = {x = 1.1, y = 1.1}, collisionbox = {-0.55,-0.55,-0.55, 0.55,0.55,0.55}, diff --git a/techage/basis/mark_lib.lua b/techage/basis/mark_lib.lua index 835555a..78458ba 100644 --- a/techage/basis/mark_lib.lua +++ b/techage/basis/mark_lib.lua @@ -97,7 +97,6 @@ minetest.register_entity(":techage:block_marker", { "techage_cube_mark.png", "techage_cube_mark.png", }, - --use_texture_alpha = true, physical = false, visual_size = {x=1.1, y=1.1}, collisionbox = {-0.55,-0.55,-0.55, 0.55,0.55,0.55}, diff --git a/techage/basis/node_states.lua b/techage/basis/node_states.lua index f866910..1b62b35 100644 --- a/techage/basis/node_states.lua +++ b/techage/basis/node_states.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -66,12 +66,14 @@ local N = techage.get_node_lvm -- TechAge machine states -- -techage.RUNNING = 1 -- in normal operation/turned on -techage.BLOCKED = 2 -- a pushing node is blocked due to a full destination inventory -techage.STANDBY = 3 -- nothing to do (e.g. no input items), or node (world) not loaded -techage.NOPOWER = 4 -- only for power consuming nodes, no operation -techage.FAULT = 5 -- any fault state (e.g. wrong source items), which can be fixed by the player -techage.STOPPED = 6 -- not operational/turned off +techage.RUNNING = 1 -- in normal operation/turned on +techage.BLOCKED = 2 -- a pushing node is blocked due to a full destination inventory +techage.STANDBY = 3 -- nothing to do (e.g. no input items), or node (world) not loaded +techage.NOPOWER = 4 -- only for power consuming nodes, no operation +techage.FAULT = 5 -- any fault state (e.g. wrong source items), which can be fixed by the player +techage.STOPPED = 6 -- not operational/turned off +techage.UNLOADED = 7 -- Map block unloaded +techage.INACTIVE = 8 -- Map block loaded but node is not actively working techage.StatesImg = { "techage_inv_button_on.png", @@ -133,13 +135,15 @@ local function has_power(pos, nvm) return true end -local function swap_node(pos, name) +local function swap_node(pos, new_name, old_name) local node = techage.get_node_lvm(pos) - if node.name == name then + if node.name == new_name then return end - node.name = name - minetest.swap_node(pos, node) + if node.name == old_name then + node.name = new_name + minetest.swap_node(pos, node) + end end -- true if node_timer should be executed @@ -174,7 +178,7 @@ function NodeStates:new(attr) cycle_time = attr.cycle_time, -- for running state standby_ticks = attr.standby_ticks, -- for standby state -- optional - countdown_ticks = attr.countdown_ticks or 1, + countdown_ticks = attr.countdown_ticks or 1, node_name_passive = attr.node_name_passive, node_name_active = attr.node_name_active, infotext_name = attr.infotext_name, @@ -220,7 +224,7 @@ function NodeStates:stop(pos, nvm) self.stop_node(pos, nvm, state) end if self.node_name_passive then - swap_node(pos, self.node_name_passive) + swap_node(pos, self.node_name_passive, self.node_name_active) end if self.infotext_name then local number = M(pos):get_string("node_number") @@ -257,7 +261,7 @@ function NodeStates:start(pos, nvm) end nvm.techage_countdown = self.countdown_ticks if self.node_name_active then - swap_node(pos, self.node_name_active) + swap_node(pos, self.node_name_active, self.node_name_passive) end if self.infotext_name then local number = M(pos):get_string("node_number") @@ -288,7 +292,7 @@ function NodeStates:standby(pos, nvm, err_string) if state == RUNNING or state == BLOCKED then nvm.techage_state = STANDBY if self.node_name_passive then - swap_node(pos, self.node_name_passive) + swap_node(pos, self.node_name_passive, self.node_name_active) end if self.infotext_name then local number = M(pos):get_string("node_number") @@ -313,7 +317,7 @@ function NodeStates:blocked(pos, nvm, err_string) if state == RUNNING then nvm.techage_state = BLOCKED if self.node_name_passive then - swap_node(pos, self.node_name_passive) + swap_node(pos, self.node_name_passive, self.node_name_active) end if self.infotext_name then local number = M(pos):get_string("node_number") @@ -337,7 +341,7 @@ function NodeStates:nopower(pos, nvm, err_string) if state ~= NOPOWER then nvm.techage_state = NOPOWER if self.node_name_passive then - swap_node(pos, self.node_name_passive) + swap_node(pos, self.node_name_passive, self.node_name_active) end if self.infotext_name then local number = M(pos):get_string("node_number") @@ -362,7 +366,7 @@ function NodeStates:fault(pos, nvm, err_string) if state == RUNNING or state == STOPPED then nvm.techage_state = FAULT if self.node_name_passive then - swap_node(pos, self.node_name_passive) + swap_node(pos, self.node_name_passive, self.node_name_active) end if self.infotext_name then local number = M(pos):get_string("node_number") @@ -479,6 +483,40 @@ function NodeStates:on_receive_message(pos, topic, payload) end end +function NodeStates:on_beduino_receive_cmnd(pos, topic, payload) + if topic == 1 then + if payload[1] == 0 then + self:stop(pos, techage.get_nvm(pos)) + return 0 + else + self:start(pos, techage.get_nvm(pos)) + return 0 + end + else + return 2 -- unknown or invalid topic + end +end + +function NodeStates:on_beduino_request_data(pos, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 128 then + return 0, techage.get_node_lvm(pos).name + elseif topic == 129 then + local node = minetest.get_node(pos) + if node.name == "ignore" then -- unloaded node? + return 0, {techage.UNLOADED} + elseif nvm.techage_state == RUNNING then + local ttl = (nvm.last_active or 0) + 2 * (self.cycle_time or 0) + if ttl < minetest.get_gametime() then + return 0, {techage.INACTIVE} + end + end + return 0, {nvm.techage_state or STOPPED} + else + return 2, "" -- topic is unknown or invalid + end +end + -- restart timer function NodeStates:on_node_load(pos) local nvm = techage.get_nvm(pos) diff --git a/techage/basis/node_store.lua b/techage/basis/node_store.lua index cce2e55..ec5b7dc 100644 --- a/techage/basis/node_store.lua +++ b/techage/basis/node_store.lua @@ -71,7 +71,7 @@ end ------------------------------------------------------------------- -- Storage scheduler ------------------------------------------------------------------- -local CYCLE_TIME = 900 -- store data every 15 min +local CYCLE_TIME = 600 -- store data every 10 min local JobQueue = {} local first = 0 local last = -1 diff --git a/techage/basis/recipe_lib.lua b/techage/basis/recipe_lib.lua index 8ff64e7..4d98ee7 100644 --- a/techage/basis/recipe_lib.lua +++ b/techage/basis/recipe_lib.lua @@ -74,9 +74,12 @@ local function input_string(recipe) return table.concat(tbl, "") end -function techage.recipes.get(nvm, rtype) +function techage.recipes.get(nvm, rtype, owner) local recipes = Recipes[rtype] or {} - return recipes[nvm.recipe_idx or 1] + if owner then + recipes = filter_recipes_based_on_points(recipes, owner) + end + return recipes[nvm.recipe_idx or 1] or recipes[1] end -- Add 4 input/output/waste recipe diff --git a/techage/basis/submenu.lua b/techage/basis/submenu.lua index 4c248dc..1aa0d63 100644 --- a/techage/basis/submenu.lua +++ b/techage/basis/submenu.lua @@ -101,7 +101,7 @@ local function generate_formspec_substring(pos, meta, form_def, player_name) elseif elem.type == "dropdown" then local l = elem.choices:split(",") if nvm.running or techage.is_running(nvm) then - local val = elem.default + local val = elem.default or "" if meta:contains(elem.name) then val = meta:get_string(elem.name) or "" end diff --git a/techage/beduino/kv_store.lua b/techage/beduino/kv_store.lua new file mode 100644 index 0000000..81424c2 --- /dev/null +++ b/techage/beduino/kv_store.lua @@ -0,0 +1,60 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + K/V Store for the Beduino controller + +]]-- + +local COSTS = 400 + +local function ta_kv_init(cpu_pos, address, regA, regB, regC) + local nvm = techage.get_nvm(cpu_pos) + nvm.kv_store = {} + return 1, COSTS +end + +local function ta_kv_add(cpu_pos, address, regA, regB, regC) + local nvm = techage.get_nvm(cpu_pos) + local text = vm16.read_ascii(cpu_pos, regA, 32) + nvm.kv_store[text] = regB + return 1, COSTS +end + +local function ta_kv_get(cpu_pos, address, regA, regB, regC) + local nvm = techage.get_nvm(cpu_pos) + local text = vm16.read_ascii(cpu_pos, regA, 32) + return nvm.kv_store[text] or 0, COSTS +end + +local kvstore_c = [[ +// Initialize the key/value store +func ta_kv_init() { + return system(0x140, 0); +} + +// Add a key/value pair to the store +func ta_kv_add(key_str, value) { + return system(0x141, key_str, value); +} + +// Returns the value for the given key string +func ta_kv_get(key_str) { + return system(0x142, key_str); +} +]] + +minetest.register_on_mods_loaded(function() + if minetest.global_exists("beduino") and minetest.global_exists("vm16") then + beduino.lib.register_SystemHandler(0x140, ta_kv_init) + beduino.lib.register_SystemHandler(0x141, ta_kv_add) + beduino.lib.register_SystemHandler(0x142, ta_kv_get) + vm16.register_ro_file("beduino", "ta_kvstore.c", kvstore_c) + end +end) diff --git a/techage/carts/chest_cart.lua b/techage/carts/chest_cart.lua index e34e874..ff6da7d 100644 --- a/techage/carts/chest_cart.lua +++ b/techage/carts/chest_cart.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -159,6 +159,15 @@ techage.register_node({"techage:chest_cart"}, { return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 131 then -- Chest State + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return 0, {techage.get_inv_state_num(inv, "main")} + else + return 2, "" + end + end, }) Tube:set_valid_sides("techage:chest_cart", {"L", "R", "F", "B"}) diff --git a/techage/chemistry/ta4_doser.lua b/techage/chemistry/ta4_doser.lua index 30abf1e..316a3c6 100644 --- a/techage/chemistry/ta4_doser.lua +++ b/techage/chemistry/ta4_doser.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -360,6 +360,12 @@ techage.register_node({"techage:ta4_doser", "techage:ta4_doser_on"}, { on_recv_message = function(pos, src, topic, payload) return State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return State:on_beduino_request_data(pos, topic, payload) + end, }) techage.recipes.register_craft_type("ta4_doser", { diff --git a/techage/coal_power_station/firebox.lua b/techage/coal_power_station/firebox.lua index c8849dd..1b732cd 100644 --- a/techage/coal_power_station/firebox.lua +++ b/techage/coal_power_station/firebox.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -207,6 +207,18 @@ techage.register_node({"techage:coalfirebox"}, { return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 128 then + return 0, techage.get_node_lvm(pos).name + elseif topic == 129 then + return 0, {nvm.running and techage.RUNNING or techage.STOPPED} + elseif topic == 132 then + return 0, {techage.fuel.get_fuel_amount(nvm)} + else + return 2, "" + end + end, }) minetest.register_craft({ diff --git a/techage/coal_power_station/generator.lua b/techage/coal_power_station/generator.lua index e744574..fae05de 100644 --- a/techage/coal_power_station/generator.lua +++ b/techage/coal_power_station/generator.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -231,6 +231,17 @@ techage.register_node({"techage:generator", "techage:generator_on"}, { return State:on_receive_message(pos, topic, payload) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 135 then -- Delivered Power + return 0, {math.floor((nvm.provided or 0) + 0.5)} + else + return State:on_beduino_request_data(pos, topic, payload) + end + end, }) -- used by power terminal diff --git a/techage/coal_power_station/oilfirebox.lua b/techage/coal_power_station/oilfirebox.lua index 960d581..b2cc309 100644 --- a/techage/coal_power_station/oilfirebox.lua +++ b/techage/coal_power_station/oilfirebox.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -132,6 +132,18 @@ techage.register_node({"techage:oilfirebox"}, { return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 128 then + return 0, techage.get_node_lvm(pos).name + elseif topic == 129 then + return 0, {nvm.running and techage.RUNNING or techage.STOPPED} + elseif topic == 132 then + return 0, {fuel.get_fuel_amount(nvm)} + else + return 2, "" + end + end, }) minetest.register_craft({ diff --git a/techage/collider/detector.lua b/techage/collider/detector.lua index 2a50207..494d6b9 100644 --- a/techage/collider/detector.lua +++ b/techage/collider/detector.lua @@ -21,7 +21,9 @@ local getpos = techage.assemble.get_pos local CYCLE_TIME = 2 local TNO_MAGNETS = 22 -local PROBABILITY = 180 -- check every 20 s => 20 * 180 * 50% = 30 min +local IMPROBABILITY = 60 -- every 60 min +-- one point per 60 min: check every 20 s => factor = 60 * 3 = 180 +IMPROBABILITY = (minetest.settings:get("techage_expoint_rate_in_min") or 60) * 3 local TIME_SLOTS = 10 local Schedule = {[0] = @@ -59,7 +61,7 @@ local function terminal_message(pos, msg) end local function experience_points(pos) - if math.random(PROBABILITY) == 1 then + if math.random(IMPROBABILITY) == 1 then local owner = M(pos):get_string("owner") local own_num = M(pos):get_string("node_number") local player = minetest.get_player_by_name(owner) diff --git a/techage/doc/items.lua b/techage/doc/items.lua index abad424..b163cc8 100644 --- a/techage/doc/items.lua +++ b/techage/doc/items.lua @@ -110,6 +110,7 @@ techage.Items = { ta3_logic = "techage:ta3_logic", ta3_nodedetector = "techage:ta3_nodedetector_off", ta3_playerdetector = "techage:ta3_playerdetector_off", + ta3_lightdetector = "techage:ta3_lightdetector_off", ta3_repeater = "techage:ta3_repeater", ta3_sequencer = "techage:ta3_sequencer", ta3_timer = "techage:ta3_timer", diff --git a/techage/doc/manual_DE.lua b/techage/doc/manual_DE.lua index 0ea121b..17eecb7 100644 --- a/techage/doc/manual_DE.lua +++ b/techage/doc/manual_DE.lua @@ -124,6 +124,7 @@ techage.manual_DE.aTitel = { "3,TA3 Wagen Detektor / Cart Detector", "3,TA3 Block Detektor / Node Detector", "3,TA3 Spieler Detektor / Player Detector", + "3,TA3 Lichtdetektor", "2,TA3 Maschinen", "3,TA3 Schieber / Pusher", "3,TA3 Verteiler / Distributor", @@ -1145,9 +1146,15 @@ techage.manual_DE.aText = { "\n".. "Wird ein 'on' / 'off' Kommando an den Tür Controller II gesendet\\, entfernt bzw. setzt er die Blöcke ebenfalls.\n".. "\n".. - "Über ein 'exchange' Kommando können einzelne Böcke gesetzt\\, entfernt\\, bzw. durch andere Blöcke ersetzt werden. Die Slot-Nummer des Inventars (1 .. 16) muss als payload übergeben werden\\, also:\n".. + "Mit '$send_cmnd(node_number\\, \"exchange\"\\, 2)' können einzelne Böcke gesetzt\\, entfernt\\, bzw. durch andere Blöcke aus dem Inventar ersetzt werden. \n".. "\n".. - " $send_cmnd(node_number\\, \"exchange\"\\, 2)\n".. + "Mit '$send_cmnd(node_number\\, \"set\"\\, 2)' kann ein Block aus dem Inventory explizit gesetzt werden\\, sofern der Inventory Slot nicht leer ist.\n".. + "\n".. + "Mit '$send_cmnd(node_number\\, \"dig\"\\, 2)' kann ein Block wieder entfernt werden\\, sofern der Inventory Slot leer ist. \n".. + "\n".. + "Mit '$send_cmnd(node_number\\, \"get\"\\, 2)' wird der Name des gesetzten Blocks zurückgeliefert. \n".. + "\n".. + "Die Slot-Nummer des Inventars (1 .. 16) muss in allen drei Fällen als payload übergeben werden.\n".. "\n".. "Damit lassen sich auch ausfahrbare Treppen und ähnliches simulieren.\n".. "\n".. @@ -1159,7 +1166,7 @@ techage.manual_DE.aText = { "\n".. " - Kommando 'on' zum Abspielen eines Sounds\n".. " - Kommando 'sound ' zur Auswahl eines Sounds über den Index\n".. - " - Kommando 'gain ' zum Einstellen der Lautstärke über den '' Wert (0 bis 1.0).\n".. + " - Kommando 'gain ' zum Einstellen der Lautstärke über den '' Wert (1 bis 5).\n".. "\n".. "\n".. "\n", @@ -1198,6 +1205,11 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", + "Der Lichtdetektor sendet einen 'on'-Kommando\\, wenn der Lichtpegel des darüber liegenden Blocks einen bestimmten Pegel überschreitet\\, der über das Rechtsklickmenü eingestellt werden kann.\n".. + "Mit einen TA4 Lua Controller kann die genaue Lichtstärke mit $get_cmd(num\\, 'light_level') ermitteln werden.\n".. + "\n".. + "\n".. + "\n", "Bei TA3 existieren die gleichen Maschinen wie bei TA2\\, nur sind diese hier leistungsfähiger und benötigen Strom statt Achsenantrieb.\n".. "Im folgenden sind daher nur die unterschiedlichen\\, technischen Daten angegeben.\n".. "\n".. @@ -1680,6 +1692,7 @@ techage.manual_DE.aText = { "\n".. " - 'goto ' Zu einer Kommandozeile springen und damit den Sequenzer starten\n".. " - 'stop' Den Sequenzer anhalten\n".. + " - 'on' und 'off' als Alias für 'goto 1' bzw. 'stop'\n".. "\n".. "Das 'goto' Kommando wird nur angenommen\\, wenn der Sequenzer gestoppt ist.\n".. "\n".. @@ -1907,7 +1920,7 @@ techage.manual_DE.aText = { "\n".. "Der TA4 Schieber besitzt zwei zusätzliche Kommandos für den Lua Controller:\n".. "\n".. - " - 'config' dient zur Konfiguration des Schiebers\\, analog zum manuellen Konfiguration über das Menü.\nBeispiel: '$send_cmnd(1234\\, \"config\"\\, \"default:dirt\")'\n".. + " - 'config' dient zur Konfiguration des Schiebers\\, analog zum manuellen Konfiguration über das Menü.\nBeispiel: '$send_cmnd(1234\\, \"config\"\\, \"default:dirt\")'\nMit '$send_cmnd(1234\\, \"config\"\\, \"\")' wird die Konfiguration gelöscht\n".. " - 'pull' dient zum Absetzen eines Auftrags an den Schieber:\nBeispiel: '$send_cmnd(1234\\, \"pull\"\\, \"default:dirt 8\")'\nAls Nummer sind Werte von 1 bis 12 zulässig. Danach geht der Schieber wieder in den 'stopped' Mode und sendet ein \"off\" Kommando zurück an den Sender des \"pull\" Kommandos.\n".. "\n".. "\n".. @@ -2240,6 +2253,7 @@ techage.manual_DE.aItemName = { "ta3_cartdetector", "ta3_nodedetector", "ta3_playerdetector", + "ta3_lightdetector", "ta3_grinder", "ta3_pusher", "ta3_distributor", @@ -2511,6 +2525,7 @@ techage.manual_DE.aPlanTable = { "", "", "", + "", "ta4_windturbine", "", "", diff --git a/techage/doc/manual_EN.lua b/techage/doc/manual_EN.lua index 0abb1d6..4ec4352 100644 --- a/techage/doc/manual_EN.lua +++ b/techage/doc/manual_EN.lua @@ -124,6 +124,7 @@ techage.manual_EN.aTitel = { "3,TA3 Cart Detector", "3,TA3 Block Detector", "3,TA3 Player Detector", + "3,TA3 Light Detector", "2,TA3 Machines", "3,TA3 Pusher", "3,TA3 Distributor", @@ -1143,9 +1144,15 @@ techage.manual_EN.aText = { "\n", "The Door Controller II can remove and set all types of blocks. To teach in the Door Controller II\\, the \"Record\" button must be pressed. Then all blocks that should be part of the door / gate must be clicked. Then the \"Done\" button must be pressed. Up to 16 blocks can be selected. The removed blocks are saved in the controller's inventory. The function of the controller can be tested manually using the \"Remove\" or \"Set\" buttons. If an 'on' /'off' command is sent to the Door Controller II\\, it removes or sets the blocks as well.\n".. "\n".. - "Individual blocks can be set\\, removed or replaced by other blocks via an 'exchange' command. The slot number of the inventory (1 .. 16) must be transferred as payload\\, i.e.:\n".. + "With '$send_cmnd(node_number\\, \"exchange\"\\, 2)' individual blocks can be set\\, removed or replaced by other blocks from the inventory. \n".. "\n".. - " $send_cmnd(node_number\\, \"exchange\"\\, 2)\n".. + "With '$send_cmnd(node_number\\, \"set\"\\, 2)' a block from the inventory can be set explicitly\\, as long as the inventory slot is not empty.\n".. + "\n".. + "A block can be removed again with '$send_cmnd(node_number\\, \"dig\"\\, 2)' if the inventory slot is empty. \n".. + "\n".. + "The name of the set block is returned with '$send_cmnd(node_number\\, \"get\"\\, 2)'.\n".. + "\n".. + "The slot number of the inventory (1 .. 16) must be passed as payload in all three cases.\n".. "\n".. "This can also be used to simulate extendable stairs and the like. \n".. "\n".. @@ -1157,7 +1164,7 @@ techage.manual_EN.aText = { "\n".. " - Command 'on' to play a sound\n".. " - Command 'sound ' to select a sound via the index\n".. - " - Command 'gain ' to adjust the volume via the '' value (0 to 1.0).\n".. + " - Command 'gain ' to adjust the volume via the '' value (1 to 5).\n".. "\n".. "\n".. "\n", @@ -1196,6 +1203,11 @@ techage.manual_EN.aText = { "\n".. "\n".. "\n", + "The light detector sends an 'on' command if the light level of the block above exceeds a certain level\\, which can be set through the right-click menu.\n".. + "If you have a TA4 Lua Controller\\, you can get the exact light level with $get_cmd(num\\, 'light_level')\n".. + "\n".. + "\n".. + "\n", "TA3 has the same machines as TA2\\, only these are more powerful and require electricity instead of axis drive.\n".. "Therefore\\, only the different technical data are given below.\n".. "\n".. @@ -1676,6 +1688,7 @@ techage.manual_EN.aText = { "\n".. " - 'goto ' Jump to a command line and start the sequencer\n".. " - 'stop' Stop the sequencer\n".. + " - 'on' and 'off' as aliases for 'goto 1' resp. 'stop'\n".. "\n".. "The 'goto' command is only accepted when the sequencer is stopped.\n".. "\n".. @@ -1903,7 +1916,7 @@ techage.manual_EN.aText = { "\n".. "The TA4 pusher has two additional commands for the Lua controller:\n".. "\n".. - " - 'config' is used to configure the pusher\\, analogous to manual configuration via the menu.\nExample: '$send_cmnd(1234\\, \"config\"\\, \"default: dirt\")'\n".. + " - 'config' is used to configure the pusher\\, analogous to manual configuration via the menu.\nExample: '$send_cmnd(1234\\, \"config\"\\, \"default: dirt\")'\nWith '$send_cmnd(1234\\, \"config\"\\, \"\")' the configuration is deleted\n".. " - 'pull' is used to send an order to the pusher:\nExample: '$send_cmnd(1234\\, \"pull\"\\, \"default: dirt 8\")'\nValues ​​from 1 to 12 are permitted as numbers. Then the pusher goes back to 'stopped' mode and sends an\" off \"command back to the transmitter of the\" pull \"command.\n".. "\n".. "\n".. @@ -2235,6 +2248,7 @@ techage.manual_EN.aItemName = { "ta3_cartdetector", "ta3_nodedetector", "ta3_playerdetector", + "ta3_lightdetector", "ta3_grinder", "ta3_pusher", "ta3_distributor", @@ -2505,6 +2519,7 @@ techage.manual_EN.aPlanTable = { "", "", "", + "", "ta4_windturbine", "", "", diff --git a/techage/doc/plans.lua b/techage/doc/plans.lua index 3cf0476..282997c 100644 --- a/techage/doc/plans.lua +++ b/techage/doc/plans.lua @@ -511,8 +511,6 @@ techage.ConstructionPlans["ta5_teleport"] = { {false, false, false, false, false, false, false, false, false, false, false}, {false, false, false, false, false, false, false, false, false, false, false}, {false, TANK4, PUMP4, TELEP, false, ARROW, false, TELEP, PIPEH, TANK4, false}, - {false, false, false, false, false, false, false, false, false, false, false}, - {false, TANK4, PIPEH, TELEP, false, ARROW, false, TELEP, PUMP4, TANK4, false}, } -- diff --git a/techage/energy_storage/heatexchanger2.lua b/techage/energy_storage/heatexchanger2.lua index 2478288..dc4b1d3 100644 --- a/techage/energy_storage/heatexchanger2.lua +++ b/techage/energy_storage/heatexchanger2.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -356,6 +356,37 @@ techage.register_node({"techage:heatexchanger2"}, { return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 1 and payload[1] == 1 then + start_node(pos, techage.get_nvm(pos)) + return 0 + elseif topic == 1 and payload[1] == 0 then + stop_node(pos, techage.get_nvm(pos)) + return 0 + else + return 2, "" + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 128 then + return 0, techage.get_node_lvm(pos).name + elseif topic == 129 then -- State + if techage.is_running(nvm) then + return 0, {techage.RUNNING} + else + return 0, {techage.STOPPED} + end + elseif topic == 135 then -- Delivered Power + local data = power.get_network_data(pos, Cable, DOWN) + return 0, {data.consumed - data.provided} + elseif topic == 134 then -- Tank Load Percent + return 0, {techage.power.percent(nvm.capa_max, nvm.capa)} + else + return 2, "" + end + end, on_node_load = function(pos, node) local nvm = techage.get_nvm(pos) if techage.is_running(nvm) then diff --git a/techage/fermenter/gasflare.lua b/techage/fermenter/gasflare.lua index 4f4c741..c11b38d 100644 --- a/techage/fermenter/gasflare.lua +++ b/techage/fermenter/gasflare.lua @@ -74,7 +74,7 @@ for idx,ratio in ipairs(lRatio) do end end, - use_texture_alpha = true, + use_texture_alpha = techage.BLEND, inventory_image = "techage_flame.png", paramtype = "light", light_source = 13, diff --git a/techage/furnace/firebox.lua b/techage/furnace/firebox.lua index e933d08..e3678db 100644 --- a/techage/furnace/firebox.lua +++ b/techage/furnace/firebox.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -173,6 +173,18 @@ techage.register_node({"techage:furnace_firebox", "techage:furnace_firebox_on"}, return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 128 then + return 0, techage.get_node_lvm(pos).name + elseif topic == 129 then -- State + return 0, {nvm.running and techage.RUNNING or techage.STOPPED} + elseif topic == 132 then -- Fuel Level + return 0, {fuel.get_fuel_amount(nvm)} + else + return 2, "" + end + end, -- called from furnace_top on_transfer = function(pos, in_dir, topic, payload) local nvm = techage.get_nvm(pos) diff --git a/techage/furnace/furnace_top.lua b/techage/furnace/furnace_top.lua index e49e748..b1c8aff 100644 --- a/techage/furnace/furnace_top.lua +++ b/techage/furnace/furnace_top.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -257,6 +257,17 @@ local tubing = { return CRD(pos).State:on_receive_message(pos, topic, payload) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 141 then -- Furnace Output + local nvm = techage.get_nvm(pos) + return 0, string.split(nvm.output or "unknown", " ")[1] + else + return CRD(pos).State:on_beduino_request_data(pos, topic, payload) + end + end, } local _, node_name_ta3, _ = diff --git a/techage/fusion_reactor/controller.lua b/techage/fusion_reactor/controller.lua index 848cdaf..653602d 100644 --- a/techage/fusion_reactor/controller.lua +++ b/techage/fusion_reactor/controller.lua @@ -46,6 +46,7 @@ local function count_trues(t) end local function nucleus(t) + t = techage.tbl_filter(t, function(v, k, t) return type(v) == "table" end) if #t == 4 then if vector.equals(t[1], t[2]) and vector.equals(t[3], t[4]) then return true @@ -268,6 +269,12 @@ techage.register_node({"techage:ta5_fr_controller_pas", "techage:ta5_fr_controll on_recv_message = function(pos, src, topic, payload) return State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return State:on_beduino_request_data(pos, topic, payload) + end, }) power.register_nodes({"techage:ta5_fr_controller_pas", "techage:ta5_fr_controller_act"}, Cable, "con", {"L", "R"}) diff --git a/techage/fusion_reactor/heatexchanger2.lua b/techage/fusion_reactor/heatexchanger2.lua index 7ea1df2..999efbb 100644 --- a/techage/fusion_reactor/heatexchanger2.lua +++ b/techage/fusion_reactor/heatexchanger2.lua @@ -183,7 +183,7 @@ local function steam_management(pos, nvm) nvm.temperature = math.min(nvm.temperature + 10, 100) elseif resp ~= true then State:fault(pos, nvm, resp) - stop_node(pos, nvm) + State:stop(pos, nvm) return false end @@ -325,15 +325,44 @@ techage.register_node({"techage:ta5_heatexchanger2"}, { local data = power.get_network_data(pos, Cable, DOWN) return data.consumed - data.provided elseif topic == "on" then - start_node(pos, techage.get_nvm(pos)) + State:start(pos, nvm) return true elseif topic == "off" then - stop_node(pos, techage.get_nvm(pos)) + State:stop(pos, nvm) return true else return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 1 and payload[1] == 1 then + start_node(pos, techage.get_nvm(pos)) + return 0 + elseif topic == 1 and payload[1] == 0 then + stop_node(pos, techage.get_nvm(pos)) + return 0 + else + return 2, "" + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 128 then + return 0, techage.get_node_lvm(pos).name + elseif topic == 129 then -- State + if techage.is_running(nvm) then + return 0, {techage.RUNNING} + else + return 0, {techage.STOPPED} + end + elseif topic == 135 then -- Delivered Power + local data = power.get_network_data(pos, Cable, DOWN) + return 0, {data.consumed - data.provided} + else + return 2, "" + end + end, on_node_load = function(pos, node) local nvm = techage.get_nvm(pos) if techage.is_running(nvm) then @@ -344,7 +373,7 @@ techage.register_node({"techage:ta5_heatexchanger2"}, { -- Attempt to restart the system as the heat exchanger goes into error state -- when parts of the storage block are unloaded. if nvm.techage_state == techage.FAULT then - start_node(pos, nvm) + State:start(pos, nvm) end end, }) diff --git a/techage/fusion_reactor/ta5_pump.lua b/techage/fusion_reactor/ta5_pump.lua index fab96a0..a522bc3 100644 --- a/techage/fusion_reactor/ta5_pump.lua +++ b/techage/fusion_reactor/ta5_pump.lua @@ -170,6 +170,12 @@ techage.register_node({"techage:ta5_pump", "techage:ta5_pump_on"}, { on_recv_message = function(pos, src, topic, payload) return State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return State:on_beduino_request_data(pos, topic, payload) + end, }) -- Pumps have to provide one output and one input side diff --git a/techage/hydrogen/electrolyzer.lua b/techage/hydrogen/electrolyzer.lua index c3cc336..155091f 100644 --- a/techage/hydrogen/electrolyzer.lua +++ b/techage/hydrogen/electrolyzer.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -197,11 +197,11 @@ local tool_config = { }, { type = "dropdown", - choices = "0%,20%,40%,60%,80%", + choices = "0%,20%,40%,60%,80%,98%", name = "turnoff", label = S("Turnoff point"), tooltip = S("If the charge of the storage\nsystem exceeds the configured value,\nthe block switches off"), - default = "0%", + default = "98%", }, } @@ -332,11 +332,24 @@ techage.register_node({"techage:ta4_electrolyzer", "techage:ta4_electrolyzer_on" return State:on_receive_message(pos, topic, payload) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 134 and payload[1] == 1 then + return 0, {techage.power.percent(CAPACITY, (nvm.liquid and nvm.liquid.amount) or 0)} + elseif topic == 135 then + return 0, {math.floor((nvm.provided or 0) + 0.5)} + else + return State:on_beduino_request_data(pos, topic, payload) + end + end, on_node_load = function(pos, node) local meta = M(pos) if not meta:contains("reduction") then meta:set_string("reduction", "100%") - meta:set_string("turnoff", "0%") + meta:set_string("turnoff", "100%") end end, }) diff --git a/techage/hydrogen/fuelcell.lua b/techage/hydrogen/fuelcell.lua index 81301af..791558c 100644 --- a/techage/hydrogen/fuelcell.lua +++ b/techage/hydrogen/fuelcell.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -304,6 +304,19 @@ techage.register_node({"techage:ta4_fuelcell", "techage:ta4_fuelcell_on"}, { return State:on_receive_message(pos, topic, payload) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 134 and payload[1] == 1 then + return 0, {techage.power.percent(CAPACITY, (nvm.liquid and nvm.liquid.amount) or 0)} + elseif topic == 135 then + return 0, {math.floor((nvm.provided or 0) + 0.5)} + else + return State:on_beduino_request_data(pos, topic, payload) + end + end, }) control.register_nodes({"techage:ta4_fuelcell", "techage:ta4_fuelcell_on"}, { diff --git a/techage/icta_controller/battery.lua b/techage/icta_controller/battery.lua index 24c710c..1b4082e 100644 --- a/techage/icta_controller/battery.lua +++ b/techage/icta_controller/battery.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -176,4 +176,12 @@ techage.register_node({"techage:ta4_battery"}, { return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 134 then + local meta = minetest.get_meta(pos) + return 0, {calc_percent(meta:get_int("content"))} + else + return 2, "" + end + end, }) diff --git a/techage/icta_controller/commands.lua b/techage/icta_controller/commands.lua index 09d1b47..db5c5bc 100644 --- a/techage/icta_controller/commands.lua +++ b/techage/icta_controller/commands.lua @@ -153,7 +153,7 @@ techage.icta_register_condition("input", { return env.input[data.number] end local result = function(val) - return techage.compare(val, data.value, data.operand) + return techage.compare(val, tonumber(data.value) or 0, data.operand) end return condition, result end, @@ -196,7 +196,7 @@ techage.icta_register_condition("state", { return techage.send_single(environ.number, data.number, "state") end local result = function(val) - return techage.compare(val, data.value, data.operand) + return techage.compare(val, tonumber(data.value) or 0, data.operand) end return condition, result end, @@ -238,7 +238,7 @@ techage.icta_register_condition("fuel", { return techage.send_single(environ.number, data.number, "fuel") end local result = function(val) - return techage.compare(val, tonumber(data.value), data.operand) + return techage.compare(val, tonumber(data.value) or 0, data.operand) end return condition, result end, @@ -280,7 +280,7 @@ techage.icta_register_condition("load", { return techage.send_single(environ.number, data.number, "load") end local result = function(val) - return techage.compare(val, tonumber(data.value), data.operand) + return techage.compare(val, tonumber(data.value) or 0, data.operand) end return condition, result end, @@ -322,7 +322,7 @@ techage.icta_register_condition("depth", { return techage.send_single(environ.number, data.number, "depth") end local result = function(val) - return techage.compare(val, tonumber(data.value), data.operand) + return techage.compare(val, tonumber(data.value) or 0, data.operand) end return condition, result end, @@ -364,7 +364,7 @@ techage.icta_register_condition("delivered", { return techage.send_single(environ.number, data.number, "delivered") end local result = function(val) - return techage.compare(val, tonumber(data.value), data.operand) + return techage.compare(val, tonumber(data.value) or 0, data.operand) end return condition, result end, @@ -408,7 +408,7 @@ techage.icta_register_condition("chest", { return techage.send_single(environ.number, data.number, "state") end local result = function(val) - return techage.compare(val, data.value, data.operand) + return techage.compare(val, tonumber(data.value) or 0, data.operand) end return condition, result end, @@ -449,7 +449,7 @@ techage.icta_register_condition("signaltower", { return techage.send_single(environ.number, data.number, "state") end local result = function(val) - return techage.compare(val, data.value, data.operand) + return techage.compare(val, tonumber(data.value) or 0, data.operand) end return condition, result end, @@ -919,7 +919,7 @@ techage.icta_register_condition("get_filter", { return techage.send_single(environ.number, data.number, "port", data.color) end local result = function(val) - return techage.compare(val, data.value, data.operand) + return techage.compare(val, tonumber(data.value) or 0, data.operand) end return condition, result end, diff --git a/techage/icta_controller/controller.lua b/techage/icta_controller/controller.lua index 7c3292e..6c75af8 100644 --- a/techage/icta_controller/controller.lua +++ b/techage/icta_controller/controller.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -444,4 +444,30 @@ techage.register_node({"techage:ta4_icta_controller"}, { return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + local state = meta:get_int("state") + + if state == techage.RUNNING and topic == 1 and payload[1] == 1 then + set_input(pos, number, src, topic) + elseif state == techage.RUNNING and topic == 1 and payload[1] == 0 then + set_input(pos, number, src, topic) + else + return 2 + end + return 0 + end, + on_beduino_request_data = function(pos, src, topic, payload) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + local state = meta:get_int("state") + + if topic == 129 then + local state = meta:get_int("state") or 0 + return 0, {state or techage.STOPPED} + else + return 2, "" + end + end, }) diff --git a/techage/icta_controller/display.lua b/techage/icta_controller/display.lua index e2a182d..1b1b1bc 100644 --- a/techage/icta_controller/display.lua +++ b/techage/icta_controller/display.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -211,13 +211,21 @@ function techage.display.add_line(pos, payload, cycle_time) table.insert(nvm.text, str) end -function techage.display.write_row(pos, payload, cycle_time) +function techage.display.write_row(pos, payload, cycle_time, beduino) local nvm = techage.get_nvm(pos) local mem = techage.get_mem(pos) + local str, row + nvm.text = nvm.text or {} mem.ticks = mem.ticks or 0 - local str = tostring(payload.get("str")) or "oops" - local row = tonumber(payload.get("row")) or 1 + + if beduino then + row = tonumber(payload:sub(1,1) or "1") or 1 + str = payload:sub(2) or "oops" + else + str = tostring(payload.get("str")) or "oops" + row = tonumber(payload.get("row")) or 1 + end if mem.ticks == 0 then mem.ticks = cycle_time @@ -254,6 +262,18 @@ techage.register_node({"techage:ta4_display"}, { techage.display.clear_screen(pos, 1) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 67 then -- add one line and scroll if necessary + techage.display.add_line(pos, payload, 1) + elseif topic == 68 then -- overwrite the given row + techage.display.write_row(pos, payload, 1, true) + elseif topic == 17 then -- clear the screen + techage.display.clear_screen(pos, 1) + else + return 2 + end + return 0 + end, }) techage.register_node({"techage:ta4_displayXL"}, { @@ -266,6 +286,18 @@ techage.register_node({"techage:ta4_displayXL"}, { techage.display.clear_screen(pos, 2) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 67 then -- add one line and scroll if necessary + techage.display.add_line(pos, payload, 2) + elseif topic == 68 then -- overwrite the given row + techage.display.write_row(pos, payload, 2, true) + elseif topic == 17 then -- clear the screen + techage.display.clear_screen(pos, 2) + else + return 2 + end + return 0 + end, }) lcdlib.register_display_entity("techage:display_entity") diff --git a/techage/icta_controller/signaltower.lua b/techage/icta_controller/signaltower.lua index 6377494..13b0d8e 100644 --- a/techage/icta_controller/signaltower.lua +++ b/techage/icta_controller/signaltower.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -132,4 +132,27 @@ techage.register_node({"techage:ta4_signaltower", return meta:get_string("state") end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 2 then + local color = ({"green", "amber", "red"})[payload[1]] + local node = minetest.get_node(pos) + if color then + switch_on(pos, node, color) + else + switch_off(pos, node) + end + return 0 + else + return 2 -- unknown or invalid topic + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 130 then + local meta = minetest.get_meta(pos) + local color = ({off = 0, green = 1, amber = 2, red = 3})[meta:get_string("state")] or 1 + return 0, {color} + else + return 2, "" -- unknown or invalid topic + end + end, }) diff --git a/techage/init.lua b/techage/init.lua index 7674ca0..40d9d1f 100644 --- a/techage/init.lua +++ b/techage/init.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -13,7 +13,7 @@ techage = {} -- Version for compatibility checks, see readme.md/history -techage.version = 1.07 +techage.version = 1.08 if minetest.global_exists("tubelib") then minetest.log("error", "[techage] Techage can't be used together with the mod tubelib!") @@ -285,6 +285,7 @@ dofile(MP.."/logic/timer.lua") dofile(MP.."/logic/lua_logic.lua") -- old dofile(MP.."/logic/logic_block.lua") -- new dofile(MP.."/logic/node_detector.lua") +dofile(MP.."/logic/light_detector.lua") dofile(MP.."/logic/player_detector.lua") dofile(MP.."/logic/mba_detector.lua") dofile(MP.."/logic/cart_detector.lua") @@ -412,8 +413,8 @@ dofile(MP.."/fusion_reactor/generator.lua") dofile(MP.."/fusion_reactor/turbine.lua") dofile(MP.."/fusion_reactor/ta5_pump.lua") +-- Beduino extensions +dofile(MP.."/beduino/kv_store.lua") + -- Prevent other mods from using IE techage.IE = nil - - -function techage.icta_register_condition(key, tData) end diff --git a/techage/items/moreblocks.lua b/techage/items/moreblocks.lua index 67bfa18..66c323a 100644 --- a/techage/items/moreblocks.lua +++ b/techage/items/moreblocks.lua @@ -13,7 +13,7 @@ ]]-- local function register_alias(name) - minetest.register_alias("stairs:slab_" ..name, "techage:slab_" ..name) + --minetest.register_alias("stairs:slab_" ..name, "techage:slab_" ..name) minetest.register_alias("stairs:slab_" ..name.. "_inverted", "techage:slab_" ..name.. "_inverted") minetest.register_alias("stairs:slab_" ..name.. "_wall", "techage:slab_" ..name.. "_wall") minetest.register_alias("stairs:slab_" ..name.. "_quarter", "techage:slab_" ..name.. "_quarter") @@ -22,7 +22,7 @@ local function register_alias(name) minetest.register_alias("stairs:slab_" ..name.. "_three_quarter", "techage:slab_" ..name.. "_three_quarter") minetest.register_alias("stairs:slab_" ..name.. "_three_quarter_inverted", "techage:slab_" ..name.. "_three_quarter_inverted") minetest.register_alias("stairs:slab_" ..name.. "_three_quarter_wall", "techage:slab_" ..name.. "_three_quarter_wall") - minetest.register_alias("stairs:stair_" ..name, "techage:stair_" ..name) + --minetest.register_alias("stairs:stair_" ..name, "techage:stair_" ..name) minetest.register_alias("stairs:stair_" ..name.. "_inverted", "techage:stair_" ..name.. "_inverted") minetest.register_alias("stairs:stair_" ..name.. "_wall", "techage:stair_" ..name.. "_wall") minetest.register_alias("stairs:stair_" ..name.. "_wall_half", "techage:stair_" ..name.. "_wall_half") diff --git a/techage/items/registered_nodes.lua b/techage/items/registered_nodes.lua index a6a6bae..bf29591 100644 --- a/techage/items/registered_nodes.lua +++ b/techage/items/registered_nodes.lua @@ -64,4 +64,7 @@ techage.register_mobs_mods("wildlife") techage.register_mobs_mods("mobs_skeletons") techage.register_mobs_mods("mobs_dwarves") techage.register_mobs_mods("mobf_trader") -techage.register_mobs_mods("ts_vehicles") +techage.register_mobs_mods("ts_vehicles_cars") + +-- Used as e.g. crane cable +techage.register_simple_nodes({"techage:power_lineS"}, true) \ No newline at end of file diff --git a/techage/liquids/pump.lua b/techage/liquids/pump.lua index 868d81a..99f0b51 100644 --- a/techage/liquids/pump.lua +++ b/techage/liquids/pump.lua @@ -284,6 +284,17 @@ techage.register_node({"techage:t4_pump", "techage:t4_pump_on"}, { return State4:on_receive_message(pos, topic, payload) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State4:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 137 then -- Total Flow Rate + local nvm = techage.get_nvm(pos) + return 0, {nvm.flowrate or 0} + else + return State4:on_beduino_request_data(pos, topic, payload) + end + end, }) -- Pumps have to provide one output and one input side diff --git a/techage/liquids/silo.lua b/techage/liquids/silo.lua index 0ef45c8..254b246 100644 --- a/techage/liquids/silo.lua +++ b/techage/liquids/silo.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -312,6 +312,25 @@ techage.register_node({"techage:ta3_silo", "techage:ta4_silo"}, { return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 131 then -- Chest State + local meta = M(pos) + local inv = meta:get_inventory() + return 0, {techage.get_inv_state_num(inv, "main")} + elseif topic == 134 then + local inv = M(pos):get_inventory() + local nvm = techage.get_nvm(pos) + nvm.item_count = nvm.item_count or get_item_count(pos) + nvm.capa = nvm.capa or get_silo_capa(pos) + if payload[1] == 1 then + return 0, {techage.power.percent(nvm.capa, nvm.item_count)} + else + return 0, {nvm.item_count} + end + else + return 2, "" + end + end, on_node_load = function(pos) local nvm = techage.get_nvm(pos) nvm.item_count = nil diff --git a/techage/liquids/valve.lua b/techage/liquids/valve.lua index 8c9edd7..bf59c35 100644 --- a/techage/liquids/valve.lua +++ b/techage/liquids/valve.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -139,6 +139,29 @@ techage.register_node({"techage:ta3_valve_closed", "techage:ta3_valve_open"}, { return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local node = techage.get_node_lvm(pos) + if topic == 1 and payload[1] == 1 and node.name == "techage:ta3_valve_closed" then + liquid.turn_valve_on(pos, Pipe, "techage:ta3_valve_closed", "techage:ta3_valve_open") + return 0 + elseif topic == 1 and payload[1] == 0 and node.name == "techage:ta3_valve_open" then + liquid.turn_valve_off(pos, Pipe, "techage:ta3_valve_closed", "techage:ta3_valve_open") + return 0 + else + return 2, "" + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + local node = techage.get_node_lvm(pos) + if topic == 142 then -- State + if node.name == "techage:ta3_valve_open" then + return 0, {1} + end + return 0, {0} + else + return 2, "" + end + end, }) liquid.register_nodes({"techage:ta3_valve_closed"}, Pipe, "special", {}, {}) diff --git a/techage/liquids/waterpump.lua b/techage/liquids/waterpump.lua index 82ecf08..6911493 100644 --- a/techage/liquids/waterpump.lua +++ b/techage/liquids/waterpump.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -158,4 +158,10 @@ techage.register_node({"techage:t4_waterpump"}, { on_recv_message = function(pos, src, topic, payload) return State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return State:on_beduino_request_data(pos, topic, payload) + end, }) diff --git a/techage/locale/techage.de.tr b/techage/locale/techage.de.tr index b59c664..6ce7269 100644 --- a/techage/locale/techage.de.tr +++ b/techage/locale/techage.de.tr @@ -127,6 +127,7 @@ Command=Kommando ### button.lua ### ### cart_detector.lua ### ### detector.lua ### +### light_detector.lua ### ### lua_logic.lua ### ### mesecons_converter.lua ### ### node_detector.lua ### @@ -178,6 +179,7 @@ TA4 4x Button=TA4 4x Taster TA3 Cart Detector=TA3 Wagen Detektor ### cart_detector.lua ### +### light_detector.lua ### ### node_detector.lua ### accept=akzeptieren @@ -732,6 +734,11 @@ Block has an@nadditional wrench menu=Block besitzt ein@nzusätzliches@nSchrauben connected with=verbunden mit +### light_detector.lua ### + +Send signal if light level is above:=Sende ein Signal wenn der Lichtwert größer ist als: +TA3 Light Detector=TA3 Lichtdetektor + ### lighter.lua ### TA1 Lighter=TA1 Anzünder diff --git a/techage/locale/template.txt b/techage/locale/template.txt index 63384bd..6067446 100644 --- a/techage/locale/template.txt +++ b/techage/locale/template.txt @@ -127,6 +127,7 @@ Command= ### button.lua ### ### cart_detector.lua ### ### detector.lua ### +### light_detector.lua ### ### lua_logic.lua ### ### mesecons_converter.lua ### ### node_detector.lua ### @@ -178,6 +179,7 @@ TA4 4x Button= TA3 Cart Detector= ### cart_detector.lua ### +### light_detector.lua ### ### node_detector.lua ### accept= @@ -732,6 +734,11 @@ Block has an@nadditional wrench menu= connected with= +### light_detector.lua ### + +Send signal if light level is above:= +TA3 Light Detector= + ### lighter.lua ### TA1 Lighter= diff --git a/techage/logic/button.lua b/techage/logic/button.lua index 9778e6d..c04d1f3 100644 --- a/techage/logic/button.lua +++ b/techage/logic/button.lua @@ -55,7 +55,10 @@ local function switch_off(pos, is_button) elseif name == "techage:ta4_button_on" then logic.swap_node(pos, "techage:ta4_button_off") end - logic.send_off(pos, M(pos)) + local meta = M(pos) + if not meta:contains("command") or meta:get_string("command") == "on" then + logic.send_off(pos, M(pos)) + end if not is_button then minetest.sound_play("techage_button", { pos = pos, @@ -149,6 +152,9 @@ local function on_rightclick_on(pos, node, clicker) if fixed == "true" then if can_access(pos, clicker) then switch_on(pos) + local mem = techage.get_mem(pos) + mem.clicker = clicker and clicker:get_player_name() + mem.time = math.floor(minetest.get_us_time() / 100000) end end end @@ -331,3 +337,31 @@ minetest.register_craft({ {"", "", ""}, }, }) + +techage.register_node({ + "techage:ta4_button_off", "techage:ta4_button_on", + }, { + on_recv_message = function(pos, src, topic, payload) + if topic == "name" then + local mem = techage.get_mem(pos) + return mem.clicker or "" + elseif topic == "time" then + local mem = techage.get_mem(pos) + return mem.time or 0 + else + return "unsupported" + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 144 then -- Player Name + local mem = techage.get_mem(pos) + return 0, mem.clicker + elseif topic == 149 then --time + local mem = techage.get_mem(pos) + return 0, {mem.time or 0} + else + return 2, "" + end + end, + } +) diff --git a/techage/logic/cart_detector.lua b/techage/logic/cart_detector.lua index 244e40f..99c12b6 100644 --- a/techage/logic/cart_detector.lua +++ b/techage/logic/cart_detector.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -151,6 +151,28 @@ techage.register_node({"techage:ta3_cartdetector_off", "techage:ta3_cartdetector return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 1 then + local node = minetest.get_node(pos) + local dir = minetest.facedir_to_dir(node.param2) + minecart.punch_cart(pos, nil, 1.6, dir) + return 0 + else + return 2 + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 142 then -- Binary State + local node = techage.get_node_lvm(pos) + if node.name == "techage:ta3_cartdetector_on" then + return 0, {1} + else + return 0, {0} + end + else + return 2, "" + end + end, on_node_load = function(pos) minetest.get_node_timer(pos):start(CYCLE_TIME) end, diff --git a/techage/logic/collector.lua b/techage/logic/collector.lua index d50a1e0..6083952 100644 --- a/techage/logic/collector.lua +++ b/techage/logic/collector.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2020 Joachim Stolberg + Copyright (C) 2017-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -24,6 +24,7 @@ local CYCLE_TIME = 1 local tStates = {stopped = 0, running = 0, standby = 1, blocked = 2, nopower = 3, fault = 4} local tDropdownPos = {["1 standby"] = 1, ["2 blocked"] = 2, ["3 nopower"] = 3, ["4 fault"] = 4} local lStates = {[0] = "stopped", "standby", "blocked", "nopower", "fault"} +local TaStates = {running = 1, blocked = 2, standby = 3, nopower = 4, fault = 5, stopped = 6} local function formspec(nvm, meta) nvm.poll_numbers = nvm.poll_numbers or {} @@ -200,13 +201,21 @@ minetest.register_craft({ techage.register_node({"techage:ta4_collector"}, { on_recv_message = function(pos, src, topic, payload) - if topic == "state" then + if topic == "state" then local nvm = techage.get_nvm(pos) return lStates[nvm.stored_state or 0] else return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 129 then + local nvm = techage.get_nvm(pos) + return 0, {TaStates[lStates[nvm.stored_state or 0]]} + else + return 2, "" + end + end, on_node_load = function(pos) minetest.get_node_timer(pos):start(CYCLE_TIME) end, diff --git a/techage/logic/detector.lua b/techage/logic/detector.lua index b0e709b..a7f66d0 100644 --- a/techage/logic/detector.lua +++ b/techage/logic/detector.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2020 Joachim Stolberg + Copyright (C) 2017-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -83,12 +83,21 @@ local function formspec(meta) "button_exit[2,2;3,1;exit;"..S("Save").."]" end -local function after_place_node(pos, placer) +local function after_place_node3(pos, placer) local meta = M(pos) local inv = meta:get_inventory() inv:set_size('cfg', 4) - logic.after_place_node(pos, placer, "techage:ta3_detector_off", NDEF(pos).description) - logic.infotext(meta, NDEF(pos).description) + logic.after_place_node(pos, placer, "techage:ta3_detector_off", S("TA3 Detector")) + logic.infotext(meta, S("TA3 Detector")) + meta:set_string("formspec", formspec(meta)) +end + +local function after_place_node4(pos, placer) + local meta = M(pos) + local inv = meta:get_inventory() + inv:set_size('cfg', 4) + logic.after_place_node(pos, placer, "techage:ta4_detector_off", S("TA4 Detector")) + logic.infotext(meta, S("TA4 Detector")) meta:set_string("formspec", formspec(meta)) end @@ -126,7 +135,7 @@ minetest.register_node("techage:ta3_detector_off", { "techage_filling_ta3.png^techage_frame_ta3.png^techage_appl_detector.png", }, - after_place_node = after_place_node, + after_place_node = after_place_node3, on_receive_fields = on_receive_fields, techage_set_numbers = techage_set_numbers, after_dig_node = after_dig_node, @@ -179,7 +188,7 @@ minetest.register_node("techage:ta4_detector_off", { "techage_filling_ta4.png^techage_frame_ta4.png^techage_appl_detector.png", }, - after_place_node = after_place_node, + after_place_node = after_place_node4, on_receive_fields = on_receive_fields, techage_set_numbers = techage_set_numbers, after_dig_node = after_dig_node, @@ -276,4 +285,21 @@ techage.register_node({"techage:ta4_detector_off", "techage:ta4_detector_on"}, { return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 6 then -- Detector Block Reset + local nvm = techage.get_nvm(pos) + nvm.counter = 0 + return 0 + else + return 2 + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 139 then + local nvm = techage.get_nvm(pos) + return 0, {nvm.counter or 0} + else + return 2, "" + end + end, }) diff --git a/techage/logic/light_detector.lua b/techage/logic/light_detector.lua new file mode 100755 index 0000000..4072f88 --- /dev/null +++ b/techage/logic/light_detector.lua @@ -0,0 +1,189 @@ +--[[ + + TechAge + ======= + + Copyright (C) 2019-2022 Joachim Stolberg + + AGPL v3 + See LICENSE.txt for more information + + Light Detector + +]]-- + +-- for lazy programmers +local M = minetest.get_meta +local S = techage.S +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end + +local logic = techage.logic +local CYCLE_TIME = 2 + +local function switch_off(pos) + local node = minetest.get_node(pos) + if node.name == "techage:ta3_lightdetector_on" then + logic.swap_node(pos, "techage:ta3_lightdetector_off") + logic.send_off(pos, M(pos)) + end +end + +local function switch_on(pos) + logic.swap_node(pos, "techage:ta3_lightdetector_on") + if logic.send_on(pos, M(pos)) then + minetest.after(1, switch_off, pos) + end +end + +local function node_timer(pos) + + local nvm = techage.get_nvm(pos) + + local trigger = nvm.mode or 7 + + local pos_above = {x = pos.x, y = pos.y + 1, z = pos.z} + if minetest.get_node_light(pos_above, nil) == nil then + switch_off(pos) + return true + end + + if minetest.get_node_light(pos_above, nil) > trigger then + switch_on(pos) + else + switch_off(pos) + end + return true +end + +local function formspec(meta, nvm) + local numbers = meta:get_string("numbers") or "" + local dropdown_label = "1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15" -- Has to be a cleaner way of doing this, but it's just easier this way + return "size[7.5,4]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "field[0.5,1;7,1;numbers;"..S("Insert destination node number(s)")..";"..numbers.."]" .. + "label[0.2,1.6;"..S("Send signal if light level is above:").."]".. + "dropdown[0.2,2.1;7.3,1;mode;"..dropdown_label.."; "..(nvm.mode or 7).."]".. + "button_exit[2,3.2;3,1;accept;"..S("accept").."]" +end + +local function on_receive_fields(pos, formname, fields, player) + if minetest.is_protected(pos, player:get_player_name()) then + return + end + + local meta = minetest.get_meta(pos) + local nvm = techage.get_nvm(pos) + + if fields.accept then + nvm.mode = tonumber(fields.mode) or 7 + if techage.check_numbers(fields.numbers, player:get_player_name()) then + meta:set_string("numbers", fields.numbers) + logic.infotext(M(pos), S("TA3 Light Detector")) + end + meta:set_string("formspec", formspec(meta, nvm)) + end +end + +local function techage_set_numbers(pos, numbers, player_name) + local meta = M(pos) + local res = logic.set_numbers(pos, numbers, player_name, S("TA3 Light Detector")) + meta:set_string("formspec", formspec(meta)) + return res +end + +local function after_dig_node(pos, oldnode, oldmetadata, digger) + techage.remove_node(pos, oldnode, oldmetadata) +end + +minetest.register_node("techage:ta3_lightdetector_off", { + description = S("TA3 Light Detector"), + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_lightdetector.png", + "techage_filling_ta3.png^techage_frame_ta3_top.png", + "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png^[transformR90", + }, + after_place_node = function(pos, placer) + local meta = M(pos) + local nvm = techage.get_nvm(pos) + logic.after_place_node(pos, placer, "techage:ta3_lightdetector_off", S("TA3 Light Detector")) + logic.infotext(meta, S("TA3 Light Detector")) + meta:set_string("formspec", formspec(meta, nvm)) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, + + on_receive_fields = on_receive_fields, + on_timer = node_timer, + techage_set_numbers = techage_set_numbers, + after_dig_node = after_dig_node, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2}, + is_ground_content = false, + sounds = default.node_sound_metal_defaults(), +}) + +minetest.register_node("techage:ta3_lightdetector_on", { + description = "TA3 Light Detector (On)", + tiles = { + -- up, down, right, left, back, front + "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_lightdetector_on.png", + "techage_filling_ta3.png^techage_frame_ta3_top.png", + "techage_filling_ta3.png^techage_frame_ta3_top.png^techage_appl_arrow.png^[transformR90", + }, + on_receive_fields = on_receive_fields, + on_timer = node_timer, + techage_set_numbers = techage_set_numbers, + after_dig_node = after_dig_node, + paramtype2 = "facedir", + groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + drop = "techage:ta3_lightdetector_off" +}) + +minetest.register_craft({ + output = "techage:ta3_lightdetector_off", + recipe = { + {"", "group:wood", "default:glass"}, + {"", "default:copper_ingot", "techage:vacuum_tube"}, + {"", "group:wood", "default:mese_crystal"}, + }, +}) + +techage.register_node({"techage:ta3_lightdetector_off", "techage:ta3_lightdetector_on"}, { + on_recv_message = function(pos, src, topic, payload) + if topic == "state" then + local node = techage.get_node_lvm(pos) + if node.name == "techage:ta3_lightdetector_on" then + return "on" + else + return "off" + end + elseif topic == "light_level" then -- Allow finding the specific light level + local pos_above = {x = pos.x, y = pos.y + 1, z = pos.z} + return minetest.get_node_light(pos_above, nil) + else + return "unsupported" + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 142 then -- Binary State + local node = techage.get_node_lvm(pos) + if node.name == "techage:ta3_lightdetector_on" then + return 0, {1} + else + return 0, {0} + end + elseif topic == 143 then -- Allow finding the specific light level + local pos_above = {x = pos.x, y = pos.y + 1, z = pos.z} + return 0, {minetest.get_node_light(pos_above, nil)} + else + return 2, "" + end + end, + on_node_load = function(pos) + minetest.get_node_timer(pos):start(CYCLE_TIME) + end, +}) diff --git a/techage/logic/logic_block.lua b/techage/logic/logic_block.lua index 0b83272..e15d652 100644 --- a/techage/logic/logic_block.lua +++ b/techage/logic/logic_block.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2021 Joachim Stolberg + Copyright (C) 2017-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -407,4 +407,29 @@ techage.register_node({"techage:ta3_logic2"}, { mem.ttl = techage.SystemTime + (nvm.blocking_time or 0) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + local mem = techage.get_mem(pos) + nvm.own_num = nvm.own_num or M(pos):get_string("node_number") + nvm.blocking_time = nvm.blocking_time or M(pos):get_float("blocking_time") + nvm.inp_tbl = nvm.inp_tbl or {} + + if src ~= nvm.own_num then + if topic == 1 and payload[1] == 1 then + debug(mem, "(inp) " .. src .. " = on") + nvm.inp_tbl[src] = "on" + return 0 + elseif topic == 1 and payload[1] == 0 then + debug(mem, "(inp) " .. src .. " = off") + nvm.inp_tbl[src] = "off" + return 0 + else + debug(mem, "(inp) invalid command") + return 2 + end + local t = math.max((mem.ttl or 0) - techage.SystemTime, 0.1) + minetest.get_node_timer(pos):start(t) + mem.ttl = techage.SystemTime + (nvm.blocking_time or 0) + end + end, }) diff --git a/techage/logic/lua_logic.lua b/techage/logic/lua_logic.lua index 57cc629..48e3418 100644 --- a/techage/logic/lua_logic.lua +++ b/techage/logic/lua_logic.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2020 Joachim Stolberg + Copyright (C) 2017-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -246,7 +246,19 @@ techage.register_node({"techage:ta3_logic"}, { end minetest.get_node_timer(pos):start(0.1) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 1 and payload[1] == 1 then + nvm.inp_tbl.inp = true + nvm.inp_tbl["n"..src] = true + return 0 + elseif topic == 1 and payload[1] == 0 then + nvm.inp_tbl.inp = false + nvm.inp_tbl["n"..src] = false + return 0 + else + return 2 + end + end, on_node_load = function(pos) - end, }) diff --git a/techage/logic/mba_detector.lua b/techage/logic/mba_detector.lua index 96cdd17..ab5d744 100644 --- a/techage/logic/mba_detector.lua +++ b/techage/logic/mba_detector.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2020 Joachim Stolberg + Copyright (C) 2017-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -92,6 +92,23 @@ techage.register_node({"techage:ta4_mbadetector"}, { return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 142 then -- Binary State + if minetest.compare_block_status then + if minetest.compare_block_status(pos, "active") then + return 0, {1} + else + return 0, {0} + end + else + local mem = techage.get_mem(pos) + local res = mem.gametime and mem.gametime > (minetest.get_gametime() - 2) + return 0, {res and 1 or 0} + end + else + return 2, "" + end + end, on_node_load = function(pos) minetest.get_node_timer(pos):start(1) end, diff --git a/techage/logic/node_detector.lua b/techage/logic/node_detector.lua index 7d3c89c..25f0db0 100644 --- a/techage/logic/node_detector.lua +++ b/techage/logic/node_detector.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2020 Joachim Stolberg + Copyright (C) 2017-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -189,20 +189,29 @@ minetest.register_craft({ techage.register_node({"techage:ta3_nodedetector_off", "techage:ta3_nodedetector_on"}, { on_recv_message = function(pos, src, topic, payload) - if topic == "name" then - local nvm = techage.get_nvm(pos) - return nvm.player_name or "" - elseif topic == "state" then + if topic == "state" then local node = techage.get_node_lvm(pos) if node.name == "techage:ta3_nodedetector_off" then - return "on" - else return "off" + else + return "on" end else return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 142 then + local node = techage.get_node_lvm(pos) + if node.name == "techage:ta3_nodedetector_off" then + return 0, {0} + else + return 0, {1} + end + else + return 2, "" + end + end, on_node_load = function(pos) minetest.get_node_timer(pos):start(CYCLE_TIME) end, diff --git a/techage/logic/player_detector.lua b/techage/logic/player_detector.lua index 791eb8d..f189185 100644 --- a/techage/logic/player_detector.lua +++ b/techage/logic/player_detector.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2020 Joachim Stolberg + Copyright (C) 2017-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -323,6 +323,22 @@ techage.register_node({ return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 144 then -- Player Name + local nvm = techage.get_nvm(pos) + return 0, nvm.player_name or "" + elseif topic == 142 then -- Binary State + local node = techage.get_node_lvm(pos) + if node.name == "techage:ta3_playerdetector_on" or + node.name == "techage:ta4_playerdetector_on" then + return 0, {1} + else + return 0, {0} + end + else + return 2, "" + end + end, on_node_load = function(pos) minetest.get_node_timer(pos):start(CYCLE_TIME) end, diff --git a/techage/logic/sequencer.lua b/techage/logic/sequencer.lua index e2c6005..1d5d936 100644 --- a/techage/logic/sequencer.lua +++ b/techage/logic/sequencer.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2020 Joachim Stolberg + Copyright (C) 2017-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -278,6 +278,28 @@ techage.register_node({"techage:ta3_sequencer"}, { return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 7 then -- TA3 Sequenzer + if payload[1] == 1 then + start_the_sequencer(pos) + return 0 + elseif payload[1] == 0 then + -- do not stop immediately + local nvm = techage.get_nvm(pos) + if not nvm.running then + nvm.endless = not (nvm.endless or false) + else + nvm.endless = false + end + return 0 + elseif payload[1] == 2 then + stop_the_sequencer(pos) + return 0 + end + end + return 2 + end, on_node_load = function(pos) local nvm = techage.get_nvm(pos) if nvm.running then diff --git a/techage/logic/sequencer2.lua b/techage/logic/sequencer2.lua index e051ab9..0151863 100644 --- a/techage/logic/sequencer2.lua +++ b/techage/logic/sequencer2.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2021 Joachim Stolberg + Copyright (C) 2017-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -30,6 +30,7 @@ local HELP = S("Syntax:\n") .. S(" - 'send ' (techage command)\n") .. S(" - 'goto ' (jump to another line)\n") .. S(" - 'stop' (stop the execution)\n") .. + S(" - 'nop' (do nothing)\n") .. S("\n") .. S("Example:\n") .. " -- move controller commands\n" .. @@ -108,7 +109,7 @@ local function compile(s, tRes) tCode[idx] = {next_idx = tonumber(cmnd2) or 1} elseif cmnd1 == "stop" then tCode[idx] = false - elseif cmnd1 == nil then + elseif cmnd1 == nil or cmnd1 == "nop" then tCode[idx] = {} end old_idx = idx @@ -290,18 +291,18 @@ minetest.register_craft({ }, }) -local INFO = [[Commands: 'goto ', 'stop']] +local INFO = [[Commands: 'goto ', 'stop', 'on', 'off']] techage.register_node({"techage:ta4_sequencer"}, { on_recv_message = function(pos, src, topic, payload) local nvm = techage.get_nvm(pos) - if topic == "goto" and not nvm.running then + if (topic == "goto" or topic == "on") and not nvm.running then local mem = techage.get_mem(pos) nvm.running = true mem.idx = tonumber(payload or 1) or 1 restart_timer(pos, 0.1) logic.infotext(M(pos), S("TA4 Sequencer"), S("running")) - elseif topic == "stop" then + elseif topic == "stop" or topic == "off" then nvm.running = false minetest.get_node_timer(pos):stop() logic.infotext(M(pos), S("TA4 Sequencer"), S("stopped")) @@ -311,4 +312,23 @@ techage.register_node({"techage:ta4_sequencer"}, { return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 13 then + if payload[1] ~= 0 and not nvm.running then + local mem = techage.get_mem(pos) + nvm.running = true + mem.idx = tonumber(payload or 1) or 1 + restart_timer(pos, 0.1) + logic.infotext(M(pos), S("TA4 Sequencer"), S("running")) + return 0 + elseif payload[1] == 0 then + nvm.running = false + minetest.get_node_timer(pos):stop() + logic.infotext(M(pos), S("TA4 Sequencer"), S("stopped")) + return 0 + end + end + return 2 + end, }) diff --git a/techage/logic/signallamp.lua b/techage/logic/signallamp.lua index 0a7ae1c..982bde2 100644 --- a/techage/logic/signallamp.lua +++ b/techage/logic/signallamp.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2020 Joachim Stolberg + Copyright (C) 2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -121,6 +121,19 @@ techage.register_node({"techage:signal_lamp_off", "techage:signal_lamp_on"}, { return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 1 and payload[1] == 1 then + local node = techage.get_node_lvm(pos) + switch_on(pos, node) + return 0 + elseif topic == 1 and payload[1] == 0 then + local node = techage.get_node_lvm(pos) + switch_off(pos, node) + return 0 + else + return 2 + end + end, }) minetest.register_craft({ diff --git a/techage/logic/signallamp_2x.lua b/techage/logic/signallamp_2x.lua index 793cca9..3692b30 100644 --- a/techage/logic/signallamp_2x.lua +++ b/techage/logic/signallamp_2x.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2021 Joachim Stolberg + Copyright (C) 2017-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -17,9 +17,9 @@ local M = minetest.get_meta local S = techage.S local OFF = 0 -local RED = 1 -local GREEN = 2 -local AMBER = 3 +local GREEN = 1 +local AMBER = 2 +local RED = 3 local WRENCH_MENU = { { @@ -139,6 +139,19 @@ techage.register_node({"techage:ta4_signallamp_2x"}, { lcdlib.update_entities(pos) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + nvm.lamp = nvm.lamp or {} + if topic == 3 then -- Signal Lamp + local num = math.min(payload[1] or 1, 2) + local color = math.min(payload[2] or 0, 3) + nvm.lamp[num] = color + lcdlib.update_entities(pos) + return 0 + else + return 2 + end + end, }) minetest.register_craft({ diff --git a/techage/logic/signallamp_4x.lua b/techage/logic/signallamp_4x.lua index 6482785..a098ba6 100644 --- a/techage/logic/signallamp_4x.lua +++ b/techage/logic/signallamp_4x.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2021 Joachim Stolberg + Copyright (C) 2017-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -17,9 +17,9 @@ local M = minetest.get_meta local S = techage.S local OFF = 0 -local RED = 1 -local GREEN = 2 -local AMBER = 3 +local GREEN = 1 +local AMBER = 2 +local RED = 3 local WRENCH_MENU = { { @@ -170,6 +170,19 @@ techage.register_node({"techage:ta4_signallamp_4x"}, { lcdlib.update_entities(pos) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + nvm.lamp = nvm.lamp or {} + if topic == 3 then -- Signal Lamp + local num = math.min(payload[1] or 1, 4) + local color = math.min(payload[2] or 0, 3) + nvm.lamp[num] = color + lcdlib.update_entities(pos) + return 0 + else + return 2 + end + end, }) minetest.register_craft({ diff --git a/techage/lua_controller/controller.lua b/techage/lua_controller/controller.lua index 68fe4df..01c7b05 100644 --- a/techage/lua_controller/controller.lua +++ b/techage/lua_controller/controller.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -654,4 +654,27 @@ techage.register_node({"techage:ta4_lua_controller"}, { return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local meta = minetest.get_meta(pos) + local number = meta:get_string("number") + + if topic == 1 and payload[1] == 1 then + set_input(pos, number, src, "on") + elseif topic == 1 and payload[1] == 0 then + set_input(pos, number, src, "off") + else + return 2 + end + return 0 + end, + on_beduino_request_data = function(pos, src, topic, payload) + local meta = minetest.get_meta(pos) + + if topic == 142 then + local running = meta:get_int("running") or STATE_STOPPED + return 0, {running} + else + return 2, "" + end + end, }) diff --git a/techage/lua_controller/sensorchest.lua b/techage/lua_controller/sensorchest.lua index 5a483b9..5ba2f1e 100644 --- a/techage/lua_controller/sensorchest.lua +++ b/techage/lua_controller/sensorchest.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -46,6 +46,13 @@ local function send_command(pos) end end +local function get_stack(pos, idx) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack("main", idx) + return stack:get_name(), stack:get_count() +end + local function get_stacks(pos) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -215,7 +222,7 @@ techage.register_node({"techage:ta4_sensor_chest"}, { elseif topic == "action" then local meta = minetest.get_meta(pos) local number = meta:get_string("node_number") - return PlayerActions[number][1], PlayerActions[number][2] + return (PlayerActions[number] or {})[1], (PlayerActions[number] or {})[2] elseif topic == "stacks" then return get_stacks(pos) elseif topic == "text" then @@ -226,6 +233,40 @@ techage.register_node({"techage:ta4_sensor_chest"}, { return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 66 then + local meta = minetest.get_meta(pos) + meta:set_string("text", tostring(payload)) + meta:set_string("formspec", formspec2(pos)) + return 0 + else + return 2 + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 131 then -- Chest State + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return 0, {techage.get_inv_state_num(inv, "main")} + elseif topic == 138 and payload[1] == 1 then -- Sensor Chests State (action) + local meta = minetest.get_meta(pos) + local number = meta:get_string("node_number") + local action = (PlayerActions[number] or {})[2] or "None" + return 0, {({put = 1, get = 2})[action] or 0} + elseif topic == 138 and payload[1] == 2 then -- Sensor Chests State (player name) + local meta = minetest.get_meta(pos) + local number = meta:get_string("node_number") + return 0, (PlayerActions[number] or {})[1] + elseif topic == 138 and payload[1] == 3 then -- Sensor Chests State (stack item name) + local name, _ = get_stack(pos, payload[2] or 1) + return 0, name + elseif topic == 138 and payload[1] == 4 then -- Sensor Chests State (stack item count) + local _, count = get_stack(pos, payload[2] or 1) + return 0, {count} + else + return 2, "" + end + end, }) minetest.register_craft({ diff --git a/techage/manuals/manual_ta3_DE.md b/techage/manuals/manual_ta3_DE.md index e44f9f7..4ccfcd2 100644 --- a/techage/manuals/manual_ta3_DE.md +++ b/techage/manuals/manual_ta3_DE.md @@ -661,11 +661,15 @@ Der Tür Controller II kann alle Arten von Blöcken entfernen und wieder setzen. Wird ein `on` / `off` Kommando an den Tür Controller II gesendet, entfernt bzw. setzt er die Blöcke ebenfalls. -Über ein `exchange` Kommando können einzelne Böcke gesetzt, entfernt, bzw. durch andere Blöcke ersetzt werden. Die Slot-Nummer des Inventars (1 .. 16) muss als payload übergeben werden, also: +Mit `$send_cmnd(node_number, "exchange", 2)` können einzelne Böcke gesetzt, entfernt, bzw. durch andere Blöcke aus dem Inventar ersetzt werden. -``` -$send_cmnd(node_number, "exchange", 2) -``` +Mit `$send_cmnd(node_number, "set", 2)` kann ein Block aus dem Inventory explizit gesetzt werden, sofern der Inventory Slot nicht leer ist. + +Mit `$send_cmnd(node_number, "dig", 2)` kann ein Block wieder entfernt werden, sofern der Inventory Slot leer ist. + +Mit `$send_cmnd(node_number, "get", 2)` wird der Name des gesetzten Blocks zurückgeliefert. + +Die Slot-Nummer des Inventars (1 .. 16) muss in allen drei Fällen als payload übergeben werden. Damit lassen sich auch ausfahrbare Treppen und ähnliches simulieren. @@ -679,7 +683,7 @@ Die Sounds können über das Menü und über ein Kommando ausgewählt und abgesp - Kommando `on` zum Abspielen eines Sounds - Kommando `sound ` zur Auswahl eines Sounds über den Index -- Kommando `gain ` zum Einstellen der Lautstärke über den `` Wert (0 bis 1.0). +- Kommando `gain ` zum Einstellen der Lautstärke über den `` Wert (1 bis 5). [ta3_soundblock|image] @@ -737,6 +741,14 @@ Soll die Suche auf bestimmte Spieler eingegrenzt werden, so können diese Spiele [ta3_playerdetector|image] +### TA3 Lichtdetektor + +Der Lichtdetektor sendet einen `on`-Kommando, wenn der Lichtpegel des darüber liegenden Blocks einen bestimmten Pegel überschreitet, der über das Rechtsklickmenü eingestellt werden kann. +Mit einen TA4 Lua Controller kann die genaue Lichtstärke mit $get_cmd(num, 'light_level') ermitteln werden. + +[ta3_lightdetector|image] + + ## TA3 Maschinen Bei TA3 existieren die gleichen Maschinen wie bei TA2, nur sind diese hier leistungsfähiger und benötigen Strom statt Achsenantrieb. @@ -865,4 +877,4 @@ Der Techage Schraubendreher dient als Ersatz für den normalen Schraubendreher. - Shift+Linksklick: Ausrichtung des angeklickten Blockes speichern - Shift+Rechtsklick: Die gespeicherte Ausrichtung auf den angeklickten Block anwenden -[ta3_screwdriver|image] \ No newline at end of file +[ta3_screwdriver|image] diff --git a/techage/manuals/manual_ta3_EN.md b/techage/manuals/manual_ta3_EN.md index b24434c..5e45494 100644 --- a/techage/manuals/manual_ta3_EN.md +++ b/techage/manuals/manual_ta3_EN.md @@ -654,11 +654,15 @@ The door controller is used to control the TA3 door/gate blocks. With the door c The Door Controller II can remove and set all types of blocks. To teach in the Door Controller II, the "Record" button must be pressed. Then all blocks that should be part of the door / gate must be clicked. Then the "Done" button must be pressed. Up to 16 blocks can be selected. The removed blocks are saved in the controller's inventory. The function of the controller can be tested manually using the "Remove" or "Set" buttons. If an `on` /`off` command is sent to the Door Controller II, it removes or sets the blocks as well. -Individual blocks can be set, removed or replaced by other blocks via an `exchange` command. The slot number of the inventory (1 .. 16) must be transferred as payload, i.e.: +With `$send_cmnd(node_number, "exchange", 2)` individual blocks can be set, removed or replaced by other blocks from the inventory. -``` -$send_cmnd(node_number, "exchange", 2) -``` +With `$send_cmnd(node_number, "set", 2)` a block from the inventory can be set explicitly, as long as the inventory slot is not empty. + +A block can be removed again with `$send_cmnd(node_number, "dig", 2)` if the inventory slot is empty. + +The name of the set block is returned with `$send_cmnd(node_number, "get", 2)`. + +The slot number of the inventory (1 .. 16) must be passed as payload in all three cases. This can also be used to simulate extendable stairs and the like. @@ -672,7 +676,7 @@ The sounds can be selected and played via the menu and via command. - Command `on` to play a sound - Command `sound ` to select a sound via the index -- Command `gain ` to adjust the volume via the `` value (0 to 1.0). +- Command `gain ` to adjust the volume via the `` value (1 to 5). [ta3_soundblock|image] @@ -730,6 +734,12 @@ If the search should be limited to specific players, these player names can also [ta3_playerdetector|image] +### TA3 Light Detector + +The light detector sends an `on` command if the light level of the block above exceeds a certain level, which can be set through the right-click menu. +If you have a TA4 Lua Controller, you can get the exact light level with $get_cmd(num, 'light_level') + +[ta3_lightdetector|image] ## TA3 Machines diff --git a/techage/manuals/manual_ta4_DE.md b/techage/manuals/manual_ta4_DE.md index 15e33cf..3d5cde5 100644 --- a/techage/manuals/manual_ta4_DE.md +++ b/techage/manuals/manual_ta4_DE.md @@ -550,6 +550,7 @@ Der TA4 Sequenzer unterstützt folgende techage Kommandos: - `goto ` Zu einer Kommandozeile springen und damit den Sequenzer starten - `stop` Den Sequenzer anhalten +- `on` und `off` als Alias für `goto 1` bzw. `stop` Das `goto` Kommando wird nur angenommen, wenn der Sequenzer gestoppt ist. @@ -843,6 +844,7 @@ Der TA4 Schieber besitzt zwei zusätzliche Kommandos für den Lua Controller: - `config` dient zur Konfiguration des Schiebers, analog zum manuellen Konfiguration über das Menü. Beispiel: `$send_cmnd(1234, "config", "default:dirt")` + Mit `$send_cmnd(1234, "config", "")` wird die Konfiguration gelöscht - `pull` dient zum Absetzen eines Auftrags an den Schieber: Beispiel: `$send_cmnd(1234, "pull", "default:dirt 8")` Als Nummer sind Werte von 1 bis 12 zulässig. Danach geht der Schieber wieder in den `stopped` Mode und sendet ein "off" Kommando zurück an den Sender des "pull" Kommandos. diff --git a/techage/manuals/manual_ta4_EN.md b/techage/manuals/manual_ta4_EN.md index d242b3c..a82e4d0 100644 --- a/techage/manuals/manual_ta4_EN.md +++ b/techage/manuals/manual_ta4_EN.md @@ -542,6 +542,7 @@ The TA4 sequencer supports the following techage commands: - `goto ` Jump to a command line and start the sequencer - `stop` Stop the sequencer +- `on` and `off` as aliases for `goto 1` resp. `stop` The `goto` command is only accepted when the sequencer is stopped. @@ -835,6 +836,7 @@ The TA4 pusher has two additional commands for the Lua controller: - `config` is used to configure the pusher, analogous to manual configuration via the menu. Example: `$send_cmnd(1234, "config", "default: dirt")` + With `$send_cmnd(1234, "config", "")` the configuration is deleted - `pull` is used to send an order to the pusher: Example: `$send_cmnd(1234, "pull", "default: dirt 8")` Values ​​from 1 to 12 are permitted as numbers. Then the pusher goes back to `stopped` mode and sends an" off "command back to the transmitter of the" pull "command. diff --git a/techage/manuals/ta4_lua_controller_EN.md b/techage/manuals/ta4_lua_controller_EN.md index 51bf2a7..a9c3315 100644 --- a/techage/manuals/ta4_lua_controller_EN.md +++ b/techage/manuals/ta4_lua_controller_EN.md @@ -374,7 +374,9 @@ Please note, that this is not a technical distinction, only a logical. | "count" | number of items | Read the total amount of TA4 chest items. An optional number as `add_data` is used to address only one inventory slot (1..8, from left to right). | | "itemstring" | item string of the given slot | Specific command for the TA4 8x2000 Chest to read the item type (technical name) of one chest slot, specified via `add_data` (1..8).
Example: s = $send_cmnd("223", "itemstring", 1) | | "output" | recipe output string,
e.g.: "default:glass" | Only for the Industrial Furnace. If no recipe is active, the command returns "unknown" | -| "input" | `` | Read a recipe from the TA4 Recipe Block. `` is the number of the recipe. The block return a list of recipe items. | +| "input" | \ | Read a recipe from the TA4 Recipe Block. `` is the number of the recipe. The block return a list of recipe items. | +| "name" | \ | Player name of the TA3/TA4 Player Detector or TA4 Button | +| "time" | number | Time in system ticks (norm. 100 ms) when the TA4 Button is clicked | @@ -390,14 +392,19 @@ Please note, that this is not a technical distinction, only a logical. | "red, "amber", "green", "off" | nil | set Signal Tower color | | "red, "amber", "green", "off" | lamp number (1..4) | Set the signal lamp color. Valid for "TA4 2x Signal Lamp" and "TA4 4x Signal Lamp" | | "port" | string
`=on/off` | Enable/disable a Distributor filter slot..
Example: `"yellow=on"`
colors: red, green, blue, yellow | +| "config" | "\ \" | Configure a Distributor filter slot, like: "red default:dirt dye:blue" | | "text" | text string | Text to be used for the Sensor Chest menu | | "reset" | nil | Reset the item counter of the TA4 Item Detector block | | "pull" | item string | Start the TA4 pusher to pull/push items.
Example: `default:dirt 8` | | "config" | item string | Configure the TA4 pusher.
Example: `wool:blue` | -| "exchange" | inventory slot number | place/remove/exchange an block by means of the TA3 Door Controller II (techage:ta3_doorcontroller2) | +| "exchange" | inventory slot number | TA3 Door Controller II (techage:ta3_doorcontroller2)
Exchange a block
*idx* is the inventory slot number (1..n) of/for the block to be exchanged | +| "set" | inventory slot number | TA3 Door Controller II (techage:ta3_doorcontroller2)
Set/add a block
*idx* is the inventory slot number (1..n) with the block to be set | +| "dig" | inventory slot number | TA3 Door Controller II (techage:ta3_doorcontroller2)
Dig/remove a block
*idx* is the empty inventory slot number (1..n) for the block | | "a2b" | nil | TA4 Move Controller command to move the block(s) from position A to B | | "b2a" | nil | TA4 Move Controller command to move the block(s) from position B to A | | "move" | nil | TA4 Move Controller command to move the block(s) to the opposite position | +| "move2" | x,y,z | TA4 Move Controller command to move the block(s) by the given
x/y/z-distance. Valid ranges for x, y, and z are -100 to 100. | +| "reset" | nil | Reset TA4 Move Controller (move block(s) to start position) | | "left" | nil | TA4 Turn Controller command to turn the block(s) to the left | | "right" | nil | TA4 Turn Controller command to turn the block(s) to the right | | "uturn" | nil | TA4 Turn Controller command to turn the block(s) 180 degrees | diff --git a/techage/manuals/ta_iom.md b/techage/manuals/ta_iom.md new file mode 100644 index 0000000..7d6d9c7 --- /dev/null +++ b/techage/manuals/ta_iom.md @@ -0,0 +1,85 @@ +# Techage/Beduino I/O Module + +I/O modules support the following functions: + +### event + +Every signal that is sent to an I/O module triggers an event on the controller. +Events can be queried using the `event()` function. +If the function returns the value `1`, one or more signals have been received. +Calling `event()` resets the event flag. + +```c +event() +``` + +### read + +Read a value from a remote techage block. + +- *port* is the I/O module port number +- *cmnd* is the command, like `IO_STATE` (see example code "ta_cmnd.c") + +```c +read(port, cmnd) +``` + +### send_cmnd + +Send a command to a techage block (see [commands](https://github.com/joe7575/beduino/blob/main/BEPs/bep-005_ta_cmnd.md)). + +- *port* is the I/O module port number +- *topic* is a number from the list of [Beduino commands](https://github.com/joe7575/beduino/blob/main/BEPs/bep-005_ta_cmnd.md) +- *payload* is an array or a string with additional information, depending on the command. If no additional commands are required, "" can be used. + +```c +send_cmnd(port, topic, payload) +``` + +### request_data + +Request information from a techage block (see [commands](https://github.com/joe7575/beduino/blob/main/BEPs/bep-005_ta_cmnd.md)). + +- *port* is the I/O module port number +- *topic* is a number from the list of [Beduino commands](https://github.com/joe7575/beduino/blob/main/BEPs/bep-005_ta_cmnd.md) +- *payload* is an array or a string with additional information, depending on the command. If no additional commands are required, "" can be used. +- *resp* is an array for the response data. The array must be defined large enough to hold the response data. + +```c +request_data(port, topic, payload, resp) +``` + +## Functions for TA4 Display and TA4 Display XL + +### clear_screen + +Clear the display. + +- *port* is the I/O module port number + +```c +clear_screen(port) +``` + +### append_line + +Add a new line to the display. +- *port* is the I/O module port number +- *text* is the text for one line + +```c +append_line(port, text) +``` + + +### write_line + +Overwrite a text line with the given string. + +- *port* is the I/O module port number +- *row* ist the display line/row (1-5) +- *text* is the text for one line + +```c +write_line(port, row, text) +``` diff --git a/techage/manuals/ta_kvstore.md b/techage/manuals/ta_kvstore.md new file mode 100644 index 0000000..ddee165 --- /dev/null +++ b/techage/manuals/ta_kvstore.md @@ -0,0 +1,78 @@ +# Techage/Beduino Key/Value Store + +The key/value store simplifies the handling/comparison of strings. + +The following example shows the use of the Key/Value Store, here to check the names from the Player Detector: + +```c +import "ta_kvstore.c" +import "ta_iom.c" + +var s[16]; + +func init() { + // Init and fill-up the k/v store + ta_kv_init(); + ta_kv_add("singleplayer", 1); + ta_kv_add("Tom", 2); + ta_kv_add("Betty", 3); + ta_kv_add("Joe", 4); +} + +func loop() { + var val; + + if(event()) { // Signal from player detector received + request_data(5, 144, "", s); // Request player name from player detector + val = ta_kv_get(s); // Read value for the given name in 's' + if(val == 1) { + // do A... + } else if(val == 2) { + // do B... + } else if(val == 3) { + // do C... + } + } +} +``` + + + +Each controller has a key/value store that must be initialized via `ta_kv_init()` and filled via `ta_kv_add` before it can be used. + +### ta_kv_init + +Initializes the key/value store. Has to be called once at the beginning. + +```c +ta_kv_init() +``` + + + +### ta_kv_add + +Add a new key/value pair to the store. + +- *key_str* is the string +- *value* is the value to be stored, which can be read again using the key string + +```c + ta_kv_add(key_str, value) +``` + + + +### ta_kv_get + +Read a value from thre store. + +- *key_str* is the string + +The function returns 0, if *key_str* is unknown. + +```c +ta_kv_get(key_str) +``` + + diff --git a/techage/manuals/toc_DE.md b/techage/manuals/toc_DE.md index 36fc807..7d02fb9 100644 --- a/techage/manuals/toc_DE.md +++ b/techage/manuals/toc_DE.md @@ -123,6 +123,7 @@ - [TA3 Wagen Detektor / Cart Detector](./manual_ta3_DE.md#ta3-wagen-detektor--cart-detector) - [TA3 Block Detektor / Node Detector](./manual_ta3_DE.md#ta3-block-detektor--node-detector) - [TA3 Spieler Detektor / Player Detector](./manual_ta3_DE.md#ta3-spieler-detektor--player-detector) + - [TA3 Lichtdetektor](./manual_ta3_DE.md#ta3-lichtdetektor) - [TA3 Maschinen](./manual_ta3_DE.md#ta3-maschinen) - [TA3 Schieber / Pusher](./manual_ta3_DE.md#ta3-schieber--pusher) - [TA3 Verteiler / Distributor](./manual_ta3_DE.md#ta3-verteiler--distributor) diff --git a/techage/manuals/toc_EN.md b/techage/manuals/toc_EN.md index 705a0a2..bb5becf 100644 --- a/techage/manuals/toc_EN.md +++ b/techage/manuals/toc_EN.md @@ -123,6 +123,7 @@ - [TA3 Cart Detector](./manual_ta3_EN.md#ta3-cart-detector) - [TA3 Block Detector](./manual_ta3_EN.md#ta3-block-detector) - [TA3 Player Detector](./manual_ta3_EN.md#ta3-player-detector) + - [TA3 Light Detector](./manual_ta3_EN.md#ta3-light-detector) - [TA3 Machines](./manual_ta3_EN.md#ta3-machines) - [TA3 Pusher](./manual_ta3_EN.md#ta3-pusher) - [TA3 Distributor](./manual_ta3_EN.md#ta3-distributor) diff --git a/techage/move_controller/doorcontroller.lua b/techage/move_controller/doorcontroller.lua index f859290..2b99ad7 100644 --- a/techage/move_controller/doorcontroller.lua +++ b/techage/move_controller/doorcontroller.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2020 Joachim Stolberg + Copyright (C) 2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -124,6 +124,17 @@ techage.register_node({"techage:ta3_doorcontroller"}, { swap_door_nodes(pos, false) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 1 and payload[1] == 1 then + swap_door_nodes(pos, true) + return 0 + elseif topic == 1 and payload[1] == 0 then + swap_door_nodes(pos, false) + return 0 + else + return 2 + end + end, }) minetest.register_craft({ diff --git a/techage/move_controller/doorcontroller2.lua b/techage/move_controller/doorcontroller2.lua index 0a7f458..48aa46d 100644 --- a/techage/move_controller/doorcontroller2.lua +++ b/techage/move_controller/doorcontroller2.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2020-2021 Joachim Stolberg + Copyright (C) 2020-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -17,28 +17,16 @@ local M = minetest.get_meta local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end local S = techage.S +local MP = minetest.get_modpath("techage") +local flylib = dofile(MP .. "/basis/fly_lib.lua") local logic = techage.logic local MarkedNodes = {} -- t[player] = {{entity, pos},...} local CurrentPos -- to mark punched entities -local RegisteredNodes = {} -- to be checked before removed/placed local function is_simple_node(name) - -- special handling - if RegisteredNodes[name] ~= nil then - return RegisteredNodes[name] - end - local ndef = minetest.registered_nodes[name] - if not ndef or name == "air" then return true end - if ndef.groups and ndef.groups.techage_door == 1 then return true end - - -- don't remove nodes with some intelligence or undiggable nodes - if ndef.drop == "" then return false end - if ndef.diggable == false then return false end - if ndef.after_dig_node then return false end - - return true + return techage.can_dig_node(name, ndef) end local function unmark_position(name, pos) @@ -94,7 +82,6 @@ minetest.register_entity(":techage:marker", { "techage_cube_mark.png", "techage_cube_mark.png", }, - --use_texture_alpha = true, physical = false, visual_size = {x = 1.1, y = 1.1}, collisionbox = {-0.55,-0.55,-0.55, 0.55,0.55,0.55}, @@ -154,11 +141,11 @@ local function exchange_node(pos, item, param2) local node = minetest.get_node_or_nil(pos) if node and is_simple_node(node.name) then if item and item:get_name() ~= "" and minetest.registered_nodes[item:get_name()] then - minetest.swap_node(pos, {name = item:get_name(), param2 = param2}) + flylib.exchange_node(pos, item:get_name(), param2) else - minetest.remove_node(pos) + flylib.remove_node(pos) end - if node.name ~= "air" then + if not techage.is_air_like(node.name) then return ItemStack(node.name), node.param2 else return ItemStack(), nil @@ -167,7 +154,7 @@ local function exchange_node(pos, item, param2) return item, param2 end -local function exchange_nodes(pos, nvm, slot) +local function exchange_nodes(pos, nvm, slot, force) local meta = M(pos) local inv = meta:get_inventory() @@ -179,9 +166,14 @@ local function exchange_nodes(pos, nvm, slot) for idx = (slot or 1), (slot or 16) do local pos = nvm.pos_list[idx] + local item = item_list[idx] if pos then - item_list[idx], nvm.param2_list[idx] = exchange_node(pos, item_list[idx], nvm.param2_list[idx]) - res = true + if (force == nil) + or (force == "dig" and item:get_count() == 0) + or (force == "set" and item:get_count() > 0) then + item_list[idx], nvm.param2_list[idx] = exchange_node(pos, item, nvm.param2_list[idx]) + res = true + end end end @@ -189,6 +181,14 @@ local function exchange_nodes(pos, nvm, slot) return res end +local function get_node_name(nvm, slot) + local pos = nvm.pos_list[slot] + if pos then + return techage.get_node_lvm(pos).name + end + return "unknown" +end + local function show_nodes(pos) local nvm = techage.get_nvm(pos) if not nvm.is_on then @@ -342,9 +342,42 @@ techage.register_node({"techage:ta3_doorcontroller2"}, { elseif topic == "exchange" then local nvm = techage.get_nvm(pos) return exchange_nodes(pos, nvm, tonumber(payload)) + elseif topic == "set" then + local nvm = techage.get_nvm(pos) + return exchange_nodes(pos, nvm, tonumber(payload), "set") + elseif topic == "dig" then + local nvm = techage.get_nvm(pos) + return exchange_nodes(pos, nvm, tonumber(payload), "dig") + elseif topic == "get" then + local nvm = techage.get_nvm(pos) + return get_node_name(nvm, tonumber(payload)) end return false end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 1 and payload[1] == 1 then + return hide_nodes(pos) and 0 or 3 + elseif topic == 1 and payload[1] == 0 then + return show_nodes(pos) and 0 or 3 + elseif topic == 9 and payload[1] == 0 then -- Exchange Block + local nvm = techage.get_nvm(pos) + return exchange_nodes(pos, nvm, payload[2] or 1) and 0 or 3 + elseif topic == 9 and payload[1] == 1 then -- Set Block + local nvm = techage.get_nvm(pos) + return exchange_nodes(pos, nvm, payload[2] or 1, "set") and 0 or 3 + elseif topic == 9 and payload[1] == 2 then -- Dig Block + local nvm = techage.get_nvm(pos) + return exchange_nodes(pos, nvm, payload[2] or 1, "dig") and 0 or 3 + end + return 2 + end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 147 then -- Get Name + local nvm = techage.get_nvm(pos) + return 0, get_node_name(nvm, payload[1] or 1) + end + return 2, "" + end, on_node_load = function(pos) local meta = M(pos) local nvm = techage.get_nvm(pos) @@ -387,12 +420,6 @@ minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) end end) -function logic.register_doorcontroller_nodes(node_names) - for _,name in ipairs(node_names or {}) do - RegisteredNodes[name] = true - end -end - local Doors = { "doors:door_steel", "doors:prison_door", @@ -411,7 +438,8 @@ local Doors = { for _, name in ipairs(Doors) do for _, postfix in ipairs({"a", "b", "c", "d"}) do - logic.register_doorcontroller_nodes({name .. "_" .. postfix}) + techage.register_simple_nodes({name .. "_" .. postfix}, true) + flylib.protect_door_from_being_opened(name .. "_" .. postfix) end end @@ -424,8 +452,7 @@ local ProtectorDoors = { for _, name in ipairs(ProtectorDoors) do for _, postfix in ipairs({"b_1", "b_2", "t_1", "t_2"}) do - logic.register_doorcontroller_nodes({name .. "_" .. postfix}) + techage.register_simple_nodes({name .. "_" .. postfix}, true) + flylib.protect_door_from_being_opened(name .. "_" .. postfix) end end - -logic.SimpleNodes = RegisteredNodes diff --git a/techage/move_controller/flycontroller.lua b/techage/move_controller/flycontroller.lua index 7bdf96c..4f1c7ed 100644 --- a/techage/move_controller/flycontroller.lua +++ b/techage/move_controller/flycontroller.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2020-2021 Joachim Stolberg + Copyright (C) 2020-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -228,6 +228,33 @@ techage.register_node({"techage:ta5_flycontroller"}, { end return false end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 11 then + if payload[1] == 1 then + nvm.moveBA = true + nvm.running = true + return fly.move_to_other_pos(pos, false) and 0 or 3 + elseif payload[1] == 2 then + nvm.moveBA = false + nvm.running = true + return fly.move_to_other_pos(pos, true) and 0 or 3 + elseif payload[1] == 3 then + nvm.moveBA = nvm.moveBA == false + nvm.running = true + return fly.move_to_other_pos(pos, nvm.moveBA == false) and 0 or 3 + end + else + return 2 + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 129 then + return 0, {nvm.running and 1 or 6} + end + return 2, "" + end, }) minetest.register_craft({ diff --git a/techage/move_controller/movecontroller.lua b/techage/move_controller/movecontroller.lua index ab000ec..c6b3ecc 100644 --- a/techage/move_controller/movecontroller.lua +++ b/techage/move_controller/movecontroller.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2020-2021 Joachim Stolberg + Copyright (C) 2020-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -62,11 +62,30 @@ local WRENCH_MENU = { tooltip = S("Y-offset for non-player objects like vehicles (-0.5 to 0.5)"), default = "0.0", }, + { + type = "dropdown", + choices = "A-B / B-A,move xyz", + name = "opmode", + label = S("Operational mode"), + tooltip = S("Switch to the remote controlled 'move xyz' mode"), + default = "A-B / B-A", + }, } local function formspec(nvm, meta) local status = meta:get_string("status") local path = meta:contains("path") and meta:get_string("path") or "0,3,0" + local buttons + if meta:get_string("opmode") == "move xyz" then + buttons = "field[0.4,2.5;3.8,1;path;" .. S("Move distance") .. ";" .. path .. "]" .. + "button_exit[4.1,2.2;3.8,1;move2;" .. S("Move") .. "]" .. + "button_exit[0.1,3.3;3.8,1;reset;" .. S("Reset") .. "]" + else + buttons = "field[0.4,2.5;3.8,1;path;" .. S("Move distance (A to B)") .. ";" .. path .. "]" .. + "button_exit[0.1,3.3;3.8,1;moveAB;" .. S("Move A-B") .. "]" .. + "button_exit[4.1,3.3;3.8,1;moveBA;" .. S("Move B-A") .. "]" .. + "button[4.1,2.2;3.8,1;store;" .. S("Store") .. "]" + end return "size[8,5]" .. default.gui_bg .. default.gui_bg_img .. @@ -76,10 +95,7 @@ local function formspec(nvm, meta) techage.wrench_image(7.4, -0.05) .. "button[0.1,0.8;3.8,1;record;" .. S("Record") .. "]" .. "button[4.1,0.8;3.8,1;done;" .. S("Done") .. "]" .. - "field[0.4,2.5;3.8,1;path;" .. S("Move distance (A to B)") .. ";" .. path .. "]" .. - "button[4.1,2.2;3.8,1;store;" .. S("Store") .. "]" .. - "button_exit[0.1,3.3;3.8,1;moveAB;" .. S("Move A-B") .. "]" .. - "button_exit[4.1,3.3;3.8,1;moveBA;" .. S("Move B-A") .. "]" .. + buttons .. "label[0.3,4.3;" .. status .. "]" end @@ -163,9 +179,30 @@ minetest.register_node("techage:ta4_movecontroller", { mark.stop(name) end meta:set_string("formspec", formspec(nvm, meta)) + elseif fields.move2 then + if fly.to_vector(fields.path or "", MAX_DIST) then + meta:set_string("path", fields.path) + end + local line = fly.to_vector(meta:get_string("path")) + if line then + nvm.running = true + fly.move_to(pos, line) + end + elseif fields.reset then + nvm.running = true + fly.reset_move(pos) end end, + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not clicker or minetest.is_protected(pos, clicker:get_player_name()) then + return + end + local meta = M(pos) + local nvm = techage.get_nvm(pos) + meta:set_string("formspec", formspec(nvm, meta)) + end, + after_dig_node = function(pos, oldnode, oldmetadata, digger) local name = digger:get_player_name() mark.unmark_all(name) @@ -185,25 +222,80 @@ local INFO = [[Commands: 'state', 'a2b', 'b2a', 'move']] techage.register_node({"techage:ta4_movecontroller"}, { on_recv_message = function(pos, src, topic, payload) local nvm = techage.get_nvm(pos) + local move_xyz = M(pos):get_string("opmode") == "move xyz" if topic == "info" then return INFO elseif topic == "state" then return nvm.running and "running" or "stopped" - elseif topic == "a2b" then + elseif not move_xyz and topic == "a2b" then nvm.moveBA = true nvm.running = true return fly.move_to_other_pos(pos, false) - elseif topic == "b2a" then + elseif not move_xyz and topic == "b2a" then nvm.moveBA = false nvm.running = true return fly.move_to_other_pos(pos, true) - elseif topic == "move" then + elseif move_xyz and topic == "move" then nvm.moveBA = nvm.moveBA == false nvm.running = true return fly.move_to_other_pos(pos, nvm.moveBA == false) + elseif move_xyz and topic == "move2" then + local line = fly.to_vector(payload) + if line then + nvm.running = true + nvm.controller_mode = true + return fly.move_to(pos, line) + end + return false + elseif topic == "reset" then + nvm.running = true + nvm.controller_mode = true + return fly.reset_move(pos) end return false end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + local move_xyz = M(pos):get_string("opmode") == "move xyz" + --print("on_beduino_receive_cmnd", P2S(pos), move_xyz, topic, payload[1]) + if not move_xyz and topic == 11 then + if payload[1] == 1 then + nvm.moveBA = true + nvm.running = true + return fly.move_to_other_pos(pos, false) and 0 or 3 + elseif payload[1] == 2 then + nvm.moveBA = false + nvm.running = true + return fly.move_to_other_pos(pos, true) and 0 or 3 + elseif payload[1] == 3 then + nvm.moveBA = nvm.moveBA == false + nvm.running = true + return fly.move_to_other_pos(pos, nvm.moveBA == false) and 0 or 3 + end + elseif move_xyz and topic == 18 then -- move xyz + local line = { + x = techage.in_range(techage.beduino_signed_var(payload[1]), -10, 10), + y = techage.in_range(techage.beduino_signed_var(payload[2]), -10, 10), + z = techage.in_range(techage.beduino_signed_var(payload[3]), -10, 10), + } + nvm.running = true + nvm.controller_mode = true + return fly.move_to(pos, line) and 0 or 3 + elseif move_xyz and topic == 19 then -- reset + nvm.running = true + nvm.controller_mode = true + return fly.reset_move(pos) and 0 or 3 + else + return 2 + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 129 then + return 0, {nvm.running and 1 or 6} + end + return 2, "" + end, }) minetest.register_craft({ diff --git a/techage/move_controller/soundblock.lua b/techage/move_controller/soundblock.lua index 24ab6fd..bafcbb2 100644 --- a/techage/move_controller/soundblock.lua +++ b/techage/move_controller/soundblock.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2021 Joachim Stolberg + Copyright (C) 2021-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -44,6 +44,18 @@ local function formspec(meta) "button[2.5,7.2;3,1;play;" .. S("Play") .. "]" end +local function play_predefined_sound(pos) + local mem = techage.get_mem(pos) + if not mem.blocking_time or (mem.blocking_time < minetest.get_gametime()) then + local idx = M(pos):get_int("idx") + local ogg = techage.OggFileList[idx or 1] or techage.OggFileList[1] + local gain = M(pos):get_int("gain") + play_sound(pos, ogg, gain) + mem.blocking_time = minetest.get_gametime() + 2 + return true + end +end + minetest.register_node("techage:ta3_soundblock", { description = S("TA3 Sound Block"), tiles = { @@ -94,23 +106,32 @@ techage.register_node({"techage:ta3_soundblock"}, { if topic == "info" then return INFO elseif topic == "on" then - local mem = techage.get_mem(pos) - if not mem.blocking_time or (mem.blocking_time < minetest.get_gametime()) then - local idx = M(pos):get_int("idx") - local ogg = techage.OggFileList[idx or 1] or techage.OggFileList[1] - local gain = M(pos):get_float("gain") - play_sound(pos, ogg, gain) - mem.blocking_time = minetest.get_gametime() + 2 - return true - end + play_predefined_sound(pos) elseif topic == "sound" then - M(pos):get_int("idx", tonumber(payload or 1) or 1) + M(pos):set_int("idx", tonumber(payload or 1) or 1) elseif topic == "gain" then - M(pos):get_int("gain", tonumber(payload or 1) or 1) + M(pos):set_int("gain", tonumber(payload or 1) or 1) else return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + if topic == 1 then + if payload[1] == 0 then + play_predefined_sound(pos) + return 0 + end + elseif topic == 14 then + if payload[1] == 1 then + M(pos):set_int("gain", payload[2]) + return 0 + elseif payload[1] == 2 then + M(pos):set_int("idx", payload[2]) + return 0 + end + end + return 2 -- unknown or invalid topic + end, on_node_load = function(pos) local meta = M(pos) meta:set_string("formspec", formspec(meta)) diff --git a/techage/move_controller/turncontroller.lua b/techage/move_controller/turncontroller.lua index a41fedf..33a3b56 100644 --- a/techage/move_controller/turncontroller.lua +++ b/techage/move_controller/turncontroller.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2020-2021 Joachim Stolberg + Copyright (C) 2020-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -83,20 +83,24 @@ minetest.register_node("techage:ta4_turncontroller", { meta:set_string("formspec", formspec(nvm, meta)) elseif fields.left then meta:set_string("status", "") - local new_posses = fly.rotate_nodes(pos, nvm.lpos, "l") - if new_posses then - nvm.lpos = new_posses - local name = player:get_player_name() - mark.stop(name) + if nvm.lpos then + local new_posses = fly.rotate_nodes(pos, nvm.lpos, "l") + if new_posses then + nvm.lpos = new_posses + local name = player:get_player_name() + mark.stop(name) + end end meta:set_string("formspec", formspec(nvm, meta)) elseif fields.right then meta:set_string("status", "") - local new_posses = fly.rotate_nodes(pos, nvm.lpos, "r") - if new_posses then - nvm.lpos = new_posses - local name = player:get_player_name() - mark.stop(name) + if nvm.lpos then + local new_posses = fly.rotate_nodes(pos, nvm.lpos, "r") + if new_posses then + nvm.lpos = new_posses + local name = player:get_player_name() + mark.stop(name) + end end meta:set_string("formspec", formspec(nvm, meta)) end @@ -152,6 +156,43 @@ techage.register_node({"techage:ta4_turncontroller"}, { end return false end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 12 then + if payload[1] == 1 then + local nvm = techage.get_nvm(pos) + local new_posses = fly.rotate_nodes(pos, nvm.lpos, "l") + if new_posses then + nvm.lpos = new_posses + return 0 + end + return 3 + elseif payload[1] == 2 then + local nvm = techage.get_nvm(pos) + local new_posses = fly.rotate_nodes(pos, nvm.lpos, "r") + if new_posses then + nvm.lpos = new_posses + return 0 + end + return 3 + elseif payload[1] == 3 then + local nvm = techage.get_nvm(pos) + local new_posses = fly.rotate_nodes(pos, nvm.lpos, "r") + if new_posses then + nvm.lpos = new_posses + new_posses = fly.rotate_nodes(pos, nvm.lpos, "r") + if new_posses then + nvm.lpos = new_posses + return 0 + end + end + return 3 + end + return 2 + else + return 2 + end + end, }) minetest.register_craft({ diff --git a/techage/oil/drillbox.lua b/techage/oil/drillbox.lua index deec9fb..63b9c92 100644 --- a/techage/oil/drillbox.lua +++ b/techage/oil/drillbox.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -149,7 +149,7 @@ local function drilling(pos, crd, nvm, inv) inv:remove_item("src", ItemStack("techage:oil_drillbit")) nvm.drill_pos.y = nvm.drill_pos.y-1 crd.State:keep_running(pos, nvm, COUNTDOWN_TICKS) - elseif techage.can_node_dig(node, ndef) then + elseif techage.can_dig_node(node.name, ndef) then local drop_name = techage.dropped_node(node, ndef) if drop_name then local item = ItemStack(drop_name) @@ -255,6 +255,12 @@ local tubing = { on_recv_message = function(pos, src, topic, payload) return CRD(pos).State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return CRD(pos).State:on_beduino_request_data(pos, topic, payload) + end, on_node_load = function(pos, node) CRD(pos).State:on_node_load(pos) local nvm = techage.get_nvm(pos) diff --git a/techage/oil/pumpjack.lua b/techage/oil/pumpjack.lua index 7088107..ff66028 100644 --- a/techage/oil/pumpjack.lua +++ b/techage/oil/pumpjack.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -186,6 +186,24 @@ local tubing = { return CRD(pos).State:on_receive_message(pos, topic, payload) end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 134 then -- Load + local storage_pos = M(pos):get_string("storage_pos") + if storage_pos ~= "" then + local amount, capa = techage.explore.get_oil_amount(P(storage_pos)) + if amount and capa and capa > 0 then + if payload[1] == 1 then + return 0, {techage.power.percent(capa or 0, amount or 0)} + else + return 0, {math.min(amount or 0, 65535)} + end + end + end + return 2 + else + return CRD(pos).State:on_beduino_request_data(pos, topic, payload) + end + end, on_node_load = function(pos, node) CRD(pos).State:on_node_load(pos) if node.name == "techage:ta3_pumpjack_act" then diff --git a/techage/oil/reboiler.lua b/techage/oil/reboiler.lua index 51cdc41..a78d7fd 100644 --- a/techage/oil/reboiler.lua +++ b/techage/oil/reboiler.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -254,15 +254,6 @@ liquid.register_nodes({"techage:ta3_reboiler", "techage:ta3_reboiler_on"}, Pipe, power.register_nodes({"techage:ta3_reboiler", "techage:ta3_reboiler_on"}, Cable, "con") techage.register_node({"techage:ta3_reboiler", "techage:ta3_reboiler_on"}, { - on_recv_message = function(pos, src, topic, payload) - local nvm = techage.get_nvm(pos) - if topic == "state" then - nvm.state = nvm.state or techage.STOPPED - return techage.StateStrings[nvm.state] - else - return "unsupported" - end - end, on_node_load = function(pos, node) if node.name == "techage:ta3_reboiler_on" then play_sound(pos) diff --git a/techage/power/power_line.lua b/techage/power/power_line.lua index 39c92cc..e5e5f2c 100644 --- a/techage/power/power_line.lua +++ b/techage/power/power_line.lua @@ -20,11 +20,13 @@ local Cable = techage.ElectricCable local power = networks.power local function can_dig(pos, digger) - if M(pos):get_string("owner") == digger:get_player_name() then - return true - end - if minetest.check_player_privs(digger:get_player_name(), "powerline") then - return true + if digger and digger:is_player() then + if M(pos):get_string("owner") == digger:get_player_name() then + return true + end + if minetest.check_player_privs(digger:get_player_name(), "powerline") then + return true + end end return false end diff --git a/techage/power/powerswitch.lua b/techage/power/powerswitch.lua index ede50c3..95378ab 100644 --- a/techage/power/powerswitch.lua +++ b/techage/power/powerswitch.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -255,6 +255,36 @@ techage.register_node({"techage:powerswitch", "techage:powerswitch_on", return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local node = techage.get_node_lvm(pos) + if topic == 1 and payload[1] == 1 and node.name == "techage:powerswitch" then + switch_on(pos, node, nil, "techage:powerswitch_on") + return 0 + elseif topic == 1 and payload[1] == 1 and node.name == "techage:powerswitchsmall" then + switch_on(pos, node, nil, "techage:powerswitchsmall_on") + return 0 + elseif topic == 1 and payload[1] == 0 and node.name == "techage:powerswitch_on" then + switch_off(pos, node, nil, "techage:powerswitch") + return 0 + elseif topic == 1 and payload[1] == 0 and node.name == "techage:powerswitchsmall_on" then + switch_off(pos, node, nil, "techage:powerswitchsmall") + return 0 + else + return 2 + end + end, + on_beduino_request_data = function(pos, src, topic, payload) + local node = techage.get_node_lvm(pos) + if topic == 142 then + if node.name == "techage:powerswitch_on" or + node.name == "techage:powerswitchsmall_on" then + return 0, {1} + end + return 0, {0} + else + return 2, "" + end + end, }) minetest.register_craft({ diff --git a/techage/recipe_checker.lua b/techage/recipe_checker.lua index 95558e1..93b83fe 100644 --- a/techage/recipe_checker.lua +++ b/techage/recipe_checker.lua @@ -14,7 +14,7 @@ end minetest.after(1, function() for name,_ in pairs(minetest.registered_items) do local mod = string.split(name, ":")[1] - if mod == "techage" or mod == "signs_bot" then + if mod == "techage" or mod == "signs_bot" or mod == "vm16" or mod == "beduino" then local recipes = minetest.get_all_craft_recipes(name) if recipes then for _,recipe in ipairs(recipes) do diff --git a/techage/settingtypes.txt b/techage/settingtypes.txt index 377539a..b1219fd 100644 --- a/techage/settingtypes.txt +++ b/techage/settingtypes.txt @@ -33,4 +33,8 @@ techage_command_limit (Max. number of commands sent per minute) int 1200 # Colliders are huge systems and should not be built on the surface. # 'techage_collider_min_depth specifies' the min. depth (Y) to build a TA4 Collider -techage_collider_min_depth (Min. depth to build a TA4 Collider) int -30 \ No newline at end of file +techage_collider_min_depth (Min. depth to build a TA4 Collider) int -30 + +# Average waiting time in minutes to get one Collider expoint. +# Default value is 60, which means one point per hour. +techage_expoint_rate_in_min (average waiting time for one expoint) int 60 \ No newline at end of file diff --git a/techage/solar/inverter.lua b/techage/solar/inverter.lua index 94c87ed..dc65574 100644 --- a/techage/solar/inverter.lua +++ b/techage/solar/inverter.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -218,6 +218,17 @@ techage.register_node({"techage:ta4_solar_inverter"}, { return State:on_receive_message(pos, topic, payload) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 135 then -- Delivered Power + return 0, {math.floor((nvm.provided or 0) + 0.5)} + else + return State:on_beduino_request_data(pos, topic, payload) + end + end, }) control.register_nodes({"techage:ta4_solar_inverter"}, { diff --git a/techage/solar/minicell.lua b/techage/solar/minicell.lua index 1364ec1..6eedee5 100644 --- a/techage/solar/minicell.lua +++ b/techage/solar/minicell.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -120,6 +120,20 @@ techage.register_node({"techage:ta4_solar_minicell"}, { return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 145 then -- Solar Cell State + if nvm.providing then + return 0, {2} + elseif (nvm.capa or 0) > 0 then + return 0, {1} + else + return 0, {0} + end + else + return 2, "" + end + end, on_node_load = function(pos) minetest.get_node_timer(pos):start(CYCLE_TIME) end, diff --git a/techage/ta2_energy_storage/ta2_winch.lua b/techage/ta2_energy_storage/ta2_winch.lua index 19308a9..00a7b54 100644 --- a/techage/ta2_energy_storage/ta2_winch.lua +++ b/techage/ta2_energy_storage/ta2_winch.lua @@ -56,7 +56,13 @@ end local function add_chest_entity(pos, nvm) local mem = techage.get_mem(pos) - local length = (nvm.length or MAX_ROPE_LEN) * (1 - (nvm.load or 0) / (nvm.capa or 1)) + local length + + if not nvm.capa or nvm.capa == 0 then + length = (nvm.length or MAX_ROPE_LEN) * (1 - (nvm.load or 0)) + else + length = (nvm.length or MAX_ROPE_LEN) * (1 - (nvm.load or 0) / nvm.capa) + end local y = pos.y - length - 1 techage.renew_rope(pos, length, true) if mem.obj then diff --git a/techage/ta3_power/akkubox.lua b/techage/ta3_power/akkubox.lua index f856c6f..e3276a7 100644 --- a/techage/ta3_power/akkubox.lua +++ b/techage/ta3_power/akkubox.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2020 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -172,6 +172,17 @@ techage.register_node({"techage:ta3_akku"}, { return State:on_receive_message(pos, topic, payload) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 134 then -- load + return 0, {math.floor(techage.power.percent(PWR_CAPA, nvm.capa) + 0.5)} + else + return State:on_beduino_request_data(pos, topic, payload) + end + end, }) control.register_nodes({"techage:ta3_akku"}, { diff --git a/techage/ta3_power/tiny_generator.lua b/techage/ta3_power/tiny_generator.lua index db82c46..a6d31a9 100644 --- a/techage/ta3_power/tiny_generator.lua +++ b/techage/ta3_power/tiny_generator.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -338,6 +338,19 @@ techage.register_node({"techage:tiny_generator", "techage:tiny_generator_on"}, { return State:on_receive_message(pos, topic, payload) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 135 then + return 0, {nvm.provided or 0} + elseif topic == 132 then + return 0, {techage.fuel.get_fuel_amount(nvm)} + else + return State:on_beduino_request_data(pos, topic, payload) + end + end, on_node_load = function(pos, node) State:on_node_load(pos) if node.name == "techage:tiny_generator_on" then diff --git a/techage/ta4_power/electricmeter.lua b/techage/ta4_power/electricmeter.lua index 75c149b..ca10ad9 100644 --- a/techage/ta4_power/electricmeter.lua +++ b/techage/ta4_power/electricmeter.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -160,6 +160,17 @@ techage.register_node({"techage:ta4_electricmeter"}, { return State:on_receive_message(pos, topic, payload) end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 146 then -- Consumption + return 0, {math.floor((nvm.units or 0) / techage.CYCLES_PER_DAY)} + else + return State:on_beduino_request_data(pos, topic, payload) + end + end, }) control.register_nodes({"techage:ta4_electricmeter"}, { diff --git a/techage/ta4_power/laser.lua b/techage/ta4_power/laser.lua index 9391d2d..ad1eb73 100644 --- a/techage/ta4_power/laser.lua +++ b/techage/ta4_power/laser.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg GPL v3 See LICENSE.txt for more information @@ -135,6 +135,14 @@ techage.register_node({"techage:ta4_laser_emitter"}, { return "unsupported" end end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 142 then -- Binary State + local nvm = techage.get_nvm(pos) + return 0, {nvm.running and 1 or 0} + else + return 2, "" + end + end, }) power.register_nodes({"techage:ta4_laser_emitter", "techage:ta4_laser_receiver"}, Cable, "special", {"F"}) diff --git a/techage/ta4_power/transformer.lua b/techage/ta4_power/transformer.lua index 225df2c..d1ff216 100644 --- a/techage/ta4_power/transformer.lua +++ b/techage/ta4_power/transformer.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2022 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -150,6 +150,12 @@ techage.register_node({"techage:ta4_transformer"}, { on_recv_message = function(pos, src, topic, payload) return State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return State:on_beduino_request_data(pos, topic, payload) + end, }) control.register_nodes({"techage:ta4_transformer"}, { diff --git a/techage/teleport/teleport_pipe.lua b/techage/teleport/teleport_pipe.lua index 10b0454..e07a167 100644 --- a/techage/teleport/teleport_pipe.lua +++ b/techage/teleport/teleport_pipe.lua @@ -161,19 +161,21 @@ liquid.register_nodes({"techage:ta5_tele_pipe"}, Pipe, "tank", {"L"}, { nvm.oil_amount = nvm.oil_amount or 0 if not blocked and techage.is_operational(nvm) then local rmt_pos = teleport.get_remote_pos(pos) - local rmt_nvm = techage.get_nvm(rmt_pos) - if techage.is_operational(rmt_nvm) then - local pipe_dir = M(rmt_pos):get_int("pipe_dir") - blocked = true - local leftover = liquid.put(rmt_pos, Pipe, pipe_dir, name, amount) - blocked = false - if leftover < amount then - State:keep_running(pos, nvm, COUNTDOWN_TICKS) - State:keep_running(rmt_pos, rmt_nvm, COUNTDOWN_TICKS) + if rmt_pos then + local rmt_nvm = techage.get_nvm(rmt_pos) + if techage.is_operational(rmt_nvm) then + local pipe_dir = M(rmt_pos):get_int("pipe_dir") + blocked = true + local leftover = liquid.put(rmt_pos, Pipe, pipe_dir, name, amount) + blocked = false + if leftover < amount then + State:keep_running(pos, nvm, COUNTDOWN_TICKS) + State:keep_running(rmt_pos, rmt_nvm, COUNTDOWN_TICKS) + end + return leftover + else + State:blocked(pos, nvm, S("Remote block error")) end - return leftover - else - State:blocked(pos, nvm, S("Remote block error")) end end return amount @@ -184,6 +186,12 @@ techage.register_node({"techage:ta5_tele_pipe"}, { on_recv_message = function(pos, src, topic, payload) return State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return State:on_beduino_request_data(pos, topic, payload) + end, }) power.register_nodes({"techage:ta5_tele_pipe"}, Cable, "con", {"B", "R", "F", "D", "U"}) diff --git a/techage/teleport/teleport_tube.lua b/techage/teleport/teleport_tube.lua index 11517d3..d1e278a 100644 --- a/techage/teleport/teleport_tube.lua +++ b/techage/teleport/teleport_tube.lua @@ -175,6 +175,12 @@ techage.register_node({"techage:ta5_tele_tube"}, { on_recv_message = function(pos, src, topic, payload) return State:on_receive_message(pos, topic, payload) end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return State:on_beduino_receive_cmnd(pos, topic, payload) + end, + on_beduino_request_data = function(pos, src, topic, payload) + return State:on_beduino_request_data(pos, topic, payload) + end, }) power.register_nodes({"techage:ta5_tele_tube"}, Cable, "con", {"B", "R", "F", "D", "U"}) diff --git a/techage/textures/techage_appl_lightdetector.png b/techage/textures/techage_appl_lightdetector.png new file mode 100755 index 0000000000000000000000000000000000000000..ebd2db73d2124476f2e3a80dfb34c0900a6d144c GIT binary patch literal 1957 zcmV;W2U_@vP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+T~YUw&W%Z{AU$e0+JAqrewB*CS?t{-)cz&|G+Y5$C z(8}=`=h?r)uJ-{coc8u?cd4I#^67~D)6`-!+x<9$JRJ!ib~>M3IS17Ekk0wze!9KV zdU*~BU<`#nVaHQQ{J!!rlh}`??$)jW9Z3}TENNTvkNCM8bYB2?yL-XUUy;cjj>FNF zR(!$fw3EKrXUyw9`IXhnrm!y?Xv zpW;64v*66W`VQ6xQf{)*N%nIhR}u7eN_QS7J#e zmr`oQq%~Cds_0)~XxyZQrY*MAax1NN$ft*{J@(XdFTD;PGEf5Ch$D?W%BYhjq%_0S z8E2Y#mRT3Hwq%8+E3UNiDy!aDJ6U~Z?UlLDtkKCDZ=$SUy0ZpzN|y_=a-zl=7~?=- zJQ)KJG#h6=QwVI#8E3w*I1yz;sYcEqV+;(2Nvw-*+})Xb%bNqb-{pC4+4wx@5k?z;p2!;X5WHTO7U39~H8 zNkrkg8O)k61={3G#4PHr{FDo!ud*5c46dq{2mW zpH;&QfapL2SF0@8(K_nb;k2<_bR%f@i&;Hnx1H3mP-~A_z;6i-Vo%Bt`%TFnrFlyY zqJT7(foKNvW9sA+`W{2Jj%V)$8h7I+UJYBwBe;+?xW3@Gr?S8Ul* zPI*{~s0zvTVSTRx!7;wiN9j-rlQJHUn>I=sRh+@LAfw+`6Bwg)KVB7hzN@ zEmvU*y+2h3_l*+rv2~wnjXij*Fe?sNh}Yr|rTn;KI{K|0(*MlSv4t8gD0ZmV{0Ww) z*8L0c{7)R=OSRy?``_HZHcUrhLJ9x?0fcEoLr_UWLm+T+Z)Rz1WdHzpoPCi!NW(xJ z#b48kA5;|VAmWgrI$01Eanvdlp+cw?T6HkF^b49aBq=VAf@{ISkHxBki?gl{u7V)= z0pjT7r060g{x2!Ci1FaKAMfrx?%n}Hz05Q#G!AIGZKe`&F_T>tJ6|CngfP0%FEh)S zlcXek$Jadqe7%eDEdO(Vj$SoqF(4ok&oaZbi8qL+H*JISK5>K8V^%aZ;wj>&s_B$3WIR?mZ*kVjRo1*Ge_=SMuPk$& z<}eai#1bTkP*6n)W!Q+(s*_?NMf-6d|B&mK$fc001V)YpRG>k2{osG_yIU(iIpHOR z<3PuY<9v(&ox4Dz<~ZNSj?*{+g3rK}-tt%Kz|1G;acMz~GZ1 zo3bkfX$tu~@P0<$lm!NEfu1$5x8^=hAAmG%wEwTz3P{A1|*K+n+DqOiltXfUNQYB r%+VIQ7V;*ib(>i#4#Z+uES|reF*g}iVt-bE00000NkvXXu0mjf*KeAc literal 0 HcmV?d00001 diff --git a/techage/textures/techage_appl_lightdetector_on.png b/techage/textures/techage_appl_lightdetector_on.png new file mode 100755 index 0000000000000000000000000000000000000000..69940331e52729819b57df016d6c50eb0c211859 GIT binary patch literal 2250 zcmV;*2sQVKP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+T~YSmgA@r{bv=u1g0QhIl**J@8B)JZvax-&U95} zz5435j*WyQh`2+5&G_Hn)BJ^xPuZGCoKs23;uA|OUT~7_{_NJ-xPI5ipIf+o>Nocd zkFJ0=?8`LH^MZc*c!A^Tuh0F4+ZiXHft-DsI_S)L-cOKcpx}4EJJ+V17bHETbH2Wv zVXw4at|J4CP8ctE<4178u3x`r3i|ayR;#}e54u1&_kmXrf5y+;(0u{mefEN%y&?-A zaO{Duw9*Ssr{B>_f4HadPZ2qP&+H!~qG^kL{5;?{XU}tvot?yF09QImU8$@yJXir| zSg$1|a+bYk=YV4dKZ3|TWM9F6BSXF;N*_Z=ASZjB8}G1N&wBE^8|4K= zP)IOI20;R{Vx*Yhw+so1p+J#{5;0{eBq^krD5by&Wd$i#`6GZ&T|a?F%d=A3iM zQhW(0V`NGyTyiNz1d~b>j3szp&{2I2HCC#ra?Q0=X^>Bgjaq8law|=`@1dgvn4UWK z+)J0?2Bb9NppgcTJj##>t<5mwq?snqJj;}uwZrN&Yp=}xm^F7;^NT2bjz3sKH}f@w z({e(}85r}?fpJy_AZV|g+3aHU%A9g$iw`CQ@`#d@obHq{Fc^pPG~LbJ2Xk+EGeGyd zy!o$~GfLf`V9qFY56pe$?F-hrta2L`LFz(aiV7KEKYdMnmO-ISt7llAzSWxVzVI&| zXi@_KHH6mYkkINF6Urhpr7N?=D*%UR(3-#y4AM zMlCd;T(sCKHJb>+oIP@>y+clj7Gmr?vCa%3V#saAoo#K{4(xL)@m5Fw>~EO z>3bELTqm^Nz0l}>ND zGK(J84^>mbC?5}I?jkGjb z7PG*_y|-4S+o>BvO|j0Vg5ebiz`F1u4mc%I@GE z)Mg+z_lgU2-om2F!|ZshwDJa;J7e?P&|H$;5DoJ^i0)FNZKvUr#$Awv2@~7r>gbkD zp-}AhsJ=kZj3PL(1ptEZX&Nf)IZ~=o03a%loHD}D$jFz3G=7)?L2fhDV+M{Z$N(?U z^1`H3aXa=X=C{_KFP0v&Yt%6(@wWIe`1(IXcUd|<%&#sCYC^MJxQm5*DQ@;I6Hnk} zu^;UPy~)RhJNABJuPb(xa&@7`KIJL&&(+D;)W3)w`gn@|#Q%fv%@zOiinCbX)fueU z&3av|M`iuZH*V$^cXnIMy8XbCT)eyL4gL<4gpxB+k48FstiJYG6Sl)YDAGL^ z&_8)o?D>;nA6xV8#&=sCXqT_B7v=gM*Syx__BE=;{-OQxe{mp`&)Ex>;(q`&Ni>%Qhp*mR*6>-!m z6rn<>6nNgNw7S4z7YA_yOYRM#hx^1QsaWRu!6+2%cAcQcw(JwR0n3JR=e8<;40(`xT@htyye~w-? zXE7ik63;Tjw23!}r#Eeb^FDEe6=jw9oOsNn3lcwaUGeyhbHQbSXGY9)YMwYkEEd{W zX=7G2HR37asH*9dFJwGcId5^+%2n39Cx2l$r>`t?o#rqSSi}+}h)_^P31!%b(W;YT zAw~OfAODc+m&m1%s{}@l1yrCxcKzUg@Vi?pKRMwgh2ucSi{pHZ0G+!)qvkl@$BxrD z0fNuKmEQ7K>cGq=>9v*?Jp%f+fs5;wrtATiJHX(RA)B%*1!)TTJn()--;@OgZh@XP zueattP9K0Yb(OpU4i16Q0%foJyt}Ktw|~zx`}+afhjMB{vkn3P000S4OjJbxz=TI| zOo0CY&A_{Q00001bW%=J06^y0W&i*H0b)x>L;#2d9Y_EG010qNS#tmYE+YT{E+YYW zr9XB6000McNliru<^lu^8wbZDF;xHn08dFoK~xyiV_+Z^aKRW_P?}=}OlAR$(Et~L zG8|Th#;;ftj-kBA~Sj2v#67;8MtnVV16fIS{6V0j7kZfn?tT Y05>-oUBF3x`2YX_07*qoM6N<$f(k`3ssI20 literal 0 HcmV?d00001 diff --git a/techage/tools/repairkit.lua b/techage/tools/repairkit.lua index 2622a47..58ba18c 100644 --- a/techage/tools/repairkit.lua +++ b/techage/tools/repairkit.lua @@ -76,6 +76,11 @@ local function read_state(itemstack, user, pointed_thing) state = dump(state) minetest.chat_send_player(user:get_player_name(), ndef.description.." "..number..": state = "..state.." ") end + local state = techage.send_single("0", number, "count", nil) + if state and state ~= "" and state ~= "unsupported" then + state = dump(state) + minetest.chat_send_player(user:get_player_name(), ndef.description.." "..number..": count = "..state.." ") + end local fuel = techage.send_single("0", number, "fuel", nil) if fuel and fuel ~= "" and fuel ~= "unsupported" then fuel = dump(fuel) diff --git a/techage/wind_turbine/rotor.lua b/techage/wind_turbine/rotor.lua index 5be96d2..d84245a 100644 --- a/techage/wind_turbine/rotor.lua +++ b/techage/wind_turbine/rotor.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2021 DS-Minetest, Joachim Stolberg + Copyright (C) 2019-2022 DS-Minetest, Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -117,9 +117,11 @@ local function stop_rotor(pos, nvm, state) end local function can_start(pos, nvm) + check_rotor(pos, nvm) if nvm.error then return nvm.error end + add_rotor(pos, nvm) return true end @@ -305,9 +307,41 @@ techage.register_node({"techage:ta4_wind_turbine"}, { return "unsupported" end end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 1 and payload[1] == 1 then + State:start(pos, nvm) + elseif topic == 1 and payload[1] == 0 then + State:stop(pos, nvm) + else + return 2 + end + return 0 + end, + on_beduino_request_data = function(pos, src, topic, payload) + local nvm = techage.get_nvm(pos) + if topic == 129 then + local node = minetest.get_node(pos) + if node.name == "ignore" then -- unloaded node? + return 0, {techage.UNLOADED} + end + if nvm.error then + return 0, {techage.FAULT} + elseif techage.is_running(nvm) then + return 0, {techage.RUNNING} + else + return 0, {techage.STOPPED} + end + elseif topic == 135 then -- Delivered Power + return 0, {nvm.delivered or 0} + else + return 2, "" + end + end, on_node_load = function(pos) local nvm = techage.get_nvm(pos) add_rotor(pos, nvm, true) + start_rotor(pos, nvm) minetest.get_node_timer(pos):start(CYCLE_TIME) end, }) diff --git a/tubelib2/README.md b/tubelib2/README.md index acb8c22..e6e69da 100644 --- a/tubelib2/README.md +++ b/tubelib2/README.md @@ -50,8 +50,7 @@ func(node, pos, out_dir, peer_pos, peer_in_dir) will be called for every change ## Dependencies -default -optional: intllib +optional: default ## License @@ -90,5 +89,6 @@ Textures: CC0 - 2021-01-23 v2.0 * Add functions for easy & fast 'valid side' checking (PR #8) - 2021-05-24 v2.1 * Add API functions 'register_on_tube_update2' - 2022-01-05 v2.2 * Extend the 'node.param2' support for all 24 possible values +- 2022-03-11 v2.2.1 * Changed to minetest 5.0 translation (#12) diff --git a/tubelib2/depends.txt b/tubelib2/depends.txt deleted file mode 100644 index 60f8390..0000000 --- a/tubelib2/depends.txt +++ /dev/null @@ -1,2 +0,0 @@ -default? -intllib? diff --git a/tubelib2/i18n.py b/tubelib2/i18n.py new file mode 100644 index 0000000..5390ab9 --- /dev/null +++ b/tubelib2/i18n.py @@ -0,0 +1,476 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Script to generate the template file and update the translation files. +# Copy the script into the mod or modpack root folder and run it there. +# +# Copyright (C) 2019 Joachim Stolberg, 2020 FaceDeer, 2020 Louis Royer +# LGPLv2.1+ +# +# See https://github.com/minetest-tools/update_translations for +# potential future updates to this script. + +from __future__ import print_function +import os, fnmatch, re, shutil, errno +from sys import argv as _argv +from sys import stderr as _stderr + +# Running params +params = {"recursive": False, + "help": False, + "mods": False, + "verbose": False, + "folders": [], + "no-old-file": False, + "break-long-lines": False, + "sort": False, + "print-source": False, + "truncate-unused": False, +} +# Available CLI options +options = {"recursive": ['--recursive', '-r'], + "help": ['--help', '-h'], + "mods": ['--installed-mods', '-m'], + "verbose": ['--verbose', '-v'], + "no-old-file": ['--no-old-file', '-O'], + "break-long-lines": ['--break-long-lines', '-b'], + "sort": ['--sort', '-s'], + "print-source": ['--print-source', '-p'], + "truncate-unused": ['--truncate-unused', '-t'], +} + +# Strings longer than this will have extra space added between +# them in the translation files to make it easier to distinguish their +# beginnings and endings at a glance +doublespace_threshold = 80 + +def set_params_folders(tab: list): + '''Initialize params["folders"] from CLI arguments.''' + # Discarding argument 0 (tool name) + for param in tab[1:]: + stop_param = False + for option in options: + if param in options[option]: + stop_param = True + break + if not stop_param: + params["folders"].append(os.path.abspath(param)) + +def set_params(tab: list): + '''Initialize params from CLI arguments.''' + for option in options: + for option_name in options[option]: + if option_name in tab: + params[option] = True + break + +def print_help(name): + '''Prints some help message.''' + print(f'''SYNOPSIS + {name} [OPTIONS] [PATHS...] +DESCRIPTION + {', '.join(options["help"])} + prints this help message + {', '.join(options["recursive"])} + run on all subfolders of paths given + {', '.join(options["mods"])} + run on locally installed modules + {', '.join(options["no-old-file"])} + do not create *.old files + {', '.join(options["sort"])} + sort output strings alphabetically + {', '.join(options["break-long-lines"])} + add extra line breaks before and after long strings + {', '.join(options["print-source"])} + add comments denoting the source file + {', '.join(options["verbose"])} + add output information + {', '.join(options["truncate-unused"])} + delete unused strings from files +''') + + +def main(): + '''Main function''' + set_params(_argv) + set_params_folders(_argv) + if params["help"]: + print_help(_argv[0]) + elif params["recursive"] and params["mods"]: + print("Option --installed-mods is incompatible with --recursive") + else: + # Add recursivity message + print("Running ", end='') + if params["recursive"]: + print("recursively ", end='') + # Running + if params["mods"]: + print(f"on all locally installed modules in {os.path.expanduser('~/.minetest/mods/')}") + run_all_subfolders(os.path.expanduser("~/.minetest/mods")) + elif len(params["folders"]) >= 2: + print("on folder list:", params["folders"]) + for f in params["folders"]: + if params["recursive"]: + run_all_subfolders(f) + else: + update_folder(f) + elif len(params["folders"]) == 1: + print("on folder", params["folders"][0]) + if params["recursive"]: + run_all_subfolders(params["folders"][0]) + else: + update_folder(params["folders"][0]) + else: + print("on folder", os.path.abspath("./")) + if params["recursive"]: + run_all_subfolders(os.path.abspath("./")) + else: + update_folder(os.path.abspath("./")) + +#group 2 will be the string, groups 1 and 3 will be the delimiters (" or ') +#See https://stackoverflow.com/questions/46967465/regex-match-text-in-either-single-or-double-quote +pattern_lua_s = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)[\s,\)]', re.DOTALL) +pattern_lua_fs = re.compile(r'[\.=^\t,{\(\s]N?FS\(\s*(["\'])((?:\\\1|(?:(?!\1)).)*)(\1)[\s,\)]', re.DOTALL) +pattern_lua_bracketed_s = re.compile(r'[\.=^\t,{\(\s]N?S\(\s*\[\[(.*?)\]\][\s,\)]', re.DOTALL) +pattern_lua_bracketed_fs = re.compile(r'[\.=^\t,{\(\s]N?FS\(\s*\[\[(.*?)\]\][\s,\)]', re.DOTALL) + +# Handles "concatenation" .. " of strings" +pattern_concat = re.compile(r'["\'][\s]*\.\.[\s]*["\']', re.DOTALL) + +pattern_tr = re.compile(r'(.*?[^@])=(.*)') +pattern_name = re.compile(r'^name[ ]*=[ ]*([^ \n]*)') +pattern_tr_filename = re.compile(r'\.tr$') +pattern_po_language_code = re.compile(r'(.*)\.po$') + +#attempt to read the mod's name from the mod.conf file or folder name. Returns None on failure +def get_modname(folder): + try: + with open(os.path.join(folder, "mod.conf"), "r", encoding='utf-8') as mod_conf: + for line in mod_conf: + match = pattern_name.match(line) + if match: + return match.group(1) + except FileNotFoundError: + if not os.path.isfile(os.path.join(folder, "modpack.txt")): + folder_name = os.path.basename(folder) + # Special case when run in Minetest's builtin directory + if folder_name == "builtin": + return "__builtin" + else: + return folder_name + else: + return None + return None + +#If there are already .tr files in /locale, returns a list of their names +def get_existing_tr_files(folder): + out = [] + for root, dirs, files in os.walk(os.path.join(folder, 'locale/')): + for name in files: + if pattern_tr_filename.search(name): + out.append(name) + return out + +# A series of search and replaces that massage a .po file's contents into +# a .tr file's equivalent +def process_po_file(text): + # The first three items are for unused matches + text = re.sub(r'#~ msgid "', "", text) + text = re.sub(r'"\n#~ msgstr ""\n"', "=", text) + text = re.sub(r'"\n#~ msgstr "', "=", text) + # comment lines + text = re.sub(r'#.*\n', "", text) + # converting msg pairs into "=" pairs + text = re.sub(r'msgid "', "", text) + text = re.sub(r'"\nmsgstr ""\n"', "=", text) + text = re.sub(r'"\nmsgstr "', "=", text) + # various line breaks and escape codes + text = re.sub(r'"\n"', "", text) + text = re.sub(r'"\n', "\n", text) + text = re.sub(r'\\"', '"', text) + text = re.sub(r'\\n', '@n', text) + # remove header text + text = re.sub(r'=Project-Id-Version:.*\n', "", text) + # remove double-spaced lines + text = re.sub(r'\n\n', '\n', text) + return text + +# Go through existing .po files and, if a .tr file for that language +# *doesn't* exist, convert it and create it. +# The .tr file that results will subsequently be reprocessed so +# any "no longer used" strings will be preserved. +# Note that "fuzzy" tags will be lost in this process. +def process_po_files(folder, modname): + for root, dirs, files in os.walk(os.path.join(folder, 'locale/')): + for name in files: + code_match = pattern_po_language_code.match(name) + if code_match == None: + continue + language_code = code_match.group(1) + tr_name = f'{modname}.{language_code}.tr' + tr_file = os.path.join(root, tr_name) + if os.path.exists(tr_file): + if params["verbose"]: + print(f"{tr_name} already exists, ignoring {name}") + continue + fname = os.path.join(root, name) + with open(fname, "r", encoding='utf-8') as po_file: + if params["verbose"]: + print(f"Importing translations from {name}") + text = process_po_file(po_file.read()) + with open(tr_file, "wt", encoding='utf-8') as tr_out: + tr_out.write(text) + +# from https://stackoverflow.com/questions/600268/mkdir-p-functionality-in-python/600612#600612 +# Creates a directory if it doesn't exist, silently does +# nothing if it already exists +def mkdir_p(path): + try: + os.makedirs(path) + except OSError as exc: # Python >2.5 + if exc.errno == errno.EEXIST and os.path.isdir(path): + pass + else: raise + +# Converts the template dictionary to a text to be written as a file +# dKeyStrings is a dictionary of localized string to source file sets +# dOld is a dictionary of existing translations and comments from +# the previous version of this text +def strings_to_text(dkeyStrings, dOld, mod_name, header_comments): + lOut = [f"# textdomain: {mod_name}"] + if header_comments is not None: + lOut.append(header_comments) + + dGroupedBySource = {} + + for key in dkeyStrings: + sourceList = list(dkeyStrings[key]) + if params["sort"]: + sourceList.sort() + sourceString = "\n".join(sourceList) + listForSource = dGroupedBySource.get(sourceString, []) + listForSource.append(key) + dGroupedBySource[sourceString] = listForSource + + lSourceKeys = list(dGroupedBySource.keys()) + lSourceKeys.sort() + for source in lSourceKeys: + localizedStrings = dGroupedBySource[source] + if params["sort"]: + localizedStrings.sort() + if params["print-source"]: + if lOut[-1] != "": + lOut.append("") + lOut.append(source) + for localizedString in localizedStrings: + val = dOld.get(localizedString, {}) + translation = val.get("translation", "") + comment = val.get("comment") + if params["break-long-lines"] and len(localizedString) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None and comment != "" and not comment.startswith("# textdomain:"): + lOut.append(comment) + lOut.append(f"{localizedString}={translation}") + if params["break-long-lines"] and len(localizedString) > doublespace_threshold: + lOut.append("") + + + unusedExist = False + if not params["truncate-unused"]: + for key in dOld: + if key not in dkeyStrings: + val = dOld[key] + translation = val.get("translation") + comment = val.get("comment") + # only keep an unused translation if there was translated + # text or a comment associated with it + if translation != None and (translation != "" or comment): + if not unusedExist: + unusedExist = True + lOut.append("\n\n##### not used anymore #####\n") + if params["break-long-lines"] and len(key) > doublespace_threshold and not lOut[-1] == "": + lOut.append("") + if comment != None: + lOut.append(comment) + lOut.append(f"{key}={translation}") + if params["break-long-lines"] and len(key) > doublespace_threshold: + lOut.append("") + return "\n".join(lOut) + '\n' + +# Writes a template.txt file +# dkeyStrings is the dictionary returned by generate_template +def write_template(templ_file, dkeyStrings, mod_name): + # read existing template file to preserve comments + existing_template = import_tr_file(templ_file) + + text = strings_to_text(dkeyStrings, existing_template[0], mod_name, existing_template[2]) + mkdir_p(os.path.dirname(templ_file)) + with open(templ_file, "wt", encoding='utf-8') as template_file: + template_file.write(text) + + +# Gets all translatable strings from a lua file +def read_lua_file_strings(lua_file): + lOut = [] + with open(lua_file, encoding='utf-8') as text_file: + text = text_file.read() + #TODO remove comments here + + text = re.sub(pattern_concat, "", text) + + strings = [] + for s in pattern_lua_s.findall(text): + strings.append(s[1]) + for s in pattern_lua_bracketed_s.findall(text): + strings.append(s) + for s in pattern_lua_fs.findall(text): + strings.append(s[1]) + for s in pattern_lua_bracketed_fs.findall(text): + strings.append(s) + + for s in strings: + s = re.sub(r'"\.\.\s+"', "", s) + s = re.sub("@[^@=0-9]", "@@", s) + s = s.replace('\\"', '"') + s = s.replace("\\'", "'") + s = s.replace("\n", "@n") + s = s.replace("\\n", "@n") + s = s.replace("=", "@=") + lOut.append(s) + return lOut + +# Gets strings from an existing translation file +# returns both a dictionary of translations +# and the full original source text so that the new text +# can be compared to it for changes. +# Returns also header comments in the third return value. +def import_tr_file(tr_file): + dOut = {} + text = None + header_comment = None + if os.path.exists(tr_file): + with open(tr_file, "r", encoding='utf-8') as existing_file : + # save the full text to allow for comparison + # of the old version with the new output + text = existing_file.read() + existing_file.seek(0) + # a running record of the current comment block + # we're inside, to allow preceeding multi-line comments + # to be retained for a translation line + latest_comment_block = None + for line in existing_file.readlines(): + line = line.rstrip('\n') + if line.startswith("###"): + if header_comment is None and not latest_comment_block is None: + # Save header comments + header_comment = latest_comment_block + # Strip textdomain line + tmp_h_c = "" + for l in header_comment.split('\n'): + if not l.startswith("# textdomain:"): + tmp_h_c += l + '\n' + header_comment = tmp_h_c + + # Reset comment block if we hit a header + latest_comment_block = None + continue + elif line.startswith("#"): + # Save the comment we're inside + if not latest_comment_block: + latest_comment_block = line + else: + latest_comment_block = latest_comment_block + "\n" + line + continue + match = pattern_tr.match(line) + if match: + # this line is a translated line + outval = {} + outval["translation"] = match.group(2) + if latest_comment_block: + # if there was a comment, record that. + outval["comment"] = latest_comment_block + latest_comment_block = None + dOut[match.group(1)] = outval + return (dOut, text, header_comment) + +# Walks all lua files in the mod folder, collects translatable strings, +# and writes it to a template.txt file +# Returns a dictionary of localized strings to source file sets +# that can be used with the strings_to_text function. +def generate_template(folder, mod_name): + dOut = {} + for root, dirs, files in os.walk(folder): + for name in files: + if fnmatch.fnmatch(name, "*.lua"): + fname = os.path.join(root, name) + found = read_lua_file_strings(fname) + if params["verbose"]: + print(f"{fname}: {str(len(found))} translatable strings") + + for s in found: + sources = dOut.get(s, set()) + sources.add(f"### {os.path.basename(fname)} ###") + dOut[s] = sources + + if len(dOut) == 0: + return None + templ_file = os.path.join(folder, "locale/template.txt") + write_template(templ_file, dOut, mod_name) + return dOut + +# Updates an existing .tr file, copying the old one to a ".old" file +# if any changes have happened +# dNew is the data used to generate the template, it has all the +# currently-existing localized strings +def update_tr_file(dNew, mod_name, tr_file): + if params["verbose"]: + print(f"updating {tr_file}") + + tr_import = import_tr_file(tr_file) + dOld = tr_import[0] + textOld = tr_import[1] + + textNew = strings_to_text(dNew, dOld, mod_name, tr_import[2]) + + if textOld and textOld != textNew: + print(f"{tr_file} has changed.") + if not params["no-old-file"]: + shutil.copyfile(tr_file, f"{tr_file}.old") + + with open(tr_file, "w", encoding='utf-8') as new_tr_file: + new_tr_file.write(textNew) + +# Updates translation files for the mod in the given folder +def update_mod(folder): + modname = get_modname(folder) + if modname is not None: + process_po_files(folder, modname) + print(f"Updating translations for {modname}") + data = generate_template(folder, modname) + if data == None: + print(f"No translatable strings found in {modname}") + else: + for tr_file in get_existing_tr_files(folder): + update_tr_file(data, modname, os.path.join(folder, "locale/", tr_file)) + else: + print(f"\033[31mUnable to find modname in folder {folder}.\033[0m", file=_stderr) + exit(1) + +# Determines if the folder being pointed to is a mod or a mod pack +# and then runs update_mod accordingly +def update_folder(folder): + is_modpack = os.path.exists(os.path.join(folder, "modpack.txt")) or os.path.exists(os.path.join(folder, "modpack.conf")) + if is_modpack: + subfolders = [f.path for f in os.scandir(folder) if f.is_dir() and not f.name.startswith('.')] + for subfolder in subfolders: + update_mod(subfolder) + else: + update_mod(folder) + print("Done.") + +def run_all_subfolders(folder): + for modfolder in [f.path for f in os.scandir(folder) if f.is_dir() and not f.name.startswith('.')]: + update_folder(modfolder) + + +main() diff --git a/tubelib2/init.lua b/tubelib2/init.lua index 509dc07..e44736f 100644 --- a/tubelib2/init.lua +++ b/tubelib2/init.lua @@ -1,9 +1,9 @@ tubelib2 = {} -local MP = minetest.get_modpath("tubelib2") +-- Load support for I18n. +tubelib2.S = minetest.get_translator("tubelib2") --- Load support for intllib. -dofile(MP .. "/intllib.lua") +local MP = minetest.get_modpath("tubelib2") dofile(MP .. "/internal2.lua") dofile(MP .. "/internal1.lua") dofile(MP .. "/tube_api.lua") diff --git a/tubelib2/internal1.lua b/tubelib2/internal1.lua index 1ee3246..7fcd603 100644 --- a/tubelib2/internal1.lua +++ b/tubelib2/internal1.lua @@ -15,13 +15,12 @@ ]]-- -- for lazy programmers -local S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local P = minetest.string_to_pos +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos local M = minetest.get_meta --- Load support for intllib. -local MP = minetest.get_modpath("tubelib2") -local I,_ = dofile(MP.."/intllib.lua") +-- Load support for I18n. +local S = tubelib2.S local Tube = tubelib2.Tube local Turn180Deg = tubelib2.Turn180Deg @@ -71,11 +70,11 @@ end -- pos/dir are the pos of the stable secondary node pointing to the head tube node. function Tube:del_from_cache(pos, dir) - local key = S(pos) + local key = P2S(pos) if self.connCache[key] and self.connCache[key][dir] then local pos2 = self.connCache[key][dir].pos2 local dir2 = self.connCache[key][dir].dir2 - local key2 = S(pos2) + local key2 = P2S(pos2) if self.connCache[key2] and self.connCache[key2][dir2] then self.connCache[key2][dir2] = nil if self.debug_info then self.debug_info(pos2, "del") end @@ -89,7 +88,7 @@ end -- pos/dir are the pos of the secondary nodes pointing to the head tube nodes. function Tube:add_to_cache(pos1, dir1, pos2, dir2) - local key = S(pos1) + local key = P2S(pos1) if not self.connCache[key] then self.connCache[key] = {} end @@ -120,9 +119,9 @@ function Tube:infotext(pos1, pos2) if self.show_infotext then if pos1 and pos2 then if vector.equals(pos1, pos2) then - M(pos1):set_string("infotext", I("Not connected!")) + M(pos1):set_string("infotext", S("Not connected!")) else - M(pos1):set_string("infotext", I("Connected with ")..S(pos2)) + M(pos1):set_string("infotext", S("Connected to @1", P2S(pos2))) end end end @@ -135,10 +134,10 @@ end -- Pairing helper function. NOT USED (see internal2.lua)!!! function Tube:store_teleport_data(pos, peer_pos) local meta = M(pos) - meta:set_string("tele_pos", S(peer_pos)) + meta:set_string("tele_pos", P2S(peer_pos)) meta:set_string("channel", nil) meta:set_string("formspec", nil) - meta:set_string("infotext", I("Paired with ")..S(peer_pos)) + meta:set_string("infotext", S("Paired with @1", P2S(peer_pos))) return meta:get_int("tube_dir") end diff --git a/tubelib2/internal2.lua b/tubelib2/internal2.lua index 6c9d0dd..5a641d0 100644 --- a/tubelib2/internal2.lua +++ b/tubelib2/internal2.lua @@ -13,14 +13,12 @@ ]]-- -- for lazy programmers -local S = function(pos) if pos then return minetest.pos_to_string(pos) end end -local P = minetest.string_to_pos +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local S2P = minetest.string_to_pos local M = minetest.get_meta --- Load support for intllib. -local MP = minetest.get_modpath("tubelib2") -local I,IS = dofile(MP.."/intllib.lua") - +-- Load support for I18n. +local S = tubelib2.S local Tube = {} @@ -376,10 +374,10 @@ end -- Pairing helper function function Tube:store_teleport_data(pos, peer_pos) local meta = M(pos) - meta:set_string("tele_pos", S(peer_pos)) + meta:set_string("tele_pos", P2S(peer_pos)) meta:set_string("channel", nil) meta:set_string("formspec", nil) - meta:set_string("infotext", I("Connected with ")..S(peer_pos)) + meta:set_string("infotext", S("Connected to @1", P2S(peer_pos))) return meta:get_int("tube_dir") end @@ -393,7 +391,7 @@ function Tube:get_next_teleport_node(pos, dir) local meta = M(npos) local s = meta:get_string("tele_pos") if s ~= "" then - local tele_pos = P(s) + local tele_pos = S2P(s) local tube_dir = M(tele_pos):get_int("tube_dir") if tube_dir ~= 0 then return tele_pos, tube_dir @@ -405,7 +403,7 @@ end function Tube:dbg_out() for pos1,item1 in pairs(self.connCache) do for dir1,item2 in pairs(item1) do - print("pos1="..pos1..", dir1="..dir1..", pos2="..S(item2.pos2)..", dir2="..item2.dir2) + print("pos1="..pos1..", dir1="..dir1..", pos2="..P2S(item2.pos2)..", dir2="..item2.dir2) end end end diff --git a/tubelib2/intllib.lua b/tubelib2/intllib.lua deleted file mode 100644 index 6669d72..0000000 --- a/tubelib2/intllib.lua +++ /dev/null @@ -1,45 +0,0 @@ - --- Fallback functions for when `intllib` is not installed. --- Code released under Unlicense . - --- Get the latest version of this file at: --- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua - -local function format(str, ...) - local args = { ... } - local function repl(escape, open, num, close) - if escape == "" then - local replacement = tostring(args[tonumber(num)]) - if open == "" then - replacement = replacement..close - end - return replacement - else - return "@"..open..num..close - end - end - return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) -end - -local gettext, ngettext -if minetest.get_modpath("intllib") then - if intllib.make_gettext_pair then - -- New method using gettext. - gettext, ngettext = intllib.make_gettext_pair() - else - -- Old method using text files. - gettext = intllib.Getter() - end -end - --- Fill in missing functions. - -gettext = gettext or function(msgid, ...) - return format(msgid, ...) -end - -ngettext = ngettext or function(msgid, msgid_plural, n, ...) - return format(n==1 and msgid or msgid_plural, ...) -end - -return gettext, ngettext diff --git a/tubelib2/locale/de.mo b/tubelib2/locale/de.mo deleted file mode 100644 index c769b79dab16daeccb7c4c46d42de9f3d8378e7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 686 zcmYk2&u-H|5XP5MKr)CwJ%Er9np}_&+F<*Df)N*Js468TiVWh0Hulus%Gr%}*QMnV z5Ld(t@C*pfJ@FDe058Cm&q+f&(&wLMyz|ZO{NCF9A`n-gdr%Htg+4=F{D5viKOusC zL3f}(&~<3zf)LlhTi_OWAN&g@VE6ywh7b?H0eBaD58eci!LIKUcpLl*qGcHuPl?hp zHu1d#U0$WjyNZ|A7%l>r^g)N3*15KZf+ah0aIA`& z%bwV?fr_U%g$q7M$wcP)&)8Cl`iFrw(>H!C{JF? zDIe*GfLxRAd^(4DJ4mkJbe@=aU6}54>EVk_(lcm&^c13YE{KDXEi^UXH;@D z-W?Cmh9~_v!ZHFIcpNV, YEAR. -# -msgid "" -msgstr "" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-12-22 11:16+0100\n" -"PO-Revision-Date: 2018-12-22 11:19+0100\n" -"Last-Translator: \n" -"Language-Team: \n" -"Language: de\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 2.0.6\n" - -#: tube_api.lua -msgid "Maximum length reached!" -msgstr "Maximale Länge erreicht!" - -#: tube_api.lua -msgid "Pairing is missing" -msgstr "Das Pairing fehlt noch" - -#: tube_api.lua -msgid "Connection to a tube is missing!" -msgstr "Eine Verbindung zu einer Röhre fehlt!" - -#: internal1.lua -msgid "Not connected!" -msgstr "Nicht verbunden!" - -#: internal1.lua internal2.lua -msgid "Connected with " -msgstr "Verbunden mit " - -#: internal1.lua -msgid "Paired with " -msgstr "Gepaart mit " - -#~ msgid "Unconnected" -#~ msgstr "Nicht verbunden" diff --git a/tubelib2/locale/template.pot b/tubelib2/locale/template.pot deleted file mode 100644 index fa6cc33..0000000 --- a/tubelib2/locale/template.pot +++ /dev/null @@ -1,42 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2018-12-22 11:16+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: tube_api.lua -msgid "Maximum length reached!" -msgstr "" - -#: tube_api.lua -msgid "Pairing is missing" -msgstr "" - -#: tube_api.lua -msgid "Connection to a tube is missing!" -msgstr "" - -#: internal1.lua -msgid "Not connected!" -msgstr "" - -#: internal1.lua internal2.lua -msgid "Connected with " -msgstr "" - -#: internal1.lua -msgid "Paired with " -msgstr "" diff --git a/tubelib2/locale/template.txt b/tubelib2/locale/template.txt new file mode 100644 index 0000000..3c47e84 --- /dev/null +++ b/tubelib2/locale/template.txt @@ -0,0 +1,8 @@ +# textdomain: tubelib2 +Not connected!= +Paired with @1= +Connected to @1= +Maximum length reached!= +Pairing is missing= +Connection to a tube is missing!= +Pairing is missing (@1)= diff --git a/tubelib2/locale/tubelib2.de.tr b/tubelib2/locale/tubelib2.de.tr new file mode 100644 index 0000000..b41fa5e --- /dev/null +++ b/tubelib2/locale/tubelib2.de.tr @@ -0,0 +1,8 @@ +# textdomain: tubelib2 +Not connected!=Nicht verbunden! +Paired with @1=Gepaart mit @1 +Connected to @1=erbunden mit @1 +Maximum length reached!=Maximale Länge erreicht! +Pairing is missing=Das Pairing fehlt +Connection to a tube is missing!=Eine Verbindung zu einer Röhre fehlt! +Pairing is missing (@1)=Das Pairing fehlt (@1) diff --git a/tubelib2/mod.conf b/tubelib2/mod.conf index a967bf9..a5c92ea 100644 --- a/tubelib2/mod.conf +++ b/tubelib2/mod.conf @@ -1 +1,3 @@ name=tubelib2 +description = A library for mods which need connecting tubes / pipes / cables or similar. +optional_depends = default diff --git a/tubelib2/settingtypes.txt b/tubelib2/settingtypes.txt index 7386cc2..f6860e1 100644 --- a/tubelib2/settingtypes.txt +++ b/tubelib2/settingtypes.txt @@ -1,3 +1,3 @@ -# Maximim number of Forceload Blocks per player (default 20) -tubelib2_testingblocks_enabled (enbale the testing blocks) bool false +# Enable/disable test blocks +tubelib2_testingblocks_enabled (enable test blocks) bool false diff --git a/tubelib2/storage.lua b/tubelib2/storage.lua index b41657c..6a88bd0 100644 --- a/tubelib2/storage.lua +++ b/tubelib2/storage.lua @@ -129,16 +129,22 @@ function tubelib2.get_mem_data(pos, key, default) return tubelib2.get_mem(pos)[key] or default end -function tubelib2.walk_over_all(clbk) +function tubelib2.walk_over_all(clbk, key) local data = storage:to_table() for block_key,sblock in pairs(data.fields) do local block = minetest.deserialize(sblock) for node_key,mem in pairs(block) do - if mem then - if node_key ~= "used" and node_key ~= "best_before" then + if mem and node_key ~= "used" and node_key ~= "best_before" then + if key == nil or (type(mem) == "table" and mem[key] ~= nil) then local pos = keys_to_pos(block_key, node_key) local node = tubelib2.get_node_lvm(pos) - clbk(pos, node, mem) + if key ~= nil then + -- only specified 'key' + clbk(pos, node, {[key] = mem[key]}) + else + -- without specified 'key' + clbk(pos, node, mem) + end end end end diff --git a/tubelib2/tube_api.lua b/tubelib2/tube_api.lua index 48293cd..5358e54 100644 --- a/tubelib2/tube_api.lua +++ b/tubelib2/tube_api.lua @@ -16,12 +16,11 @@ tubelib2.version = 2.2 -- for lazy programmers -local S = function(pos) if pos then return minetest.pos_to_string(pos) end end +local P2S = function(pos) if pos then return minetest.pos_to_string(pos) end end local M = minetest.get_meta --- Load support for intllib. -local MP = minetest.get_modpath("tubelib2") -local I,_ = dofile(MP.."/intllib.lua") +-- Load support for I18n. +local S = tubelib2.S -- Cardinal directions, regardless of orientation local Dir2Str = {"north", "east", "south", "west", "down", "up"} @@ -119,8 +118,8 @@ local function update2(self, pos1, dir1, pos2, dir2) -- reset next tube(s) to head tube(s) again local param2 = self:encode_param2(dir1, dir2, 2) self:update_after_dig_tube(pos1, param2) - M(get_pos(pos1, dir1)):set_string("infotext", I("Maximum length reached!")) - M(get_pos(pos1, dir2)):set_string("infotext", I("Maximum length reached!")) + M(get_pos(pos1, dir1)):set_string("infotext", S("Maximum length reached!")) + M(get_pos(pos1, dir2)):set_string("infotext", S("Maximum length reached!")) return false end self:infotext(fpos1, fpos2) @@ -399,7 +398,7 @@ end -- The returned pos is the destination position, dir -- is the direction into the destination node. function Tube:get_connected_node_pos(pos, dir) - local key = S(pos) + local key = P2S(pos) if self.connCache[key] and self.connCache[key][dir] then local item = self.connCache[key][dir] return item.pos2, Turn180Deg[item.dir2] @@ -457,10 +456,10 @@ function Tube:prepare_pairing(pos, tube_dir, sFormspec) elseif tube_dir then meta:set_int("tube_dir", tube_dir) meta:set_string("channel", nil) - meta:set_string("infotext", I("Pairing is missing")) + meta:set_string("infotext", S("Pairing is missing")) meta:set_string("formspec", sFormspec) else - meta:set_string("infotext", I("Connection to a tube is missing!")) + meta:set_string("infotext", S("Connection to a tube is missing!")) end end @@ -477,7 +476,7 @@ function Tube:pairing(pos, channel) self.pairingList[channel] = pos local meta = M(pos) meta:set_string("channel", channel) - meta:set_string("infotext", I("Pairing is missing").." ("..channel..")") + meta:set_string("infotext", S("Pairing is missing (@1)", channel)) return false end end @@ -493,7 +492,7 @@ function Tube:stop_pairing(pos, oldmetadata, sFormspec) peer_meta:set_string("channel", nil) peer_meta:set_string("tele_pos", nil) peer_meta:set_string("formspec", sFormspec) - peer_meta:set_string("infotext", I("Pairing is missing")) + peer_meta:set_string("infotext", S("Pairing is missing")) end elseif oldmetadata.fields.channel then self.pairingList[oldmetadata.fields.channel] = nil diff --git a/tubelib2/tube_test.lua b/tubelib2/tube_test.lua index b925ae7..57f5722 100644 --- a/tubelib2/tube_test.lua +++ b/tubelib2/tube_test.lua @@ -82,9 +82,9 @@ Tube:register_on_tube_update(function(node, pos, out_dir, peer_pos, peer_in_dir) print(P2S(pos).." to the "..sdir..": Not connected") elseif Tube:is_secondary_node(peer_pos) then local node = minetest.get_node(peer_pos) - print(P2S(pos).." to the "..sdir..": Connected with "..node.name.." at "..P2S(peer_pos).."/"..peer_in_dir) + print(P2S(pos).." to the "..sdir..": Connected to "..node.name.." at "..P2S(peer_pos).."/"..peer_in_dir) else - print(P2S(pos).." to the "..sdir..": Connected with "..P2S(peer_pos).."/"..peer_in_dir) + print(P2S(pos).." to the "..sdir..": Connected to "..P2S(peer_pos).."/"..peer_in_dir) for i, pos, node in Tube:get_tube_line(pos, out_dir) do print("walk", P2S(pos), node.name) end @@ -127,6 +127,7 @@ minetest.register_node("tubelib2:tubeS", { }, on_rotate = screwdriver.disallow, -- important! paramtype = "light", + use_texture_alpha = "clip", sunlight_propagates = true, is_ground_content = false, groups = {crumbly = 3, cracky = 3, snappy = 3}, @@ -159,6 +160,7 @@ minetest.register_node("tubelib2:tubeA", { }, on_rotate = screwdriver.disallow, -- important! paramtype = "light", + use_texture_alpha = "clip", sunlight_propagates = true, is_ground_content = false, groups = {crumbly = 3, cracky = 3, snappy = 3, not_in_creative_inventory=1}, @@ -222,8 +224,6 @@ minetest.register_node("tubelib2:source", { paramtype2 = "facedir", -- important! on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - sunlight_propagates = true, is_ground_content = false, groups = {crumbly = 3, cracky = 3, snappy = 3}, sounds = default.node_sound_glass_defaults(), @@ -248,8 +248,6 @@ minetest.register_node("tubelib2:junction", { paramtype2 = "facedir", -- important! on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - sunlight_propagates = true, is_ground_content = false, groups = {crumbly = 3, cracky = 3, snappy = 3}, sounds = default.node_sound_glass_defaults(), @@ -352,8 +350,6 @@ minetest.register_node("tubelib2:teleporter", { paramtype2 = "facedir", -- important! on_rotate = screwdriver.disallow, -- important! - paramtype = "light", - sunlight_propagates = true, is_ground_content = false, groups = {crumbly = 3, cracky = 3, snappy = 3}, sounds = default.node_sound_glass_defaults(), @@ -438,7 +434,7 @@ minetest.register_node("tubelib2:tool", { description = "Tubelib2 Tool", inventory_image = "tubelib2_tool.png", wield_image = "tubelib2_tool.png", - use_texture_alpha = true, + use_texture_alpha = "clip", groups = {cracky=1, book=1}, on_use = remove_tube, on_place = repair_tube, diff --git a/unified_inventory/api.lua b/unified_inventory/api.lua index 8cc5532..1609217 100644 --- a/unified_inventory/api.lua +++ b/unified_inventory/api.lua @@ -43,7 +43,7 @@ minetest.after(0.01, function() end table.sort(ui.items_list) ui.items_list_size = #ui.items_list - print("Unified Inventory. inventory size: "..ui.items_list_size) + print("Unified Inventory. Inventory size: "..ui.items_list_size) for _, name in ipairs(ui.items_list) do local def = minetest.registered_items[name] -- Simple drops @@ -133,19 +133,62 @@ minetest.after(0.01, function() end end end + + -- Step 1: group-indexed lookup table for items + local spec_matcher = {} + for _, name in ipairs(ui.items_list) do + -- we only need to care about groups, exact items are handled separately + for group, value in pairs(minetest.registered_items[name].groups) do + if value and value ~= 0 then + if not spec_matcher[group] then + spec_matcher[group] = {} + end + spec_matcher[group][name] = true + end + end + end + + -- Step 2: Find all matching items for the given spec (groups) + local function get_matching_spec_items(specname) + if specname:sub(1,6) ~= "group:" then + return { [specname] = true } + end + + local accepted = {} + for i, group in ipairs(specname:sub(7):split(",")) do + if i == 1 then + -- First step: Copy all possible item names in this group + for name, _ in pairs(spec_matcher[group] or {}) do + accepted[name] = true + end + else + -- Perform filtering + if spec_matcher[group] then + for name, _ in pairs(accepted) do + accepted[name] = spec_matcher[group][name] + end + else + -- No matching items + return {} + end + end + end + return accepted + end + for _, recipes in pairs(ui.crafts_for.recipe) do + -- List of crafts that return this item string (variable "_") for _, recipe in ipairs(recipes) do local ingredient_items = {} for _, spec in pairs(recipe.items) do - local matches_spec = ui.canonical_item_spec_matcher(spec) - for _, name in ipairs(ui.items_list) do - if matches_spec(name) then - ingredient_items[name] = true - end + -- Get items that fit into this spec (group or item name) + local specname = ItemStack(spec):get_name() + for item_name, _ in pairs(get_matching_spec_items(specname)) do + ingredient_items[item_name] = true end end for name, _ in pairs(ingredient_items) do - if ui.crafts_for.usage[name] == nil then + if not ui.crafts_for.usage[name] then ui.crafts_for.usage[name] = {} end table.insert(ui.crafts_for.usage[name], recipe) diff --git a/unified_inventory/callbacks.lua b/unified_inventory/callbacks.lua index af2c127..fa6d03a 100644 --- a/unified_inventory/callbacks.lua +++ b/unified_inventory/callbacks.lua @@ -14,19 +14,17 @@ end minetest.register_on_joinplayer(function(player) local player_name = player:get_player_name() unified_inventory.players[player_name] = {} - unified_inventory.current_index[player_name] = 1 + unified_inventory.current_index[player_name] = 1 -- Item (~page) index unified_inventory.filtered_items_list[player_name] = - unified_inventory.items_list + unified_inventory.items_list unified_inventory.activefilter[player_name] = "" unified_inventory.active_search_direction[player_name] = "nochange" - unified_inventory.apply_filter(player, "", "nochange") unified_inventory.current_searchbox[player_name] = "" unified_inventory.current_category[player_name] = "all" unified_inventory.current_category_scroll[player_name] = 0 unified_inventory.alternate[player_name] = 1 unified_inventory.current_item[player_name] = nil unified_inventory.current_craft_direction[player_name] = "recipe" - unified_inventory.set_inventory_formspec(player, unified_inventory.default) -- Refill slot local refill = minetest.create_detached_inventory(player_name.."refill", { @@ -48,6 +46,14 @@ minetest.register_on_joinplayer(function(player) refill:set_size("main", 1) end) +minetest.register_on_mods_loaded(function() + minetest.register_on_joinplayer(function(player) + -- After everything is initialized, set up the formspec + ui.apply_filter(player, "", "nochange") + ui.set_inventory_formspec(player, unified_inventory.default) + end) +end) + local function apply_new_filter(player, search_text, new_dir) local player_name = player:get_player_name() @@ -244,11 +250,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) unified_inventory.current_page[player_name]) end) -if minetest.delete_detached_inventory then - minetest.register_on_leaveplayer(function(player) - local player_name = player:get_player_name() - minetest.delete_detached_inventory(player_name.."_bags") - minetest.delete_detached_inventory(player_name.."craftrecipe") - minetest.delete_detached_inventory(player_name.."refill") - end) -end +minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + minetest.remove_detached_inventory(player_name.."_bags") + minetest.remove_detached_inventory(player_name.."refill") +end) diff --git a/unified_inventory/group.lua b/unified_inventory/group.lua index 3864267..2bc8e2f 100644 --- a/unified_inventory/group.lua +++ b/unified_inventory/group.lua @@ -1,30 +1,5 @@ local S = minetest.get_translator("unified_inventory") -function unified_inventory.canonical_item_spec_matcher(spec) - local specname = ItemStack(spec):get_name() - if specname:sub(1, 6) ~= "group:" then - return function (itemname) - return itemname == specname - end - end - - local group_names = specname:sub(7):split(",") - return function (itemname) - local itemdef = minetest.registered_items[itemname] - for _, group_name in ipairs(group_names) do - if (itemdef.groups[group_name] or 0) == 0 then - return false - end - end - return true - end -end - -function unified_inventory.item_matches_spec(item, spec) - local itemname = ItemStack(item):get_name() - return unified_inventory.canonical_item_spec_matcher(spec)(itemname) -end - function unified_inventory.extract_groupnames(groupname) local specname = ItemStack(groupname):get_name() if specname:sub(1, 6) ~= "group:" then @@ -34,22 +9,6 @@ function unified_inventory.extract_groupnames(groupname) return table.concat(group_names, S(" and ")), #group_names end -unified_inventory.registered_group_items = { - mesecon_conductor_craftable = "mesecons:wire_00000000_off", - stone = "default:cobble", - wood = "default:wood", - book = "default:book", - sand = "default:sand", - leaves = "default:leaves", - tree = "default:tree", - vessel = "vessels:glass_bottle", - wool = "wool:white", -} - -function unified_inventory.register_group_item(groupname, itemname) - unified_inventory.registered_group_items[groupname] = itemname -end - -- This is used when displaying craft recipes, where an ingredient is -- specified by group rather than as a specific item. A single-item group diff --git a/unified_inventory/init.lua b/unified_inventory/init.lua index 98ee2e5..1b962da 100644 --- a/unified_inventory/init.lua +++ b/unified_inventory/init.lua @@ -1,5 +1,11 @@ -- Unified Inventory +if not minetest.features.formspec_version_element then + -- At least formspec_version[] is the minimal feature requirement + error("Unified Inventory requires Minetest version 5.4.0 or newer.\n" .. + " Please update Minetest or use an older version of Unified Inventory.") +end + local modpath = minetest.get_modpath(minetest.get_current_modname()) local worldpath = minetest.get_worldpath() @@ -44,9 +50,9 @@ unified_inventory = { trash_enabled = (minetest.settings:get_bool("unified_inventory_trash") ~= false), imgscale = 1.25, list_img_offset = 0.13, - standard_background = "background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", + standard_background = "bgcolor[#0000]background9[0,0;1,1;ui_formbg_9_sliced.png;true;16]", - version = 3 + version = 4 } local ui = unified_inventory @@ -59,10 +65,16 @@ ui.style_full = { formspec_y = 1, formw = 17.75, formh = 12.25, + -- Item browser size, pos pagecols = 8, pagerows = 9, page_x = 10.75, page_y = 2.30, + -- Item browser controls + page_buttons_x = 11.60, + page_buttons_y = 10.15, + searchwidth = 3.4, + -- Crafting grid positions craft_x = 2.8, craft_y = 1.15, craftresult_x = 7.8, @@ -74,13 +86,15 @@ ui.style_full = { craft_guide_resultstr_x = 0.3, craft_guide_resultstr_y = 0.6, give_btn_x = 0.25, + -- Tab switching buttons main_button_x = 0.4, main_button_y = 11.0, - page_buttons_x = 11.60, - page_buttons_y = 10.15, - searchwidth = 3.4, + main_button_cols = 12, + main_button_rows = 1, + -- Tab title position form_header_x = 0.4, form_header_y = 0.4, + -- Generic sizes btn_spc = 0.85, btn_size = 0.75, std_inv_x = 0.3, @@ -92,10 +106,16 @@ ui.style_lite = { formspec_y = 0.6, formw = 14, formh = 9.75, + -- Item browser size, pos pagecols = 4, pagerows = 5, page_x = 10.5, page_y = 2.15, + -- Item browser controls + page_buttons_x = 10.5, + page_buttons_y = 6.15, + searchwidth = 1.6, + -- Crafting grid positions craft_x = 2.6, craft_y = 0.75, craftresult_x = 5.75, @@ -107,13 +127,15 @@ ui.style_lite = { craft_guide_resultstr_x = 0.15, craft_guide_resultstr_y = 0.35, give_btn_x = 0.15, + -- Tab switching buttons main_button_x = 10.5, main_button_y = 8.15, - page_buttons_x = 10.5, - page_buttons_y = 6.15, - searchwidth = 1.6, + main_button_cols = 4, + main_button_rows = 2, + -- Tab title position form_header_x = 0.2, form_header_y = 0.2, + -- Generic sizes btn_spc = 0.8, btn_size = 0.7, std_inv_x = 0.1, @@ -170,3 +192,4 @@ end dofile(modpath.."/item_names.lua") dofile(modpath.."/waypoints.lua") +dofile(modpath.."/legacy.lua") -- mod compatibility diff --git a/unified_inventory/internal.lua b/unified_inventory/internal.lua index b49906e..938ca19 100644 --- a/unified_inventory/internal.lua +++ b/unified_inventory/internal.lua @@ -18,7 +18,7 @@ function ui.demangle_for_formspec(str) return string.gsub(str, "_([0-9]+)_", function (v) return string.char(v) end) end - +-- Get the player-specific unified_inventory style function ui.get_per_player_formspec(player_name) local draw_lite_mode = ui.lite_mode and not minetest.check_player_privs(player_name, {ui_full=true}) @@ -27,6 +27,7 @@ function ui.get_per_player_formspec(player_name) return style end +-- Creates an item image or regular image button with a tooltip local function formspec_button(ui_peruser, name, image, offset, pos, scale, label) local element = 'image_button' if minetest.registered_items[image] then @@ -43,9 +44,8 @@ local function formspec_button(ui_peruser, name, image, offset, pos, scale, labe string.format("tooltip[%s;%s]", name, F(label or name)) end -local function formspec_add_filters(player, formspec, style) - local button_row = 0 - local button_col = 0 +-- Add registered buttons (tabs) +local function formspec_tab_buttons(player, formspec, style) local n = #formspec + 1 -- Main buttons @@ -58,32 +58,50 @@ local function formspec_add_filters(player, formspec, style) end end + local needs_scrollbar = #filtered_inv_buttons > style.main_button_cols * style.main_button_rows + + formspec[n] = ("scroll_container[%g,%g;%g,%g;tabbtnscroll;vertical]"):format( + style.main_button_x, style.main_button_y, -- position + style.main_button_cols * style.btn_spc, style.main_button_rows -- size + ) + n = n + 1 + for i, def in pairs(filtered_inv_buttons) do - if style.is_lite_mode and i > 4 then - button_row = 1 - button_col = 1 - end + local pos_x = ((i - 1) % style.main_button_cols) * style.btn_spc + local pos_y = math.floor((i - 1) / style.main_button_cols) * style.btn_spc if def.type == "image" then - local pos_x = style.main_button_x + style.btn_spc * (i - 1) - button_col * style.btn_spc * 4 - local pos_y = style.main_button_y + button_row * style.btn_spc if (def.condition == nil or def.condition(player) == true) then - formspec[n] = string.format("image_button[%f,%f;%f,%f;%s;%s;]", + formspec[n] = string.format("image_button[%g,%g;%g,%g;%s;%s;]", pos_x, pos_y, style.btn_size, style.btn_size, F(def.image), F(def.name)) formspec[n+1] = "tooltip["..F(def.name)..";"..(def.tooltip or "").."]" n = n+2 else - formspec[n] = string.format("image[%f,%f;%f,%f;%s^[colorize:#808080:alpha]", + formspec[n] = string.format("image[%g,%g;%g,%g;%s^[colorize:#808080:alpha]", pos_x, pos_y, style.btn_size, style.btn_size, def.image) n = n+1 end end end + formspec[n] = "scroll_container_end[]" + if needs_scrollbar then + formspec[n+1] = ("scrollbaroptions[max=%i;arrows=hide]"):format( + -- This calculation is not 100% accurate but "good enough" + math.ceil((#filtered_inv_buttons - 1) / style.main_button_cols) * style.btn_spc * 5 + ) + formspec[n+2] = ("scrollbar[%g,%g;0.4,%g;vertical;tabbtnscroll;0]"):format( + style.main_button_x + style.main_button_cols * style.btn_spc - 0.1, -- x pos + style.main_button_y, -- y pos + style.main_button_rows * style.btn_spc -- height + ) + formspec[n+3] = "scrollbaroptions[max=1000;arrows=default]" + end end +-- Add category GUI elements (top right) local function formspec_add_categories(player, formspec, ui_peruser) local player_name = player:get_player_name() local n = #formspec + 1 @@ -97,9 +115,9 @@ local function formspec_add_categories(player, formspec, ui_peruser) ui_peruser.form_header_y - (ui_peruser.is_lite_mode and 0 or 0.2) } - formspec[n] = string.format("background9[%f,%f;%f,%f;%s;false;3]", - ui_peruser.page_x-0.1, categories_scroll_pos[2], - (ui_peruser.btn_spc * ui_peruser.pagecols) + 0.13, 1.4 + (ui_peruser.is_lite_mode and 0 or 0.2), + formspec[n] = string.format("background9[%f,%f;%f,%f;%s;false;16]", + ui_peruser.page_x-0.15, categories_scroll_pos[2], + (ui_peruser.btn_spc * ui_peruser.pagecols) + 0.2, 1.4 + (ui_peruser.is_lite_mode and 0 or 0.2), "ui_smallbg_9_sliced.png") n = n + 1 @@ -238,8 +256,14 @@ local function formspec_add_item_browser(player, formspec, ui_peruser) ui_peruser.btn_size, ui_peruser.btn_size, name, button_name ) + local tooltip = item.description + if item.mod_origin then + -- "mod_origin" may not be specified for items that were + -- registered in a callback (during or before ServerEnv init) + tooltip = tooltip .. " [" .. item.mod_origin .. "]" + end formspec[n + 1] = ("tooltip[%s;%s]"):format( - button_name, minetest.formspec_escape(item.description) + button_name, minetest.formspec_escape(tooltip) ) n = n + 2 list_index = list_index + 1 @@ -280,7 +304,7 @@ function ui.get_formspec(player, page) fs[#fs + 1] = fsdata.formspec - formspec_add_filters(player, fs, ui_peruser) + formspec_tab_buttons(player, fs, ui_peruser) if fsdata.draw_inventory ~= false then -- Player inventory @@ -378,3 +402,13 @@ function ui.apply_filter(player, filter, search_dir) ui.active_search_direction[player_name] = search_dir ui.set_inventory_formspec(player, ui.current_page[player_name]) end + +-- Inform players about potential visual issues +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + local info = minetest.get_player_information(player_name) + if info and (info.formspec_version or 0) < 4 then + minetest.chat_send_player(player_name, S("Unified Inventory: Your game version is too old" + .. " and does not support the GUI requirements. You might experience visual issues.")) + end +end) diff --git a/unified_inventory/legacy.lua b/unified_inventory/legacy.lua new file mode 100644 index 0000000..5b62894 --- /dev/null +++ b/unified_inventory/legacy.lua @@ -0,0 +1,55 @@ +-- Inefficient pattern matching + +local warned_funcs = {} +local function LOG_ONCE(funcname) + if warned_funcs[funcname] then return end + warned_funcs[funcname] = true + minetest.log("error", "Call to undocumented, deprecated API '" .. funcname .. "'." + .. " In a future version of Unified Inventory this will result in a real error.") +end + +function unified_inventory.canonical_item_spec_matcher(spec) + LOG_ONCE("canonical_item_spec_matcher") + local specname = ItemStack(spec):get_name() + if specname:sub(1, 6) ~= "group:" then + return function (itemname) + return itemname == specname + end + end + + local group_names = specname:sub(7):split(",") + return function (itemname) + local itemdef = minetest.registered_items[itemname] + for _, group_name in ipairs(group_names) do + if (itemdef.groups[group_name] or 0) == 0 then + return false + end + end + return true + end +end + +function unified_inventory.item_matches_spec(item, spec) + LOG_ONCE("item_matches_spec") + local itemname = ItemStack(item):get_name() + return unified_inventory.canonical_item_spec_matcher(spec)(itemname) +end + + +unified_inventory.registered_group_items = { + mesecon_conductor_craftable = "mesecons:wire_00000000_off", + stone = "default:cobble", + wood = "default:wood", + book = "default:book", + sand = "default:sand", + leaves = "default:leaves", + tree = "default:tree", + vessel = "vessels:glass_bottle", + wool = "wool:white", +} + +function unified_inventory.register_group_item(groupname, itemname) + LOG_ONCE("register_group_item") + unified_inventory.registered_group_items[groupname] = itemname +end + diff --git a/unified_inventory/screenshot.png b/unified_inventory/screenshot.png index 972cbb469dba9b2c976c7582d91110dc9d765c20..bf9e6be3a99fa8857eb9947970857579f274a672 100644 GIT binary patch literal 225046 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∈<|Q%!d8>4RF}4< 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 literal 137234 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 diff --git a/unified_inventory/textures/ui_formbg_9_sliced.png b/unified_inventory/textures/ui_formbg_9_sliced.png index 0b8463cac7019cb7d7c4fc7775fed914958eba81..817ced5edcc94e5f9f957967af4c8b297b1b5bbb 100644 GIT binary patch literal 510 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-s)d4;su0Yy|2w-k*4paps0|Nt- zl9F}_t&?3p1OM%vFmIV0)GlZ>PEU9X8-`%{*?p&13rx@uQ*N?Gwc=PvC5tF#Dj+r)xD0 z4i5i?A8_C1T@-QG*-KN@y)pZ6zKs0myr}-ajmdL&$<#j2yYp#-%-KuVBR@HWeeag^ z{<3EN&)^w+Zssli3*2Ta^7`NZ{M;%3?d3ujmn`$xIrhBTI_rvC^;bO07OdNI%KK~0 z!Raw+bE_B_`1qn*c~<2*urvI*wB^Ji)1~|gk5_c6PmsIFW^T@Fl4NSN(TtZ& z9n0iyehFsz81=ces@G9gGX4Y~YnJ~Hr%n4==Q$WP{&T2U|8;(j=P%cziVA&_g%dg# z2gw|Jv}3w>*N#n3mTIhvt=xFppZ#Z{l0|*qznN`<^4q7E0Yj3()78&qol`;+0A$wS AZU6uP delta 223 zcmeyz{DEG&-^M|-(Lg5zAJ zO^+-d%nJRtCGXkEwzL{=OKt&*4=}GU5fL4S(-5Pi0v9)YT=9Yony|9$hvLkRhI~elF{r G5}E)}URaI* diff --git a/unified_inventory/textures/ui_smallbg_9_sliced.png b/unified_inventory/textures/ui_smallbg_9_sliced.png index 865e0c965c47dc4e224e5f5bef279e547168d408..916b14635462fe6c2c4db565efcacae012742568 100644 GIT binary patch literal 551 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sT>(BJu0Yy|2w-k*4papsLqkKu z!otGC!=s|2l9H10^78WY^Q)_?8yXr~T3UK~diwhMCQX_&dGh3`Q>V_FHEZF*g-ez! zS+#1_>eZ{)uV24m!-h?pHf`R#dFRfZd-m)(aNxkfg9i^CI&}E(;f?hQ-9Xpql?3?( zGlhTi$0@+3uWfojL{WsGa4Sru_GRE*3Vs9Z_`bsIbN3r#nm+7XLXle^TPQ`OEYD zZ23>Vyli1{GW8VmM{P&DSfS^S!_q8#()HpFoWCqEi-Ex^_t~G+IF5Ped9N}a@Y-%A zz{T=)S`>rSTQ{{S3CZrJ28;GS$zsy~eu825q^?TE9cyw5eotG;wdQT?hm?hNPKve) z*=kcxhB2jdUTv+Y8shx~UY{4;^=I`;)hY7tfnm(x>FVdQ&MBb@0Oy(^b delta 122 zcmZ3^(#<$QqL_)9fq_9QM^FSv@dWsUxB}_k-rkm$ma3{M88N^4Kt4-JkY6yv&6_vp z+0}rRd%8G=Xq->xaAo3&T>T(H)%jn&#gCH{4l}S%TRbO_kBwb*=K>X#DJpCXDVd(8 U(j6~+fu=Bcy85}Sb4q9e05rlRyZ`_I