From 1088fb8bfb22a0661db4c45245529d539b9adb61 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sat, 4 Feb 2023 15:45:23 +0100 Subject: [PATCH] built on 04/02/2023 15:45:23 --- hyperloop/elevator.lua | 12 +- hyperloop/tube.lua | 12 +- minecart/README.md | 41 ++++ minecart/beduino.lua | 93 +++++++++ minecart/hopperlib.lua | 4 +- minecart/init.lua | 5 +- minecart/monitoring.lua | 23 ++- minecart/terminal.lua | 46 ++++- signs_bot/cmd_move.lua | 4 +- signs_bot/nodes.lua | 6 +- techage/README.md | 13 ++ techage/basic_machines/forceload.lua | 5 + techage/basic_machines/grinder.lua | 2 +- techage/basic_machines/pusher.lua | 2 +- techage/basic_machines/quarry.lua | 8 + techage/basic_machines/ta4_chest.lua | 30 +++ techage/basis/fly_lib.lua | 223 ++++++++------------- techage/basis/node_states.lua | 16 +- techage/beduino/kv_store.lua | 2 +- techage/digtron/battery.lua | 2 +- techage/doc/items.lua | 2 +- techage/doc/manual_DE.lua | 6 +- techage/doc/manual_EN.lua | 4 +- techage/fusion_reactor/controller.lua | 2 - techage/fusion_reactor/magnet.lua | 2 - techage/init.lua | 8 +- techage/items/cement.lua | 7 + techage/items/silicon.lua | 22 +- techage/lamps/growlight.lua | 16 ++ techage/liquids/pump.lua | 2 +- techage/logic/button.lua | 14 +- techage/logic/button_2x.lua | 11 + techage/logic/button_4x.lua | 11 + techage/logic/detector.lua | 96 ++++++++- techage/logic/signallamp.lua | 18 +- techage/manuals/manual_ta3_DE.md | 6 +- techage/manuals/manual_ta3_EN.md | 4 +- techage/manuals/ta4_lua_controller_EN.md | 6 +- techage/manuals/ta_iom.md | 85 -------- techage/manuals/ta_kvstore.md | 4 +- techage/manuals/toc_DE.md | 2 +- techage/manuals/toc_EN.md | 2 +- techage/move_controller/flycontroller.lua | 37 ++-- techage/move_controller/movecontroller.lua | 16 -- techage/move_controller/soundblock.lua | 3 +- techage/power/formspecs.lua | 1 + techage/ta3_power/tiny_generator.lua | 4 +- techage/tools/repairkit.lua | 29 ++- unified_inventory/README.md | 13 ++ unified_inventory/api.lua | 55 ++--- unified_inventory/bags.lua | 65 +++--- unified_inventory/callbacks.lua | 57 +++--- unified_inventory/doc/mod_api.txt | 4 +- unified_inventory/group.lua | 60 ++++++ unified_inventory/internal.lua | 8 +- unified_inventory/match_craft.lua | 19 +- unified_inventory/register.lua | 8 +- unified_inventory/sounds/birds.ogg | Bin 14797 -> 0 bytes unified_inventory/sounds/owl.ogg | Bin 50950 -> 0 bytes unified_inventory/sounds/ui_click.ogg | Bin 0 -> 6125 bytes unified_inventory/sounds/ui_morning.ogg | Bin 0 -> 23446 bytes unified_inventory/sounds/ui_owl.ogg | Bin 0 -> 14621 bytes 62 files changed, 800 insertions(+), 458 deletions(-) create mode 100644 minecart/beduino.lua delete mode 100644 techage/manuals/ta_iom.md delete mode 100644 unified_inventory/sounds/birds.ogg delete mode 100644 unified_inventory/sounds/owl.ogg create mode 100644 unified_inventory/sounds/ui_click.ogg create mode 100644 unified_inventory/sounds/ui_morning.ogg create mode 100644 unified_inventory/sounds/ui_owl.ogg diff --git a/hyperloop/elevator.lua b/hyperloop/elevator.lua index bf13343..719fe3d 100644 --- a/hyperloop/elevator.lua +++ b/hyperloop/elevator.lua @@ -212,8 +212,12 @@ minetest.register_node("hyperloop:shaft2", { light_source = 2, sunlight_propagates = true, is_ground_content = false, + ----- To be unbreakable ----- + on_blast = function() end, + on_destruct = function () end, + can_dig = function() return false end, diggable = false, - groups = {cracky = 1, not_in_creative_inventory=1}, + groups = {cracky = 1, not_in_creative_inventory=1, unbreakable=1}, sounds = default.node_sound_metal_defaults(), }) @@ -255,8 +259,12 @@ minetest.register_node("hyperloop:shaftA2", { light_source = 2, sunlight_propagates = true, is_ground_content = false, + ----- To be unbreakable ----- + on_blast = function() end, + on_destruct = function () end, + can_dig = function() return false end, diggable = false, - groups = {cracky = 1, not_in_creative_inventory=1}, + groups = {cracky = 1, not_in_creative_inventory=1, unbreakable=1}, sounds = default.node_sound_metal_defaults(), }) diff --git a/hyperloop/tube.lua b/hyperloop/tube.lua index 94e2f43..b1ad8b5 100644 --- a/hyperloop/tube.lua +++ b/hyperloop/tube.lua @@ -173,8 +173,12 @@ minetest.register_node("hyperloop:tubeS2", { light_source = 2, sunlight_propagates = true, is_ground_content = false, + ----- To be unbreakable ----- + on_blast = function() end, + on_destruct = function () end, + can_dig = function() return false end, diggable = false, - groups = {cracky = 1, not_in_creative_inventory=1}, + groups = {cracky = 1, not_in_creative_inventory=1, unbreakable=1}, sounds = default.node_sound_metal_defaults(), }) @@ -263,8 +267,12 @@ minetest.register_node("hyperloop:tubeA2", { light_source = 2, sunlight_propagates = true, is_ground_content = false, + ----- To be unbreakable ----- + on_blast = function() end, + on_destruct = function () end, + can_dig = function() return false end, diggable = false, - groups = {cracky = 1, not_in_creative_inventory=1}, + groups = {cracky = 1, not_in_creative_inventory=1, unbreakable=1}, sounds = default.node_sound_metal_defaults(), }) diff --git a/minecart/README.md b/minecart/README.md index f2f8747..622ebaf 100644 --- a/minecart/README.md +++ b/minecart/README.md @@ -44,6 +44,7 @@ The mod features are: - Ingame documentation (German and English), based on the mod "doc" - API to register carts from other mods - chat command '/mycart ' to output cart state and location +- Command interface for Techage (Lua and ICTA) and for Beduino Controllers Technical Background @@ -118,6 +119,45 @@ The "No speed limit" sign can be used to remove the speed limit. The speed limit signs must be placed next to the track so that they can be read from the cart. This allows different speeds in each direction of travel. +## Command Interface + +### Techage ICTA Controller + +The ICTA Controller support the conditions: + +- "read cart state" (function returns "stopped" or "running") +- "read cart location" (function returns the distance or the station/buffer name) + +See help page of the ICTA controller block. + +### Techage Lua Controller + +The Lua controller support the functions: + +- `$cart_state(num)` (function returns "stopped" or "running") +- `$cart_location(num)` (function returns the distance or the station/buffer name) + +See help page of the Lua controller block. + +### Cart Terminal + +The Cart Terminal has a Techage command interface with the commands: + +| Command | Data | Description | +| ---------- | ---------- | ------------------------------------------------------- | +| `state` | \ | Returns `unknown`, `stopped`, or `running` | +| `distance` | \ | Returns the distance from the cart to the Cart Terminal | + +### Beduino Controller + +The Cart Terminal has a Beduino command interface with the commands: + +| Command | Topic | Data | Response | Description | +| -------- | ----- | --------- | ---------- | ------------------------------------------------------- | +| State | 129 | [cart-id] | [state] | Returns 0 = UNKNOWN, 1 = STOPPED, 2 = RUNNING | +| Distance | 130 | [cart-id] | [distance] | Returns the distance from the cart to the Cart Terminal | + + Migration to v2 --------------- @@ -153,3 +193,4 @@ History Speed limit signs and cart terminal added 2021-09-02 V2.01 Chat command /stopcart added 2021-10-18 V2.02 Cart reproduction bug fixed +2023-01-04 V2.03 Techage and Beduino command interface added \ No newline at end of file diff --git a/minecart/beduino.lua b/minecart/beduino.lua new file mode 100644 index 0000000..9ecd2fa --- /dev/null +++ b/minecart/beduino.lua @@ -0,0 +1,93 @@ +--[[ + + Minecart + ======== + + Copyright (C) 2019-2023 Joachim Stolberg + + MIT + See license.txt for more information + +]]-- + +local minecart_lib = [[ +// Minecart library for reading status and distance +// from running carts. To do this, a cart terminal +// must be connected to an I/O Module. + +import "lib/techage.c" + +var payload[1]; +var resp[1]; + + +// Read cart state. +// Parameters: +// - ip_port: IOM port to the Cart Terminal +// - card_id: Cart number +// Function returns: +// - 0 for unknown/missing +// - 1 for stopped +// - 2 for running +func mc_get_state(io_port, cart_id) { + var sts; + + payload[0] = cart_id; + request_data(io_port, 129, payload, resp); + if(sts == 0) { + return resp[0]; + } + return 0; +} + +// Read cart distance. +// Parameters: +// - ip_port: IOM port to the Cart Terminal +// - card_id: Cart number +// Function returns the distance between +// Cart Terminal and cart in meter. +func mc_get_distance(io_port, cart_id) { + var sts; + + payload[0] = cart_id; + request_data(io_port, 130, payload, resp); + if(sts == 0) { + return resp[0]; + } + return 0; +} +]] + +local minecart_demo = [[ +import "sys/stdio.asm" +import "sys/os.c" +import "lib/minecart.c" + +func init() { + setstdout(1); // use terminal window for stdout + putstr("### Minecart Demo ###\n"); +} + +func cart_state(io_port, cart_id) { + putstr("Cart #"); + putnum(cart_id); + putstr(": state = "); + putnum(mc_get_state(io_port, cart_id)); + putstr(", distance = "); + putnum(mc_get_distance(io_port, cart_id)); + putstr("\n"); +} + +func loop() { + // Adapt IO port and cart ID to your needs + cart_state(0, 1); + sleep(20); +} +]] + +minetest.register_on_mods_loaded(function() + if minetest.global_exists("vm16") and minetest.global_exists("beduino") then + vm16.register_ro_file("beduino", "lib/minecart.c", minecart_lib) + vm16.register_ro_file("beduino", "demo/minecart.c", minecart_demo) + end +end) \ No newline at end of file diff --git a/minecart/hopperlib.lua b/minecart/hopperlib.lua index 6f2a583..d04ad05 100644 --- a/minecart/hopperlib.lua +++ b/minecart/hopperlib.lua @@ -94,8 +94,8 @@ function minecart.untake_items(pos, param2, stack) local def = RegisteredInventories[node.name] local inv = minetest.get_inventory({type="node", pos=npos}) - if def and inv and def.put_listname then - return inv:add_item(def.put_listname, stack) + if def and inv and def.take_listname then + return inv:add_item(def.take_listname, stack) elseif def and def.untake_item then return def.untake_item(npos, stack) else diff --git a/minecart/init.lua b/minecart/init.lua index 77b140d..e30d189 100644 --- a/minecart/init.lua +++ b/minecart/init.lua @@ -3,7 +3,7 @@ Minecart ======== - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2023 Joachim Stolberg MIT See license.txt for more information @@ -13,7 +13,7 @@ minecart = {} -- Version for compatibility checks, see readme.md/history -minecart.version = 2.02 +minecart.version = 2.03 minecart.hopper_enabled = minetest.settings:get_bool("minecart_hopper_enabled") ~= false minecart.teleport_enabled = minetest.settings:get_bool("minecart_teleport_enabled") == true @@ -39,6 +39,7 @@ dofile(MP .. "/protection.lua") dofile(MP .. "/signs.lua") dofile(MP .. "/terminal.lua") dofile(MP .. "/pusher.lua") +dofile(MP .. "/beduino.lua") if minecart.hopper_enabled then dofile(MP .. "/hopper.lua") diff --git a/minecart/monitoring.lua b/minecart/monitoring.lua index 82e3b03..c3e0242 100644 --- a/minecart/monitoring.lua +++ b/minecart/monitoring.lua @@ -3,7 +3,7 @@ Minecart ======== - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2023 Joachim Stolberg MIT See license.txt for more information @@ -90,7 +90,22 @@ local function get_cart_state_and_loc(name, userID, query_pos) end end return "unknown", 0, "unknown" -end +end + +-- Return the cart distance to the query_pos. +local function get_cart_distance(name, userID, query_pos) + if tCartsOnRail[name] and tCartsOnRail[name][userID] then + local cart = tCartsOnRail[name][userID] + if cart.last_pos or cart.pos then + if cart.objID == 0 then -- stopped + return math.floor(vector.distance(cart.pos or cart.last_pos, query_pos)) + else + return math.floor(vector.distance(cart.last_pos or cart.pos, query_pos)) + end + end + end + return 0 +end local function get_cart_info(owner, userID, query_pos) local state, loc, name = get_cart_state_and_loc(owner, userID, query_pos) @@ -318,6 +333,10 @@ function minecart.cmnd_cart_location(name, userID, query_pos) return loc end +function minecart.cmnd_cart_distance(name, userID, query_pos) + return get_cart_distance(name, userID, query_pos) +end + function minecart.get_cart_list(pos, name) local userIDs = {} local carts = {} diff --git a/minecart/terminal.lua b/minecart/terminal.lua index 60420de..64e4b71 100644 --- a/minecart/terminal.lua +++ b/minecart/terminal.lua @@ -3,7 +3,7 @@ Minecart ======== - Copyright (C) 2019-2021 Joachim Stolberg + Copyright (C) 2019-2023 Joachim Stolberg MIT See license.txt for more information @@ -59,6 +59,11 @@ minetest.register_node("minecart:terminal", { local meta = M(pos) meta:set_string("owner", placer:get_player_name()) meta:set_string("formspec", formspec(pos, "")) + if minetest.global_exists("techage") then + local number = techage.add_node(pos, "minecart:terminal") + meta:set_string("node_number", number) + meta:set_string("infotext", "Cart Terminal " .. number) + end minetest.get_node_timer(pos):start(2) end, @@ -88,3 +93,42 @@ minetest.register_craft({ {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, }, }) + +minetest.register_on_mods_loaded(function() + if minetest.global_exists("techage") then + techage.register_node({"minecart:terminal"}, { + on_recv_message = function(pos, src, topic, payload) + local number = tonumber(payload) + if number then + local owner = M(pos):get_string("owner") + if topic == "state" then + return minecart.cmnd_cart_state(owner, number) + elseif topic == "distance" then + return minecart.cmnd_cart_distance(owner, number, pos) + else + return "unsupported" + end + end + end, + on_beduino_receive_cmnd = function(pos, src, topic, payload) + return 2 -- unknown or invalid topic + end, + on_beduino_request_data = function(pos, src, topic, payload) + if topic == 128 then + return 0, "minecart:terminal" + elseif topic == 129 then -- state + local owner = M(pos):get_string("owner") + local STATE = {unknown = 0, stopped = 1, running = 2} + local state = STATE[minecart.cmnd_cart_state(owner, payload[1])] or 0 + return 0, {state} + elseif topic == 130 then -- distance + local owner = M(pos):get_string("owner") + local dist = minecart.cmnd_cart_distance(owner, payload[1], pos) + return 0, {dist} + else + return 2, "" -- topic is unknown or invalid + end + end, + }) + end +end) \ No newline at end of file diff --git a/signs_bot/cmd_move.lua b/signs_bot/cmd_move.lua index df51d01..abd0497 100644 --- a/signs_bot/cmd_move.lua +++ b/signs_bot/cmd_move.lua @@ -268,9 +268,11 @@ signs_bot.register_botcommand("fall_down", { local sts, pos3 = minetest.line_of_sight(pos1, pos2) if sts == false then sts, _ = minetest.spawn_falling_node(mem.robot_pos) + mem.stored_node = get_node_lvm(pos3) + minetest.swap_node(pos3, {name="air"}) if sts then mem.bot_falling = 2 - mem.robot_pos = {x=pos3.x, y=pos3.y+1, z=pos3.z} + mem.robot_pos = {x=pos3.x, y=pos3.y, z=pos3.z} return signs_bot.BUSY end end diff --git a/signs_bot/nodes.lua b/signs_bot/nodes.lua index c08c86e..83983a9 100644 --- a/signs_bot/nodes.lua +++ b/signs_bot/nodes.lua @@ -52,7 +52,7 @@ end if farming.mod == "redo" then local fp_grows = function(def, step) local crop = def.crop .. "_" .. step - local node = minetest.registered_nodes[crop] + 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 @@ -63,7 +63,9 @@ if farming.mod == "redo" then -- 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 + if step then + while fp_grows(def, step) do step = step + 1 end + end end end end diff --git a/techage/README.md b/techage/README.md index 1e6fcd3..fc4d2ef 100644 --- a/techage/README.md +++ b/techage/README.md @@ -89,6 +89,19 @@ Available worlds will be converted to 'lsqlite3', but there is no way back, so: ### History +**2023-02-04 V1.10** +- Improve flycontroller +- Remove handover for movecontroller +- Rename "techage:signal_lamp" to "techage:color_lamp" +- Rename "techage:signal_lamp2" to "techage:color_lamp2" +- Add countdown mode to TA4 Detector +- Adapt to new beduino and minecart versions +- Improve manuals +- flycontroller/movecontroller: Allow moving blocks through unloaded areas +- playerdetector: Add wrench menu to configure search radius +- Default furnace: Don't use items filled from the top as fuel +- Many further improvements and bug fixes from joe7575 and Niklp09 + **2022-09-03 V1.09** - Change the way items are pushed - Add "Flow Limiter" mode to TA4 pump and TA4 pusher diff --git a/techage/basic_machines/forceload.lua b/techage/basic_machines/forceload.lua index adecd64..3d7d039 100644 --- a/techage/basic_machines/forceload.lua +++ b/techage/basic_machines/forceload.lua @@ -266,6 +266,11 @@ if techage.max_num_forceload_blocks > 0 then output = "techage:forceloadtile", recipe = {"techage:forceload"}, }) + minetest.register_craft({ + type = "shapeless", + output = "techage:forceload", + recipe = {"techage:forceloadtile"}, + }) end minetest.register_on_joinplayer(function(player) diff --git a/techage/basic_machines/grinder.lua b/techage/basic_machines/grinder.lua index a3cc579..77bbe8d 100644 --- a/techage/basic_machines/grinder.lua +++ b/techage/basic_machines/grinder.lua @@ -17,7 +17,7 @@ local M = minetest.get_meta local S = techage.S -- Consumer Related Data -local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer end +local CRD = function(pos) return (minetest.registered_nodes[techage.get_node_lvm(pos).name] or {}).consumer or {} end local STANDBY_TICKS = 3 local COUNTDOWN_TICKS = 4 diff --git a/techage/basic_machines/pusher.lua b/techage/basic_machines/pusher.lua index 70883b7..b706d80 100644 --- a/techage/basic_machines/pusher.lua +++ b/techage/basic_machines/pusher.lua @@ -341,7 +341,7 @@ local tubing = { CRD(pos).State:stop(pos, nvm) config_item(pos, payload) return 0 - elseif topic == 68 then -- Set push limit + elseif topic == 68 or topic == 20 then -- Set push limit local nvm = techage.get_nvm(pos) CRD(pos).State:stop(pos, nvm) set_limit(pos, nvm, payload[1]) diff --git a/techage/basic_machines/quarry.lua b/techage/basic_machines/quarry.lua index 14a4796..b244222 100644 --- a/techage/basic_machines/quarry.lua +++ b/techage/basic_machines/quarry.lua @@ -196,6 +196,9 @@ local function quarry_task(pos, crd, nvm) pos1.y = y_curr pos2.y = y_curr + -- Restarting the server can detach the coroutine data. + -- Therefore, read nvm again. + nvm = techage.get_nvm(pos) nvm.level = y_first - y_curr if minetest.is_area_protected(pos1, pos2, owner, 5) then @@ -382,6 +385,11 @@ local tubing = { end, on_node_load = function(pos) CRD(pos).State:on_node_load(pos) + local nvm = techage.get_nvm(pos) + if nvm.techage_state == techage.RUNNING then + stop_sound(pos) + play_sound(pos) + end end, } diff --git a/techage/basic_machines/ta4_chest.lua b/techage/basic_machines/ta4_chest.lua index eb91de0..b3011c9 100644 --- a/techage/basic_machines/ta4_chest.lua +++ b/techage/basic_machines/ta4_chest.lua @@ -346,6 +346,20 @@ local function count_number_of_chests(pos) M(pos):set_int("stacksize", STACK_SIZE * cnt) end +local function dummy_chest_behind(pos, node) + local dir = techage.side_to_outdir("B", node.param2) + local pos1 = tubelib2.get_pos(pos, dir) + node = techage.get_node_lvm(pos1) + return node.name == "techage:ta4_chest_dummy" +end + +local function part_of_a_chain(pos, node) + local dir = techage.side_to_outdir("F", node.param2) + local pos1 = tubelib2.get_pos(pos, dir) + node = techage.get_node_lvm(pos1) + return node.name == "techage:ta4_chest_dummy" or node.name == "techage:ta4_chest" +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) @@ -529,6 +543,10 @@ minetest.register_node("techage:ta4_chest", { after_place_node = function(pos, placer) local node = minetest.get_node(pos) + if dummy_chest_behind(pos, node) then + minetest.remove_node(pos) + return true + end if search_chest_in_front(pos, node) then node.name = "techage:ta4_chest_dummy" minetest.swap_node(pos, node) @@ -667,6 +685,18 @@ techage.register_node({"techage:ta4_chest_dummy"}, { end }) +minetest.register_lbm({ + label = "Repair Dummy Chests", + name = "techage:chest_dummy", + nodenames = {"techage:ta4_chest_dummy"}, + run_at_every_load = true, + action = function(pos, node) + if not part_of_a_chain(pos, node) then + minetest.swap_node(pos, {name = "techage:ta4_chest", param2 = node.param2}) + end + end, +}) + minetest.register_craft({ type = "shapeless", output = "techage:ta4_chest", diff --git a/techage/basis/fly_lib.lua b/techage/basis/fly_lib.lua index 61107d1..6cfcf28 100644 --- a/techage/basis/fly_lib.lua +++ b/techage/basis/fly_lib.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2020-2022 Joachim Stolberg + Copyright (C) 2020-2023 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -30,26 +30,6 @@ local function lvect_add_vec(lvect1, offs) return lvect2 end -local function lvect_add(lvect1, lvect2) - if not lvect1 or not lvect2 then return end - - local lvect3 = {} - for i, v in ipairs(lvect1) do - lvect3[#lvect3 + 1] = vector.add(v, lvect2[i]) - end - return lvect3 -end - -local function lvect_subtract(lvect1, lvect2) - if not lvect1 or not lvect2 then return end - - local lvect3 = {} - for i, v in ipairs(lvect1) do - lvect3[#lvect3 + 1] = vector.subtract(v, lvect2[i]) - end - return lvect3 -end - -- yaw in radiant local function rotate(v, yaw) local sinyaw = math.sin(yaw) @@ -61,7 +41,6 @@ local function set_node(item) local dest_pos = item.dest_pos local name = item.name or "air" local param2 = item.param2 or 0 - local metadata = item.metadata or {} local nvm = techage.get_nvm(item.base_pos) local node = techage.get_node_lvm(dest_pos) local ndef1 = minetest.registered_nodes[name] @@ -100,7 +79,7 @@ local function push(item) queue[last] = item end -local function pop(nvm, time) +local function pop() if first > last then return end local item = queue[first] queue[first] = nil -- to allow garbage collection @@ -408,6 +387,9 @@ local function entity_to_node(pos, obj) end end +-- Create a node entitiy. +-- * base_pos is controller block related +-- * start_pos and dest_pos are entity positions local function node_to_entity(base_pos, start_pos, dest_pos) local meta = M(start_pos) local node, metadata @@ -464,9 +446,9 @@ local function determine_dir(pos1, pos2) return {x=0, y=0, z=0} end -local function move_entity(obj, dest_pos, dir, is_corner) +local function move_entity(obj, next_pos, dir, is_corner) local self = obj:get_luaentity() - self.dest_pos = dest_pos + self.next_pos = next_pos self.dir = dir if is_corner then local vel = vector.multiply(dir, math.min(CORNER_SPEED, self.max_speed)) @@ -477,7 +459,7 @@ local function move_entity(obj, dest_pos, dir, is_corner) end local function moveon_entity(obj, self, pos1) - local pos2 = next_path_pos(pos1, self.lpath, self.path_idx) + local pos2 = next_path_pos(pos1, self.lmove, self.path_idx) if pos2 then self.path_idx = self.path_idx + 1 local dir = determine_dir(pos1, pos2) @@ -486,43 +468,6 @@ local function moveon_entity(obj, self, pos1) end end --- Handover the entity to the next movecontroller -local function handover_to(obj, self, pos1) - 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.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 - - 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) - 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 - end - end -end - minetest.register_entity("techage:move_item", { initial_properties = { pointable = true, @@ -538,62 +483,47 @@ minetest.register_entity("techage:move_item", { on_step = function(self, dtime, moveresult) local stop_obj = function(obj, self) - local dest_pos = self.dest_pos - obj:move_to(self.dest_pos, true) + local next_pos = self.next_pos + obj:move_to(self.next_pos, true) obj:set_acceleration({x=0, y=0, z=0}) obj:set_velocity({x=0, y=0, z=0}) - self.dest_pos = nil + self.next_pos = nil self.old_dist = nil - return dest_pos + return next_pos end - if self.dest_pos then + if self.next_pos then local obj = self.object local pos = obj:get_pos() - local dist = vector.distance(pos, self.dest_pos) + local dist = vector.distance(pos, self.next_pos) local speed = calc_speed(obj:get_velocity()) self.old_dist = self.old_dist or dist - -- Landing - if self.lpath and self.lpath[self.path_idx] then + if self.lmove and self.lmove[self.path_idx] then if dist < 1 or dist > self.old_dist then - local dest_pos = stop_obj(obj, self) - if not moveon_entity(obj, self, dest_pos) then - minetest.after(0.5, entity_to_node, dest_pos, obj) + -- change of direction + local next_pos = stop_obj(obj, self) + if not moveon_entity(obj, self, next_pos) then + minetest.after(0.5, entity_to_node, next_pos, obj) end return end - elseif self.handover and dist < 0.2 or dist > self.old_dist then - local dest_pos = stop_obj(obj, self) - if not handover_to(obj, self, dest_pos) then - minetest.after(0.5, entity_to_node, dest_pos, obj) - end + elseif dist < 0.05 or dist > self.old_dist then + -- Landing + local next_pos = stop_obj(obj, self) + local dest_pos = self.item.dest_pos or next_pos + minetest.after(0.5, entity_to_node, dest_pos, obj) return - else - if dist < 0.05 or dist > self.old_dist then - local dest_pos = stop_obj(obj, self) - minetest.after(0.5, entity_to_node, dest_pos, obj) - return - end end self.old_dist = dist -- Braking or limit max speed - if self.handover then - if speed > (dist * 4) or speed > self.max_speed then - speed = math.min(speed, math.max(dist * 4, MIN_SPEED)) - local vel = vector.multiply(self.dir,speed) - obj:set_velocity(vel) - obj:set_acceleration({x=0, y=0, z=0}) - end - else - if speed > (dist * 2) or speed > self.max_speed then - speed = math.min(speed, math.max(dist * 2, MIN_SPEED)) - local vel = vector.multiply(self.dir,speed) - obj:set_velocity(vel) - obj:set_acceleration({x=0, y=0, z=0}) - end + if speed > (dist * 2) or speed > self.max_speed then + speed = math.min(speed, math.max(dist * 2, MIN_SPEED)) + local vel = vector.multiply(self.dir,speed) + obj:set_velocity(vel) + obj:set_acceleration({x=0, y=0, z=0}) end monitoring_trigger_entity(self.item) @@ -618,30 +548,34 @@ local function is_simple_node(pos) 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) - local pos2 = next_path_pos(start_pos, lpath, 1) +-- Move node from 'pos1' to the destination, calculated by means of 'lmove' +-- * pos and meta are controller block related +-- * lmove is the movement as a list of `moves` +-- * height is move block height as value between 0 and 1 and used to calculate the offset +-- for the attached object (player). +local function move_node(pos, meta, pos1, lmove, max_speed, height) + local pos2 = next_path_pos(pos1, lmove, 1) + local offs = dest_offset(lmove) + local dest_pos = vector.add(pos1, offs) -- optional for non-player objects - local yoffs = M(pos):get_float("offset") + local yoffs = meta:get_float("offset") if pos2 then - local dir = determine_dir(start_pos, pos2) - local obj = node_to_entity(pos, start_pos, pos2) + local dir = determine_dir(pos1, pos2) + local obj = node_to_entity(pos, pos1, dest_pos) if obj then local offs = {x=0, y=height or 1, z=0} - attach_objects(start_pos, offs, obj, yoffs) + attach_objects(pos1, offs, obj, yoffs) if dir.y == 0 then if (dir.x ~= 0 and dir.z == 0) or (dir.x == 0 and dir.z ~= 0) then - attach_objects(start_pos, dir, obj, yoffs) + attach_objects(pos1, dir, obj, yoffs) end end local self = obj:get_luaentity() self.path_idx = 2 - self.pos1_idx = pos1_idx - self.lpath = lpath + self.lmove = lmove self.max_speed = max_speed - self.move2to1 = move2to1 - self.handover = handover self.yoffs = yoffs move_entity(obj, pos2, dir) return true @@ -651,14 +585,20 @@ local function move_node(pos, pos1_idx, start_pos, lpath, max_speed, height, mov end end -local function move_nodes(pos, meta, nvm, lpath, max_speed, height, move2to1, handover) +-- Move the nodes from nvm.lpos1 to nvm.lpos2 +-- * nvm.lpos1 is a list of nodes +-- * lmove is the movement as a list of `moves` +-- * pos, meta, and nvm are controller block related +--- height is move block height as value between 0 and 1 and used to calculate the offset +-- for the attached object (player). +local function multi_move_nodes(pos, meta, nvm, lmove, max_speed, height, move2to1) local owner = meta:get_string("owner") - techage.counting_add(owner, #lpath, #nvm.lpos1 * #lpath) + techage.counting_add(owner, #lmove, #nvm.lpos1 * #lmove) for idx = 1, #nvm.lpos1 do local pos1 = nvm.lpos1[idx] local pos2 = nvm.lpos2[idx] - --print("move_nodes", idx, P2S(pos1), P2S(pos2)) + --print("multi_move_nodes", idx, P2S(pos1), P2S(pos2)) if move2to1 then pos1, pos2 = pos2, pos1 @@ -666,7 +606,7 @@ local function move_nodes(pos, meta, nvm, lpath, max_speed, height, move2to1, ha 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 - if move_node(pos, idx, pos1, lpath, max_speed, height, move2to1, handover) == false then + if move_node(pos, meta, pos1, lmove, max_speed, height) == false then meta:set_string("status", S("No valid node at the start position")) return false end @@ -691,21 +631,27 @@ 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) +-- Move the nodes from lpos1 to lpos2. +-- * lpos1 is a list of nodes +-- * lpos2 = lpos1 + move +-- * pos and meta are controller block related +-- * height is move block height as value between 0 and 1 and used to calculate the offset +-- for the attached object (player). +local function move_nodes(pos, meta, lpos1, move, max_speed, height) local owner = meta:get_string("owner") + lpos1 = lpos1 or {} techage.counting_add(owner, #lpos1) local lpos2 = {} for idx = 1, #lpos1 do local pos1 = lpos1[idx] - local pos2 = vector.add(lpos1[idx], line) + local pos2 = vector.add(lpos1[idx], move) 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) + move_node(pos, meta, pos1, {move}, max_speed, height) else if not is_simple_node(pos1) then meta:set_string("status", S("No valid node at the start position")) @@ -728,13 +674,14 @@ local function move_nodes2(pos, meta, lpos1, line, max_speed, height) return true, lpos2 end +-- move2to1 is the direction and is true for 'from pos2 to pos1' +-- Move path and other data is stored as meta data of pos function flylib.move_to_other_pos(pos, move2to1) local meta = M(pos) local nvm = techage.get_nvm(pos) - local lpath, err = flylib.to_path(meta:get_string("path")) or {} + local lmove, err = flylib.to_path(meta:get_string("path")) or {} local max_speed = meta:contains("max_speed") and meta:get_int("max_speed") or MAX_SPEED local height = meta:contains("height") and meta:get_float("height") or 1 - local handover if err or nvm.running then return false end @@ -742,33 +689,28 @@ function flylib.move_to_other_pos(pos, move2to1) max_speed = techage.in_range(max_speed, MIN_SPEED, MAX_SPEED) nvm.lpos1 = nvm.lpos1 or {} - local offs = dest_offset(lpath) + local offs = dest_offset(lmove) if move2to1 then - lpath = reverse_path(lpath) + lmove = reverse_path(lmove) end -- calc destination positions nvm.lpos2 = lvect_add_vec(nvm.lpos1, offs) - if move2to1 then - handover = meta:contains("handoverA") and meta:get_string("handoverA") or nil - else - handover = meta:contains("handoverB") and meta:get_string("handoverB") or nil - end - nvm.running = move_nodes(pos, meta, nvm, lpath, max_speed, height, move2to1, handover) + nvm.running = multi_move_nodes(pos, meta, nvm, lmove, max_speed, height, move2to1) nvm.moveBA = nvm.running and not move2to1 return nvm.running end -function flylib.move_to(pos, line) +-- `move` the movement as a vector +function flylib.move_to(pos, move) 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 if nvm.running then return false end - nvm.running, nvm.lastpos = move_nodes2(pos, meta, nvm.lastpos or nvm.lpos1, line, max_speed, height) + nvm.running, nvm.lastpos = move_nodes(pos, meta, nvm.lastpos or nvm.lpos1, move, max_speed, height) return nvm.running end @@ -782,27 +724,28 @@ function flylib.reset_move(pos) if nvm.lpos1 and nvm.lpos1[1] then local move = vector.subtract(nvm.lpos1[1], (nvm.lastpos or nvm.lpos1)[1]) - local resp - nvm.running, nvm.lastpos = move_nodes2(pos, meta, nvm.lastpos or nvm.lpos1, move, max_speed, height) + nvm.running, nvm.lastpos = move_nodes(pos, meta, nvm.lastpos or nvm.lpos1, move, max_speed, height) return nvm.running end return false end +-- pos is the controller block pos +-- lpos is a list of node positions to be moved -- rot is one of "l", "r", "2l", "2r" --- cpos is the center pos (optional) -function flylib.rotate_nodes(pos, posses1, rot) +function flylib.rotate_nodes(pos, lpos, rot) local meta = M(pos) local owner = meta:get_string("owner") + -- cpos is the center pos local cpos = meta:contains("center") and flylib.to_vector(meta:get_string("center")) - local posses2 = techage.rotate_around_center(posses1, rot, cpos) + local lpos2 = techage.rotate_around_center(lpos, rot, cpos) local param2 local nodes2 = {} - techage.counting_add(owner, #posses1 * 2) + techage.counting_add(owner, #lpos * 2) - for i, pos1 in ipairs(posses1) do + for i, pos1 in ipairs(lpos) do local node = techage.get_node_lvm(pos1) if rot == "l" then param2 = techage.param2_turn_right(node.param2) @@ -813,7 +756,7 @@ function flylib.rotate_nodes(pos, posses1, rot) end if not minetest.is_protected(pos1, owner) and is_simple_node(pos1) then minetest.remove_node(pos1) - nodes2[#nodes2 + 1] = {pos = posses2[i], name = node.name, param2 = param2} + nodes2[#nodes2 + 1] = {pos = lpos2[i], name = node.name, param2 = param2} end end for _,item in ipairs(nodes2) do @@ -821,7 +764,7 @@ function flylib.rotate_nodes(pos, posses1, rot) minetest.add_node(item.pos, {name = item.name, param2 = item.param2}) end end - return posses2 + return lpos2 end function flylib.exchange_node(pos, name, param2) diff --git a/techage/basis/node_states.lua b/techage/basis/node_states.lua index 6febacf..ac7373f 100644 --- a/techage/basis/node_states.lua +++ b/techage/basis/node_states.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2022 Joachim Stolberg + Copyright (C) 2019-2023 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -520,6 +520,20 @@ function NodeStates:on_beduino_request_data(pos, topic, payload) end end +function NodeStates.get_beduino_state(pos) + local node = minetest.get_node(pos) + local nvm = techage.get_nvm(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) + MAX_CYCLE_TIME + if ttl < minetest.get_gametime() then + return 0, {techage.INACTIVE} + end + end + return 0, {nvm.techage_state or STOPPED} +end + -- restart timer function NodeStates:on_node_load(pos) local nvm = techage.get_nvm(pos) diff --git a/techage/beduino/kv_store.lua b/techage/beduino/kv_store.lua index 81424c2..9f565b7 100644 --- a/techage/beduino/kv_store.lua +++ b/techage/beduino/kv_store.lua @@ -55,6 +55,6 @@ minetest.register_on_mods_loaded(function() 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) + vm16.register_ro_file("beduino", "lib/ta_kvstore.c", kvstore_c) end end) diff --git a/techage/digtron/battery.lua b/techage/digtron/battery.lua index 515c314..5e5b6c0 100644 --- a/techage/digtron/battery.lua +++ b/techage/digtron/battery.lua @@ -30,7 +30,7 @@ local TOTAL_MAX = INV_SIZE * FUEL_STACK_MAX local function count_coal(metadata) local total = 0 - for _,stack in pairs(metadata.inventory.fuel) do + for _,stack in pairs(metadata.inventory.fuel or {}) do total = total + stack:get_count() end return total diff --git a/techage/doc/items.lua b/techage/doc/items.lua index 9d85470..fa08dcb 100644 --- a/techage/doc/items.lua +++ b/techage/doc/items.lua @@ -115,7 +115,7 @@ techage.Items = { ta3_sequencer = "techage:ta3_sequencer", ta3_timer = "techage:ta3_timer", ta3_terminal = "techage:terminal2", - ta3_signallamp = "techage:signal_lamp_off", + ta3_colorlamp = "techage:color_lamp_off", ta3_doorblock = "techage:doorblock20", ta3_programmer = "techage:programmer", ta3_doorcontroller = "techage:ta3_doorcontroller", diff --git a/techage/doc/manual_DE.lua b/techage/doc/manual_DE.lua index 5b06703..99c276f 100644 --- a/techage/doc/manual_DE.lua +++ b/techage/doc/manual_DE.lua @@ -113,7 +113,7 @@ techage.manual_DE.aTitel = { "3,TA3 Sequenzer / Sequencer", "3,TA3 Timer", "3,TA3 Terminal", - "3,TechAge Signallampe / Signal Lamp", + "3,TechAge Farblampe / Color Lamp", "3,Tür/Tor Blöcke / Door/Gate Blocks", "3,TA3 Tür Controller / Door Controller", "3,TA3 Tür Controller II / Door Controller II", @@ -1133,7 +1133,7 @@ techage.manual_DE.aText = { "\n".. "\n".. "\n", - "Die Signallampe kann mit 'on'/'off' Kommando ein- bzw. ausgeschaltet werden. Diese Lampe braucht keinen Strom und\n".. + "Die Farblampe kann mit 'on'/'off' Kommando ein- bzw. ausgeschaltet werden. Diese Lampe braucht keinen Strom und\n".. "kann mit der Spritzpistole aus der Mod \"Unified Dyes\" und über Lua/Beduino Kommandos eingefärbt werden.\n".. "\n".. "Mit dem Chat-Kommando '/ta_color' wird die Farbpalette mit den Werten für die Lua/Beduino Kommandos angezeigt und mit '/ta_send color ' kann die Farbe geändert werden.\n".. @@ -2282,7 +2282,7 @@ techage.manual_DE.aItemName = { "ta3_sequencer", "ta3_timer", "ta3_terminal", - "ta3_signallamp", + "ta3_colorlamp", "ta3_doorblock", "ta3_doorcontroller", "ta3_doorcontroller", diff --git a/techage/doc/manual_EN.lua b/techage/doc/manual_EN.lua index b10047a..7766052 100644 --- a/techage/doc/manual_EN.lua +++ b/techage/doc/manual_EN.lua @@ -113,7 +113,7 @@ techage.manual_EN.aTitel = { "3,TA3 Sequencer", "3,TA3 Timer", "3,TA3 Terminal", - "3,TechAge Signal Lamp", + "3,TechAge Color Lamp", "3,Door/Gate Blocks", "3,TA3 Door Controller", "3,TA3 Door Controller II", @@ -2286,7 +2286,7 @@ techage.manual_EN.aItemName = { "ta3_sequencer", "ta3_timer", "ta3_terminal", - "ta3_signallamp", + "ta3_colorlamp", "ta3_doorblock", "ta3_doorcontroller", "ta3_doorcontroller", diff --git a/techage/fusion_reactor/controller.lua b/techage/fusion_reactor/controller.lua index 653602d..cc6f9e5 100644 --- a/techage/fusion_reactor/controller.lua +++ b/techage/fusion_reactor/controller.lua @@ -217,7 +217,6 @@ minetest.register_node("techage:ta5_fr_controller_pas", { on_timer = node_timer, after_dig_node = after_dig_node, on_receive_fields = on_receive_fields, - drawtype = "nodebox", paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, @@ -257,7 +256,6 @@ minetest.register_node("techage:ta5_fr_controller_act", { on_timer = node_timer, after_dig_node = after_dig_node, on_receive_fields = on_receive_fields, - drawtype = "nodebox", paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, drop = "", diff --git a/techage/fusion_reactor/magnet.lua b/techage/fusion_reactor/magnet.lua index 66889cf..9427577 100644 --- a/techage/fusion_reactor/magnet.lua +++ b/techage/fusion_reactor/magnet.lua @@ -54,7 +54,6 @@ minetest.register_node("techage:ta5_magnet1", { Cable:after_dig_node(pos) techage.del_mem(pos) end, - drawtype = "nodebox", paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, @@ -88,7 +87,6 @@ minetest.register_node("techage:ta5_magnet2", { Cable:after_dig_node(pos) techage.del_mem(pos) end, - drawtype = "nodebox", paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2}, is_ground_content = false, diff --git a/techage/init.lua b/techage/init.lua index a17e3ba..445c829 100644 --- a/techage/init.lua +++ b/techage/init.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2019-2022 Joachim Stolberg + Copyright (C) 2019-2023 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.08 +techage.version = 1.10 if minetest.global_exists("tubelib") then minetest.log("error", "[techage] Techage can't be used together with the mod tubelib!") @@ -27,8 +27,8 @@ elseif minetest.global_exists("techpack") then elseif minetest.global_exists("tubelib2") and tubelib2.version < 2.2 then minetest.log("error", "[techage] Techage requires tubelib2 version 2.2 or newer!") return -elseif minetest.global_exists("minecart") and minecart.version < 1.08 then - minetest.log("error", "[techage] Techage requires minecart version 1.08 or newer!") +elseif minetest.global_exists("minecart") and minecart.version < 2.03 then + minetest.log("error", "[techage] Techage requires minecart version 2.03 or newer!") return elseif minetest.global_exists("lcdlib") and lcdlib.version < 1.01 then minetest.log("error", "[techage] Techage requires lcdlib version 1.01 or newer!") diff --git a/techage/items/cement.lua b/techage/items/cement.lua index ccb8b6f..8d9d2fe 100644 --- a/techage/items/cement.lua +++ b/techage/items/cement.lua @@ -43,6 +43,13 @@ else sounds = default.node_sound_stone_defaults(), }) + -- Needs to be a techage recipe, not to overwrite the clay/bakedclay recipe + techage.furnace.register_recipe({ + output = "techage:cement_block", + recipe = { + "default:clay", + }, + }) techage.add_grinder_recipe({input="techage:cement_block", output="techage:cement_powder"}) techage.add_grinder_recipe({input="bakedclay:white", output="techage:cement_powder"}) end diff --git a/techage/items/silicon.lua b/techage/items/silicon.lua index 95aeea6..5c89005 100644 --- a/techage/items/silicon.lua +++ b/techage/items/silicon.lua @@ -30,16 +30,16 @@ if minetest.global_exists("mesecon") then }, time = 6, }) -else - techage.furnace.register_recipe({ - output = "techage:ta4_silicon_wafer 16", - recipe = { - "basic_materials:silicon", - "basic_materials:silicon", - "basic_materials:silicon", - "techage:baborium_ingot" - }, - time = 6, - }) end +techage.furnace.register_recipe({ + output = "techage:ta4_silicon_wafer 16", + recipe = { + "basic_materials:silicon", + "basic_materials:silicon", + "basic_materials:silicon", + "techage:baborium_ingot" + }, + time = 6, +}) + diff --git a/techage/lamps/growlight.lua b/techage/lamps/growlight.lua index f4b1ac3..119bcb0 100644 --- a/techage/lamps/growlight.lua +++ b/techage/lamps/growlight.lua @@ -171,11 +171,26 @@ minetest.register_craft({ }, }) +local function contains(table, element) + for _, value in pairs(table) do + if value == element then + return true + end + end + return false +end + function techage.register_flower(name) + if contains(Flowers, name) then + return + end Flowers[#Flowers+1] = name end function techage.register_plant(name) + if contains(Plants, name) then + return + end Plants[name] = true end @@ -201,4 +216,5 @@ minetest.after(1, function() end end end + -- print(dump(Flowers)) end) diff --git a/techage/liquids/pump.lua b/techage/liquids/pump.lua index 2346099..f62d336 100644 --- a/techage/liquids/pump.lua +++ b/techage/liquids/pump.lua @@ -343,7 +343,7 @@ techage.register_node({"techage:t4_pump", "techage:t4_pump_on"}, { end end, on_beduino_receive_cmnd = function(pos, src, topic, payload) - if topic == 69 and payload then -- Set pump limit + if (topic == 69 or topic == 21) and payload then -- Set pump limit local nvm = techage.get_nvm(pos) State4:stop(pos, nvm) if payload[1] > 0 then diff --git a/techage/logic/button.lua b/techage/logic/button.lua index 0d9b82f..f1f2e8c 100644 --- a/techage/logic/button.lua +++ b/techage/logic/button.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2020 Joachim Stolberg + Copyright (C) 2017-2023 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -394,11 +394,16 @@ minetest.register_craft({ }, }) +techage.register_node({"techage:ta3_button_off", "techage:ta3_button_on"}, {}) + techage.register_node({ "techage:ta4_button_off", "techage:ta4_button_on", }, { on_recv_message = function(pos, src, topic, payload) - if topic == "name" then + if topic == "state" then + local name = techage.get_node_lvm(pos).name + return name == "techage:ta4_button_on" and "on" or "off" + elseif topic == "name" then local mem = techage.get_mem(pos) return mem.clicker or "" elseif topic == "time" then @@ -409,7 +414,10 @@ techage.register_node({ end end, on_beduino_request_data = function(pos, src, topic, payload) - if topic == 144 then -- Player Name + if topic == 131 then -- State + local name = techage.get_node_lvm(pos).name + return 0, name == "techage:ta4_button_on" and {1} or {0} + elseif topic == 144 then -- Player Name local mem = techage.get_mem(pos) return 0, mem.clicker elseif topic == 149 then --time diff --git a/techage/logic/button_2x.lua b/techage/logic/button_2x.lua index c79f2bd..e38244d 100644 --- a/techage/logic/button_2x.lua +++ b/techage/logic/button_2x.lua @@ -244,6 +244,8 @@ minetest.register_node("techage:ta4_button_2x", { sounds = default.node_sound_glass_defaults(), }) +techage.register_node({"techage:ta4_button_2x"}, {}) + minetest.register_craft({ output = "techage:ta4_button_2x", recipe = { @@ -252,3 +254,12 @@ minetest.register_craft({ {"", "", ""}, }, }) + +minetest.register_craft({ + output = "techage:ta4_button_off 2", + recipe = { + {"", "", ""}, + {"", "techage:ta4_button_2x", ""}, + {"", "", ""}, + }, +}) diff --git a/techage/logic/button_4x.lua b/techage/logic/button_4x.lua index 9dbb892..5a73c9a 100644 --- a/techage/logic/button_4x.lua +++ b/techage/logic/button_4x.lua @@ -300,6 +300,8 @@ minetest.register_node("techage:ta4_button_4x", { sounds = default.node_sound_glass_defaults(), }) +techage.register_node({"techage:ta4_button_4x"}, {}) + minetest.register_craft({ output = "techage:ta4_button_4x", recipe = { @@ -308,3 +310,12 @@ minetest.register_craft({ {"", "", ""}, }, }) + +minetest.register_craft({ + output = "techage:ta4_button_off 4", + recipe = { + {"", "", ""}, + {"", "techage:ta4_button_4x", ""}, + {"", "", ""}, + }, +}) diff --git a/techage/logic/detector.lua b/techage/logic/detector.lua index 937b49a..daf790c 100644 --- a/techage/logic/detector.lua +++ b/techage/logic/detector.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2017-2022 Joachim Stolberg + Copyright (C) 2017-2023 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -21,7 +21,7 @@ local logic = techage.logic local BLOCKING_TIME = 8 -- seconds local ON_TIME = 1 -local WRENCH_MENU = { +local WRENCH_MENU3 = { { type = "dropdown", choices = "1,2,4,6,8,12,16", @@ -47,6 +47,46 @@ local WRENCH_MENU = { } } +local WRENCH_MENU4 = { + { + type = "dropdown", + choices = "1,2,4,6,8,12,16", + name = "ontime", + label = S("On Time") .. " [s]", + tooltip = S("The time between the 'on' and 'off' commands."), + default = "1", + }, + { + type = "dropdown", + choices = "2,4,6,8,12,16,20", + name = "blockingtime", + label = S("Blocking Time") .. " [s]", + tooltip = S("The time after the 'off' command\nuntil the next 'on' command is accepted."), + default = "8", + }, + { + type = "number", + name = "countdown", + label = S("Countdown"), + tooltip = S("Counts down the number of items passed through\nand only triggers an 'on' command when it reaches zero."), + default = "0", + }, + { + type = "output", + name = "countdown", + label = S("Current countdown"), + tooltip = S("Current countdown value."), + default = "0", + }, + { + type = "items", + name = "config", + label = S("Configured Items"), + tooltip = S("Items which generate an 'on' command.\nIf empty, all passed items generate an 'on' command."), + size = 4, + } +} + local function switch_on(pos) local mem = techage.get_mem(pos) local t = minetest.get_gametime() @@ -122,6 +162,17 @@ local function after_dig_node(pos, oldnode, oldmetadata, digger) techage.del_mem(pos) end +local function ta_after_formspec(pos, fields, playername) + if fields.save then + local nvm = techage.get_nvm(pos) + local val = M(pos):get_int("countdown") or 0 + if val > 0 then + nvm.countdown = val + else + nvm.countdown = nil + end + end +end minetest.register_node("techage:ta3_detector_off", { description = S("TA3 Detector"), @@ -139,7 +190,7 @@ minetest.register_node("techage:ta3_detector_off", { on_receive_fields = on_receive_fields, techage_set_numbers = techage_set_numbers, after_dig_node = after_dig_node, - ta3_formspec = WRENCH_MENU, + ta3_formspec = WRENCH_MENU3, on_rotate = screwdriver.disallow, paramtype = "light", @@ -167,7 +218,7 @@ minetest.register_node("techage:ta3_detector_on", { on_rotate = screwdriver.disallow, techage_set_numbers = techage_set_numbers, after_dig_node = after_dig_node, - ta3_formspec = WRENCH_MENU, + ta3_formspec = WRENCH_MENU3, paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, @@ -192,7 +243,8 @@ minetest.register_node("techage:ta4_detector_off", { on_receive_fields = on_receive_fields, techage_set_numbers = techage_set_numbers, after_dig_node = after_dig_node, - ta3_formspec = WRENCH_MENU, + ta4_formspec = WRENCH_MENU4, + ta_after_formspec = ta_after_formspec, on_rotate = screwdriver.disallow, paramtype = "light", @@ -220,7 +272,8 @@ minetest.register_node("techage:ta4_detector_on", { on_rotate = screwdriver.disallow, techage_set_numbers = techage_set_numbers, after_dig_node = after_dig_node, - ta3_formspec = WRENCH_MENU, + ta4_formspec = WRENCH_MENU4, + ta_after_formspec = ta_after_formspec, paramtype2 = "facedir", groups = {choppy=2, cracky=2, crumbly=2, not_in_creative_inventory=1}, @@ -268,13 +321,22 @@ techage.register_node({"techage:ta4_detector_off", "techage:ta4_detector_on"}, { if leftover then local inv = minetest.get_inventory({type = "node", pos = pos}) if not inv or inv:is_empty("cfg") or inv:contains_item("cfg", ItemStack(stack:get_name())) then - switch_on(pos) local nvm = techage.get_nvm(pos) - if leftover == true then - nvm.counter = (nvm.counter or 0) + stack:get_count() - else - nvm.counter = (nvm.counter or 0) + stack:get_count() - leftover:get_count() + local num_moved = stack:get_count() + if leftover ~= true then + num_moved = num_moved - leftover:get_count() end + + if nvm.countdown and nvm.countdown > 0 then + nvm.countdown = nvm.countdown - num_moved + if nvm.countdown <= 0 then + M(pos):set_int("countdown", 0) + switch_on(pos) + end + elseif nvm.countdown == nil then + switch_on(pos) + end + nvm.counter = (nvm.counter or 0) + num_moved end return leftover end @@ -286,9 +348,15 @@ techage.register_node({"techage:ta4_detector_off", "techage:ta4_detector_on"}, { if topic == "count" then local nvm = techage.get_nvm(pos) return nvm.counter or 0 + elseif topic == "countdown" then + local nvm = techage.get_nvm(pos) + nvm.countdown = tonumber(payload) or 0 + M(pos):set_int("countdown", nvm.countdown) + return true elseif topic == "reset" then local nvm = techage.get_nvm(pos) nvm.counter = 0 + nvm.countdown = nil return true else return "unsupported" @@ -298,6 +366,12 @@ techage.register_node({"techage:ta4_detector_off", "techage:ta4_detector_on"}, { if topic == 6 then -- Detector Block Reset local nvm = techage.get_nvm(pos) nvm.counter = 0 + nvm.countdown = nil + return 0 + elseif topic == 5 then -- Detector Block Countdown + local nvm = techage.get_nvm(pos) + nvm.countdown = tonumber(payload[1]) or 0 + M(pos):set_int("countdown", nvm.countdown) return 0 else return 2 diff --git a/techage/logic/signallamp.lua b/techage/logic/signallamp.lua index 485fc83..ba0e7ba 100644 --- a/techage/logic/signallamp.lua +++ b/techage/logic/signallamp.lua @@ -3,7 +3,7 @@ TechAge ======= - Copyright (C) 2022 Joachim Stolberg + Copyright (C) 2022-2023 Joachim Stolberg AGPL v3 See LICENSE.txt for more information @@ -104,7 +104,6 @@ local function register_signallamp(name, description, tiles_off, tiles_on, node_ paramtype = "light", paramtype2 = "color", - --palette = "techage_palette256.png", palette = COLORED and "unifieddyes_palette_extended.png" or "techage_palette256.png", groups = {choppy=2, cracky=1, not_in_creative_inventory=1, ud_param2_colorable = 1}, @@ -148,7 +147,7 @@ local function register_signallamp(name, description, tiles_off, tiles_on, node_ local node = techage.get_node_lvm(pos) switch_off(pos, node) return 0 - elseif topic == 70 then + elseif topic == 70 or topic == 22 then local node = techage.get_node_lvm(pos) switch_on(pos, node, nil, payload[1]) return 0 @@ -196,8 +195,8 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end) -register_signallamp("techage:signal_lamp", - S("TechAge Signal Lamp"), +register_signallamp("techage:color_lamp", + S("TechAge Color Lamp"), {"techage_signal_lamp.png^[colorize:#000000:80"}, {"techage_signal_lamp.png"}, { @@ -209,8 +208,8 @@ register_signallamp("techage:signal_lamp", } ) -register_signallamp("techage:signal_lamp2", - S("TechAge Signal Lamp 2 "), +register_signallamp("techage:color_lamp2", + S("TechAge Color Lamp 2"), {"techage_signallamp2.png^[colorize:#000000:80"}, {"techage_signallamp2.png"} ) @@ -232,3 +231,8 @@ minetest.register_craft({ {"", "techage:vacuum_tube", ""}, }, }) + +minetest.register_alias("techage:signal_lamp_off", "techage:color_lamp_off") +minetest.register_alias("techage:signal_lamp2_off", "techage:color_lamp2_off") +minetest.register_alias("techage:signal_lamp_on", "techage:color_lamp_on") +minetest.register_alias("techage:signal_lamp2_on", "techage:color_lamp2_on") diff --git a/techage/manuals/manual_ta3_DE.md b/techage/manuals/manual_ta3_DE.md index 975b34a..f62b3f3 100644 --- a/techage/manuals/manual_ta3_DE.md +++ b/techage/manuals/manual_ta3_DE.md @@ -628,14 +628,14 @@ Im privaten Modus (private) kann das Terminal nur von Spielern verwendet werden, [ta3_terminal|image] -### TechAge Signallampe / Signal Lamp +### TechAge Farblampe / Color Lamp -Die Signallampe kann mit `on`/`off` Kommando ein- bzw. ausgeschaltet werden. Diese Lampe braucht keinen Strom und +Die Farblampe kann mit `on`/`off` Kommando ein- bzw. ausgeschaltet werden. Diese Lampe braucht keinen Strom und kann mit der Spritzpistole aus der Mod "Unified Dyes" und über Lua/Beduino Kommandos eingefärbt werden. Mit dem Chat-Kommando `/ta_color` wird die Farbpalette mit den Werten für die Lua/Beduino Kommandos angezeigt und mit `/ta_send color ` kann die Farbe geändert werden. -[ta3_signallamp|image] +[ta3_colorlamp|image] ### Tür/Tor Blöcke / Door/Gate Blocks diff --git a/techage/manuals/manual_ta3_EN.md b/techage/manuals/manual_ta3_EN.md index 713bd71..b440e5f 100644 --- a/techage/manuals/manual_ta3_EN.md +++ b/techage/manuals/manual_ta3_EN.md @@ -627,13 +627,13 @@ In public mode, all players can use the preconfigured keys. [ta3_terminal|image] -### TechAge Signal Lamp +### TechAge Color Lamp The signal lamp can be switched on or off with the `on` / `off` command. This lamp does not need electricity and can be colored with the airbrush tool from the mod Unified Dyes" and via Lua/Beduino commands. With the chat command `/ta_color` the color palette with the values for the Lua/Beduino commands is displayed and with `/ta_send color ` the color can be changed. -[ta3_signallamp|image] +[ta3_colorlamp|image] ### Door/Gate Blocks diff --git a/techage/manuals/ta4_lua_controller_EN.md b/techage/manuals/ta4_lua_controller_EN.md index 11b9e71..2c937b3 100644 --- a/techage/manuals/ta4_lua_controller_EN.md +++ b/techage/manuals/ta4_lua_controller_EN.md @@ -363,6 +363,7 @@ Please note, that this is not a technical distinction, only a logical. | "state" | one of: "running", "stopped", "blocked", "standby", "fault", or "unloaded" | Techage machine state, used by many machines | | "state" | one of: "red", "amber", "green", "off" | Signal Tower state | | "state" | one of: "empty", "loaded", "full" | State of a chest or Sensor Chest | +| "state" | one of: "on", "off" | State of a TA4 Button | | "fuel" | number | fuel value of a fuel consuming block | | "depth" | number | Read the current depth value of a quarry block (1..80) | | "load" | number | Read the load value in percent (0..100) of a tank, silo, accu, or battery block, or from the Signs Bot Box. Silo and tank return two values: The percentage value and the absolute value in units.
Example: percent, absolute = $send_cmnd("223", "load") | @@ -396,7 +397,8 @@ Please note, that this is not a technical distinction, only a logical. | "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 | +| "reset" | nil | Reset item and countdown counters of the TA4 Item Detector block | +| "countdown" | number | Set countdown counter of the TA4 Item Detector block to the given value and
start countdown mode. | | "limit" | number | Configure a TA4 Pusher with the number of items that are allowed to be pushed ("flow limiter" mode)
limit = 0 turns off the "flow limiter" mode | | "limit" | number | Configure a TA4 Pump with the number of liquid units that are allowed to be pumped ("flow limiter" mode)
limit = 0 turns off the "flow limiter" mode | | "config" | item string | Configure the TA4 pusher.
Example: `wool:blue` | @@ -417,7 +419,7 @@ Please note, that this is not a technical distinction, only a logical. | "stop" | nil | Stop command for the TA4 Sequencer. | | "gain" | volume | Set volume of the sound block (`volume` is a value between 0 and 1.0) | | "sound" | index | Select sound sample of the sound block | -| "color" | \ | Set the color of the TechAge Signal Lamp and TechAge Signal Lamp 2 (color = 0..255) | +| "color" | \ | Set the color of the TechAge Color Lamp and TechAge Color Lamp 2 (color = 0..255) | ### Server and Terminal Functions diff --git a/techage/manuals/ta_iom.md b/techage/manuals/ta_iom.md deleted file mode 100644 index 7d6d9c7..0000000 --- a/techage/manuals/ta_iom.md +++ /dev/null @@ -1,85 +0,0 @@ -# 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 index ddee165..bfdbca8 100644 --- a/techage/manuals/ta_kvstore.md +++ b/techage/manuals/ta_kvstore.md @@ -5,8 +5,8 @@ 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" +import "lib/ta_kvstore.c" +import "lib/ta_iom.c" var s[16]; diff --git a/techage/manuals/toc_DE.md b/techage/manuals/toc_DE.md index 808b9b3..4ede925 100644 --- a/techage/manuals/toc_DE.md +++ b/techage/manuals/toc_DE.md @@ -112,7 +112,7 @@ - [TA3 Sequenzer / Sequencer](./manual_ta3_DE.md#ta3-sequenzer--sequencer) - [TA3 Timer](./manual_ta3_DE.md#ta3-timer) - [TA3 Terminal](./manual_ta3_DE.md#ta3-terminal) - - [TechAge Signallampe / Signal Lamp](./manual_ta3_DE.md#techage-signallampe--signal-lamp) + - [TechAge Farblampe / Color Lamp](./manual_ta3_DE.md#techage-farblampe--color-lamp) - [Tür/Tor Blöcke / Door/Gate Blocks](./manual_ta3_DE.md#türtor-blöcke--doorgate-blocks) - [TA3 Tür Controller / Door Controller](./manual_ta3_DE.md#ta3-tür-controller--door-controller) - [TA3 Tür Controller II / Door Controller II](./manual_ta3_DE.md#ta3-tür-controller-ii--door-controller-ii) diff --git a/techage/manuals/toc_EN.md b/techage/manuals/toc_EN.md index fc0e3a2..fdd0398 100644 --- a/techage/manuals/toc_EN.md +++ b/techage/manuals/toc_EN.md @@ -112,7 +112,7 @@ - [TA3 Sequencer](./manual_ta3_EN.md#ta3-sequencer) - [TA3 Timer](./manual_ta3_EN.md#ta3-timer) - [TA3 Terminal](./manual_ta3_EN.md#ta3-terminal) - - [TechAge Signal Lamp](./manual_ta3_EN.md#techage-signal-lamp) + - [TechAge Color Lamp](./manual_ta3_EN.md#techage-color-lamp) - [Door/Gate Blocks](./manual_ta3_EN.md#doorgate-blocks) - [TA3 Door Controller](./manual_ta3_EN.md#ta3-door-controller) - [TA3 Door Controller II](./manual_ta3_EN.md#ta3-door-controller-ii) diff --git a/techage/move_controller/flycontroller.lua b/techage/move_controller/flycontroller.lua index 6e56c49..9f1c7cc 100644 --- a/techage/move_controller/flycontroller.lua +++ b/techage/move_controller/flycontroller.lua @@ -3,12 +3,12 @@ TechAge ======= - Copyright (C) 2020-2022 Joachim Stolberg + Copyright (C) 2020-2023 Joachim Stolberg AGPL v3 See LICENSE.txt for more information - TA4 Move Controller + TA5 Fly Controller ]]-- @@ -42,6 +42,13 @@ local WRENCH_MENU = { tooltip = S("Value in the range of 0.0 to 1.0"), default = "1.0", }, + { + type = "float", + name = "offset", + label = S("Object offset"), + tooltip = S("Y-offset for non-player objects like vehicles (-0.5 to 0.5)"), + default = "0.0", + }, } local function formspec(nvm, meta) @@ -165,8 +172,6 @@ minetest.register_node("techage:ta5_flycontroller", { elseif fields.moveAB then meta:set_string("status", "") if fly.move_to_other_pos(pos, false) then - nvm.moveBA = true - nvm.running = true meta:set_string("formspec", formspec(nvm, meta)) local name = player:get_player_name() mark.stop(name) @@ -175,8 +180,6 @@ minetest.register_node("techage:ta5_flycontroller", { elseif fields.moveBA then meta:set_string("status", "") if fly.move_to_other_pos(pos, true) then - nvm.moveBA = false - nvm.running = true meta:set_string("formspec", formspec(nvm, meta)) local name = player:get_player_name() mark.stop(name) @@ -185,8 +188,6 @@ minetest.register_node("techage:ta5_flycontroller", { elseif fields.move then meta:set_string("status", "") if fly.move_to_other_pos(pos, nvm.moveBA) then - nvm.moveBA = nvm.moveBA == false - nvm.running = true meta:set_string("formspec", formspec(nvm, meta)) local name = player:get_player_name() mark.stop(name) @@ -219,17 +220,11 @@ techage.register_node({"techage:ta5_flycontroller"}, { elseif topic == "state" then return nvm.running and "running" or "stopped" elseif topic == "a2b" then - nvm.moveBA = true - nvm.running = true return fly.move_to_other_pos(pos, false) elseif topic == "b2a" then - nvm.moveBA = false - nvm.running = true return fly.move_to_other_pos(pos, true) elseif topic == "move" then - nvm.moveBA = nvm.moveBA == false - nvm.running = true - return fly.move_to_other_pos(pos, nvm.moveBA == false) + return fly.move_to_other_pos(pos, nvm.moveBA) end return false end, @@ -237,17 +232,11 @@ techage.register_node({"techage:ta5_flycontroller"}, { 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 + return fly.move_to_other_pos(pos, nvm.moveBA) and 0 or 3 end else return 2 @@ -260,6 +249,10 @@ techage.register_node({"techage:ta5_flycontroller"}, { end return 2, "" end, + on_node_load = function(pos, node) + local nvm = techage.get_nvm(pos) + nvm.running = false + end, }) minetest.register_craft({ diff --git a/techage/move_controller/movecontroller.lua b/techage/move_controller/movecontroller.lua index caf29af..2c25fb1 100644 --- a/techage/move_controller/movecontroller.lua +++ b/techage/move_controller/movecontroller.lua @@ -34,22 +34,6 @@ local WRENCH_MENU = { tooltip = S("Maximum speed for moving blocks"), default = "8", }, - { - type = "number", - name = "handoverB", - label = S("Handover to B"), - tooltip = S("Number of the next movecontroller"), - default = "", - check = techage.check_number, - }, - { - type = "number", - name = "handoverA", - label = S("Handover to A"), - tooltip = S("Number of the previous movecontroller"), - default = "", - check = techage.check_number, - }, { type = "float", name = "height", diff --git a/techage/move_controller/soundblock.lua b/techage/move_controller/soundblock.lua index bafcbb2..7743f0f 100644 --- a/techage/move_controller/soundblock.lua +++ b/techage/move_controller/soundblock.lua @@ -116,8 +116,9 @@ techage.register_node({"techage:ta3_soundblock"}, { end end, on_beduino_receive_cmnd = function(pos, src, topic, payload) + print("ta3_soundblock", topic, payload[1], payload[2]) if topic == 1 then - if payload[1] == 0 then + if payload[1] == 1 then play_predefined_sound(pos) return 0 end diff --git a/techage/power/formspecs.lua b/techage/power/formspecs.lua index 985901b..a982637 100644 --- a/techage/power/formspecs.lua +++ b/techage/power/formspecs.lua @@ -28,6 +28,7 @@ techage.power = {} -- Helper function ------------------------------------------------------------------------------- local function round(val) + val = tonumber(val) or 0 if val > 100 then return math.floor(val + 0.5) elseif val > 10 then diff --git a/techage/ta3_power/tiny_generator.lua b/techage/ta3_power/tiny_generator.lua index a6d31a9..17ee65d 100644 --- a/techage/ta3_power/tiny_generator.lua +++ b/techage/ta3_power/tiny_generator.lua @@ -225,8 +225,8 @@ minetest.register_node("techage:tiny_generator", { meta:set_string("liquid_name", nvm.liquid.name) meta:set_int("liquid_amount", nvm.liquid.amount) meta:set_string("description", S("TA3 Tiny Power Generator") .. " (fuel: " .. - tostring(nvm.liquid and nvm.liquid.amount or 0) .. "/" .. - tostring(fuel.CAPACITY) .. ")") + tostring(nvm.liquid and nvm.liquid.amount or 0) .. "/" .. + tostring(fuel.CAPACITY) .. ")") end end, diff --git a/techage/tools/repairkit.lua b/techage/tools/repairkit.lua index fab6f38..1ef971e 100644 --- a/techage/tools/repairkit.lua +++ b/techage/tools/repairkit.lua @@ -222,13 +222,29 @@ local function on_place(itemstack, placer, pointed_thing) end end +local function repair(itemstack, placer, pointed_thing) + if pointed_thing.type == "node" then + local pos = pointed_thing.under + if not placer or minetest.is_protected(pos, placer:get_player_name()) then + return + end + local number = techage.get_node_number(pos) + if number and not techage.get_node_info(number) then + techage.repair_number(pos) + minetest.chat_send_player(placer:get_player_name(), "Node repaired!") + itemstack:add_wear(65636/200) + return itemstack + end + end +end + minetest.register_tool("techage:repairkit", { description = S("TechAge Repair Kit"), inventory_image = "techage_repairkit.png", wield_image = "techage_repairkit.png^[transformR270", groups = {cracky=1, book=1}, - --on_use = repair, - --on_place = repair, + on_use = repair, + on_place = repair, node_placement_prediction = "", stack_max = 1, }) @@ -254,3 +270,12 @@ minetest.register_craft({ {"default:steel_ingot", "", ""}, }, }) + +--minetest.register_craft({ +-- output = "techage:repairkit", +-- recipe = { +-- {"", "", ""}, +-- {"", "techage:end_wrench", ""}, +-- {"", "", ""}, +-- }, +--}) diff --git a/unified_inventory/README.md b/unified_inventory/README.md index 5d23f79..8c64ab1 100644 --- a/unified_inventory/README.md +++ b/unified_inventory/README.md @@ -102,3 +102,16 @@ Other files from Wikimedia Commons: RealBadAngel: (CC-BY-4.0) * Everything else. + + +## Sounds + + * [`bell.ogg`](https://freesound.org/people/bennstir/sounds/81072/) by bennstir, CC 4.0 + * [`electricity.ogg`](https://freesound.org/people/Halleck/sounds/19486/) by Halleck, CC 4.0 (cut) + * [`pageflip1.ogg`](https://freesound.org/people/themfish/sounds/45823/) by themfish, CC 4.0 (cut, slowed down) + * `pageflip2.ogg` (derived from `pageflip1.ogg`) + * [`trash.ogg`](https://freesound.org/people/OwlStorm/sounds/151231/) by OwlStorm, CC 0 (speed up) + * [`trash_all.ogg`](https://freesound.org/people/abel_K/sounds/68280/) by abel_K, Sampling Plus 1.0 (speed up) + * [`ui_click.ogg`](https://freesound.org/people/lartti/sounds/527569/) by lartti, CC 0 (cut) + * [`ui_morning.ogg`](https://freesound.org/people/InspectorJ/sounds/439472/) by InspectorJ, CC 4.0 + * [`ui_owl.ogg`](https://freesound.org/people/manda_g/sounds/54987/) by manda_g, Sampling Plus 1.0 (cut) diff --git a/unified_inventory/api.lua b/unified_inventory/api.lua index e4b67fa..0437391 100644 --- a/unified_inventory/api.lua +++ b/unified_inventory/api.lua @@ -145,50 +145,18 @@ minetest.after(0.01, function() 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 1: Initialize cache for looking up groups + unified_inventory.init_matching_cache() -- 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 get_matching_spec_items = unified_inventory.get_matching_items - 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 + for outputitemname, recipes in pairs(ui.crafts_for.recipe) do -- List of crafts that return this item string (variable "_") + + -- Problem: The group cache must be initialized after all mods finished loading + -- thus, invalid recipes might be indexed. Hence perform filtering with `new_recipe_list` + local new_recipe_list = {} for _, recipe in ipairs(recipes) do local ingredient_items = {} for _, spec in pairs(recipe.items) do @@ -204,7 +172,14 @@ minetest.after(0.01, function() end table.insert(ui.crafts_for.usage[name], recipe) end + + if next(ingredient_items) then + -- There's at least one known ingredient: mark as good recipe + -- PS: What whatll be done about partially incomplete recipes? + table.insert(new_recipe_list, recipe) + end end + ui.crafts_for.recipe[outputitemname] = new_recipe_list end for _, callback in ipairs(ui.initialized_callbacks) do diff --git a/unified_inventory/bags.lua b/unified_inventory/bags.lua index 876b1a5..464b65b 100644 --- a/unified_inventory/bags.lua +++ b/unified_inventory/bags.lua @@ -10,25 +10,26 @@ local F = minetest.formspec_escape local ui = unified_inventory ui.register_page("bags", { - get_formspec = function(player) + get_formspec = function(player, perplayer_formspec) local player_name = player:get_player_name() - return { formspec = table.concat({ - ui.style_full.standard_inv_bg, - ui.single_slot(0.925, 1.5), - ui.single_slot(3.425, 1.5), - ui.single_slot(5.925, 1.5), - ui.single_slot(8.425, 1.5), - "label["..ui.style_full.form_header_x..","..ui.style_full.form_header_y..";" .. F(S("Bags")) .. "]", - "button[0.6125,2.75;1.875,0.75;bag1;" .. F(S("Bag @1", 1)) .. "]", - "button[3.1125,2.75;1.875,0.75;bag2;" .. F(S("Bag @1", 2)) .. "]", - "button[5.6125,2.75;1.875,0.75;bag3;" .. F(S("Bag @1", 3)) .. "]", - "button[8.1125,2.75;1.875,0.75;bag4;" .. F(S("Bag @1", 4)) .. "]", + local std_inv_x = perplayer_formspec.std_inv_x + local formspec = { + perplayer_formspec.standard_inv_bg, + "label[", perplayer_formspec.form_header_x, ",", + perplayer_formspec.form_header_y, ";", F(S("Bags")), "]", "listcolors[#00000000;#00000000]", - "list[detached:" .. F(player_name) .. "_bags;bag1;1.075,1.65;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag2;3.575,1.65;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag3;6.075,1.65;1,1;]", - "list[detached:" .. F(player_name) .. "_bags;bag4;8.575,1.65;1,1;]" - }) } + } + + for i = 1, 4 do + local x = std_inv_x + i * 2.5 + formspec[#formspec + 1] = ui.single_slot(x - 1.875, 1.5) + formspec[#formspec + 1] = string.format("list[detached:%s_bags;bag%i;%.3f,1.65;1,1;]", + F(player_name), i, x - 1.725) + formspec[#formspec + 1] = string.format("button[%.4f,2.75;1.875,0.75;bag%i;%s]", + x - 2.1875, i, F(S("Bag @1", i))) + end + + return { formspec = table.concat(formspec) } end, }) @@ -36,7 +37,6 @@ ui.register_button("bags", { type = "image", image = "ui_bags_icon.png", tooltip = S("Bags"), - hide_lite=true }) local function get_player_bag_stack(player, i) @@ -48,23 +48,38 @@ end for bag_i = 1, 4 do ui.register_page("bag" .. bag_i, { - get_formspec = function(player) + get_formspec = function(player, perplayer_formspec) local stack = get_player_bag_stack(player, bag_i) local image = stack:get_definition().inventory_image local slots = stack:get_definition().groups.bagslots + local std_inv_x = perplayer_formspec.std_inv_x + local lite_mode = perplayer_formspec.is_lite_mode + + local bag_inv_y, header_x, header_y = 1.5, 0.3, 0.65 + if lite_mode then + bag_inv_y = 0.5 + header_x = perplayer_formspec.form_header_x + header_y = perplayer_formspec.form_header_y + end local formspec = { - ui.style_full.standard_inv_bg, - ui.make_inv_img_grid(0.3, 1.5, 8, slots/8), - "image[9.2,0.4;1,1;" .. image .. "]", - "label[0.3,0.65;" .. F(S("Bag @1", bag_i)) .. "]", + perplayer_formspec.standard_inv_bg, + ui.make_inv_img_grid(std_inv_x, bag_inv_y, 8, slots/8), + "label[", header_x, ",", header_y, ";", F(S("Bag @1", bag_i)), "]", "listcolors[#00000000;#00000000]", "listring[current_player;main]", string.format("list[current_player;bag%icontents;%f,%f;8,3;]", - bag_i, 0.3 + ui.list_img_offset, 1.5 + ui.list_img_offset), - "listring[current_name;bag" .. bag_i .. "contents]", + bag_i, std_inv_x + ui.list_img_offset, bag_inv_y + ui.list_img_offset), + "listring[current_name;bag", bag_i, "contents]", } + + if lite_mode then + return { formspec = table.concat(formspec) } + end + local n = #formspec + 1 + formspec[n] = "image[" .. std_inv_x + 8.9 .. ",0.4;1,1;" .. image .. "]" + n = n + 1 local player_name = player:get_player_name() -- For if statement. if ui.trash_enabled diff --git a/unified_inventory/callbacks.lua b/unified_inventory/callbacks.lua index fa6d03a..52cb710 100644 --- a/unified_inventory/callbacks.lua +++ b/unified_inventory/callbacks.lua @@ -57,30 +57,47 @@ end) local function apply_new_filter(player, search_text, new_dir) local player_name = player:get_player_name() - minetest.sound_play("click", {to_player=player_name, gain = 0.1}) + minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) ui.apply_filter(player, search_text, new_dir) ui.current_searchbox[player_name] = search_text ui.set_inventory_formspec(player, ui.current_page[player_name]) end -minetest.register_on_player_receive_fields(function(player, formname, fields) +-- Search box handling +local function receive_fields_searchbox(player, formname, fields) local player_name = player:get_player_name() - local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name) + -- always take new search text, even if not searching on it yet + if fields.searchbox and fields.searchbox ~= ui.current_searchbox[player_name] then + ui.current_searchbox[player_name] = fields.searchbox + end + if fields.searchbutton + or fields.key_enter_field == "searchbox" then + + if ui.current_searchbox[player_name] ~= ui.activefilter[player_name] then + ui.apply_filter(player, ui.current_searchbox[player_name], "nochange") + ui.set_inventory_formspec(player, ui.current_page[player_name]) + minetest.sound_play("paperflip2", + {to_player=player_name, gain = 1.0}) + end + elseif fields.searchresetbutton then + if ui.activefilter[player_name] ~= "" then + apply_new_filter(player, "", "nochange") + end + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) if formname ~= "" then return end - -- always take new search text, even if not searching on it yet - local dirty_search_filter = false + receive_fields_searchbox(player, formname, fields) - if fields.searchbox - and fields.searchbox ~= unified_inventory.current_searchbox[player_name] then - unified_inventory.current_searchbox[player_name] = fields.searchbox - dirty_search_filter = true - end + local player_name = player:get_player_name() + local ui_peruser,draw_lite_mode = unified_inventory.get_per_player_formspec(player_name) local clicked_category for name, value in pairs(fields) do @@ -114,7 +131,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) for i, def in pairs(unified_inventory.buttons) do if fields[def.name] then def.action(player) - minetest.sound_play("click", + minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) return end @@ -179,7 +196,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end if clicked_item then - minetest.sound_play("click", + minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) local page = unified_inventory.current_page[player_name] local player_creative = unified_inventory.is_creative(player_name) @@ -201,25 +218,11 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end - if fields.searchbutton - or fields.key_enter_field == "searchbox" then - if dirty_search_filter then - ui.apply_filter(player, ui.current_searchbox[player_name], "nochange") - ui.set_inventory_formspec(player, ui.current_page[player_name]) - minetest.sound_play("paperflip2", - {to_player=player_name, gain = 1.0}) - end - elseif fields.searchresetbutton then - if ui.activefilter[player_name] ~= "" then - apply_new_filter(player, "", "nochange") - end - end - -- alternate buttons if not (fields.alternate or fields.alternate_prev) then return end - minetest.sound_play("click", + minetest.sound_play("ui_click", {to_player=player_name, gain = 0.1}) local item_name = unified_inventory.current_item[player_name] if not item_name then diff --git a/unified_inventory/doc/mod_api.txt b/unified_inventory/doc/mod_api.txt index 99fa638..45eb432 100644 --- a/unified_inventory/doc/mod_api.txt +++ b/unified_inventory/doc/mod_api.txt @@ -24,7 +24,9 @@ Grouped by use-case, afterwards sorted alphabetically. Callbacks --------- -Register a callback that will be run whenever a craft is registered via unified_inventory.register_craft: +Register a callback that will be run whenever a craft is registered via unified_inventory.register_craft. +This callback is run before any recipe ingredients checks, hence it is also executed on recipes that are +purged after all mods finished loading. unified_inventory.register_on_craft_registered( function (item_name, options) diff --git a/unified_inventory/group.lua b/unified_inventory/group.lua index 2bc8e2f..1483b3c 100644 --- a/unified_inventory/group.lua +++ b/unified_inventory/group.lua @@ -1,4 +1,5 @@ local S = minetest.get_translator("unified_inventory") +local ui = unified_inventory function unified_inventory.extract_groupnames(groupname) local specname = ItemStack(groupname):get_name() @@ -26,6 +27,7 @@ end -- It may be a comma-separated list of group names. This is really a -- "group:..." ingredient specification, minus the "group:" prefix. +-- TODO Replace this with the more efficient spec matcher (below) local function compute_group_item(group_name_list) local group_names = group_name_list:split(",") local candidate_items = {} @@ -84,3 +86,61 @@ function unified_inventory.get_group_item(group_name) return group_item_cache[group_name] end + +--[[ +This is for filtering known items by groups +e.g. find all items that match "group:flower,yellow" (flower AND yellow groups) +]] +local spec_matcher = {} +function unified_inventory.init_matching_cache() + 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 +end + +--[[ +Retrieves all matching items + +Arguments: + specname (string): Item name or group(s) to filter + +Output: + { + matchingitem1 = true, + ... + } +]] +function unified_inventory.get_matching_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 diff --git a/unified_inventory/internal.lua b/unified_inventory/internal.lua index 45db6b3..0903d86 100644 --- a/unified_inventory/internal.lua +++ b/unified_inventory/internal.lua @@ -274,9 +274,11 @@ local function formspec_add_item_browser(player, formspec, ui_peruser) end end end - formspec[n] = string.format("label[%f,%f;%s: %s]", - ui_peruser.page_buttons_x + ui_peruser.btn_spc * (ui_peruser.is_lite_mode and 1 or 2), - ui_peruser.page_buttons_y + 0.1 + ui_peruser.btn_spc * 2, + formspec[n] = "style[page_number;content_offset=0]" + formspec[n + 1] = string.format("image_button[%f,%f;%f,0.4;;page_number;%s: %s;false;false;]", + ui_peruser.page_buttons_x, + ui_peruser.page_buttons_y + ui_peruser.btn_spc * 2 - 0.1, + ui_peruser.btn_spc * (bn - 1) + ui_peruser.btn_size, F(S("Page")), S("@1 of @2",page2,pagemax)) end diff --git a/unified_inventory/match_craft.lua b/unified_inventory/match_craft.lua index 2dd40b0..b2d18ec 100644 --- a/unified_inventory/match_craft.lua +++ b/unified_inventory/match_craft.lua @@ -126,25 +126,18 @@ Example output: } --]] function unified_inventory.find_usable_items(inv_items, craft_items) - local get_group = minetest.get_item_group local result = {} for craft_item in pairs(craft_items) do - local group = craft_item:match("^group:(.+)") - local found = {} + -- may specify group:type1,type2 + local items = unified_inventory.get_matching_items(craft_item) - if group ~= nil then - for inv_item in pairs(inv_items) do - if get_group(inv_item, group) > 0 then - found[inv_item] = true - end - end - else - if inv_items[craft_item] ~= nil then - found[craft_item] = true + local found = {} + for itemname, _ in pairs(items) do + if inv_items[itemname] then + found[itemname] = true end end - result[craft_item] = found end diff --git a/unified_inventory/register.lua b/unified_inventory/register.lua index 1f72bfe..225a861 100644 --- a/unified_inventory/register.lua +++ b/unified_inventory/register.lua @@ -98,7 +98,7 @@ ui.register_button("misc_set_day", { action = function(player) local player_name = player:get_player_name() if minetest.check_player_privs(player_name, {settime=true}) then - minetest.sound_play("birds", + minetest.sound_play("ui_morning", {to_player=player_name, gain = 1.0}) minetest.set_timeofday((6000 % 24000) / 24000) minetest.chat_send_player(player_name, @@ -122,7 +122,7 @@ ui.register_button("misc_set_night", { action = function(player) local player_name = player:get_player_name() if minetest.check_player_privs(player_name, {settime=true}) then - minetest.sound_play("owl", + minetest.sound_play("ui_owl", {to_player=player_name, gain = 1.0}) minetest.set_timeofday((21000 % 24000) / 24000) minetest.chat_send_player(player_name, @@ -183,14 +183,14 @@ ui.register_page("craft", { local n=#formspec+1 if ui.trash_enabled or ui.is_creative(player_name) or minetest.get_player_privs(player_name).give then - formspec[n] = string.format("label[%f,%f;%s]", craftx + 6.45, crafty + 2.4, F(S("Trash:"))) + formspec[n] = string.format("label[%f,%f;%s]", craftx + 6.35, crafty + 2.3, F(S("Trash:"))) formspec[n+1] = ui.make_trash_slot(craftx + 6.25, crafty + 2.5) n=n + 2 end if ui.is_creative(player_name) then formspec[n] = ui.single_slot(craftx - 2.5, crafty + 2.5) - formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.3, crafty + 2.4,F(S("Refill:"))) + formspec[n+1] = string.format("label[%f,%f;%s]", craftx - 2.4, crafty + 2.3, F(S("Refill:"))) formspec[n+2] = string.format("list[detached:%srefill;main;%f,%f;1,1;]", F(player_name), craftx - 2.5 + ui.list_img_offset, crafty + 2.5 + ui.list_img_offset) end diff --git a/unified_inventory/sounds/birds.ogg b/unified_inventory/sounds/birds.ogg deleted file mode 100644 index 4a9339544a9ce969a2ff2402d4e951d36dc03077..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14797 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 diff --git a/unified_inventory/sounds/ui_click.ogg b/unified_inventory/sounds/ui_click.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0c9fe31b1c8ee2254ca4965bd883491d9f3221d8 GIT binary patch literal 6125 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 literal 0 HcmV?d00001 diff --git a/unified_inventory/sounds/ui_morning.ogg b/unified_inventory/sounds/ui_morning.ogg new file mode 100644 index 0000000000000000000000000000000000000000..7fb8c22bdefb7036b1831e3cffd4a2bb179659b9 GIT binary patch literal 23446 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 literal 0 HcmV?d00001 diff --git a/unified_inventory/sounds/ui_owl.ogg b/unified_inventory/sounds/ui_owl.ogg new file mode 100644 index 0000000000000000000000000000000000000000..a1433f9e8e676a6ce2ab8dc8a73a24d2edf681dc GIT binary patch literal 14621 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