diff --git a/.github/workflows/luacheck.yml b/.github/workflows/luacheck.yml index a13efa9..b501650 100644 --- a/.github/workflows/luacheck.yml +++ b/.github/workflows/luacheck.yml @@ -1,13 +1,10 @@ name: luacheck on: [push, pull_request] jobs: - build: + luacheck: runs-on: ubuntu-latest steps: - - uses: actions/checkout@master - - name: apt - run: sudo apt-get install -y luarocks - - name: luacheck install - run: luarocks install --local luacheck - - name: luacheck run - run: $HOME/.luarocks/bin/luacheck ./ + - name: Checkout + uses: actions/checkout@master + - name: Luacheck + uses: lunarmodules/luacheck@master \ No newline at end of file diff --git a/common.lua b/common.lua index b057fe4..5db3feb 100644 --- a/common.lua +++ b/common.lua @@ -1,3 +1,96 @@ +local S = minetest.get_translator("pipeworks") + +-- Random variables + +pipeworks.expect_infinite_stacks = true +if minetest.get_modpath("unified_inventory") or not minetest.settings:get_bool("creative_mode") then + pipeworks.expect_infinite_stacks = false +end + +pipeworks.meseadjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}} + +pipeworks.rules_all = {{x=0, y=0, z=1},{x=0, y=0, z=-1},{x=1, y=0, z=0},{x=-1, y=0, z=0}, + {x=0, y=1, z=1},{x=0, y=1, z=-1},{x=1, y=1, z=0},{x=-1, y=1, z=0}, + {x=0, y=-1, z=1},{x=0, y=-1, z=-1},{x=1, y=-1, z=0},{x=-1, y=-1, z=0}, + {x=0, y=1, z=0}, {x=0, y=-1, z=0}} + +pipeworks.mesecons_rules={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=1,z=0},{x=0,y=-1,z=0}} +pipeworks.digilines_rules={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=1,z=0},{x=0,y=-1,z=0}} + +pipeworks.liquid_texture = minetest.registered_nodes[pipeworks.liquids.water.flowing].tiles[1] +if type(pipeworks.liquid_texture) == "table" then pipeworks.liquid_texture = pipeworks.liquid_texture.name end + +pipeworks.button_off = {text="", texture="pipeworks_button_off.png", addopts="false;false;pipeworks_button_interm.png"} +pipeworks.button_on = {text="", texture="pipeworks_button_on.png", addopts="false;false;pipeworks_button_interm.png"} +pipeworks.button_base = "image_button[0,4.3;1,0.6" +pipeworks.button_label = "label[0.9,4.31;"..S("Allow splitting incoming stacks from tubes").."]" + +-- Helper functions + +function pipeworks.fix_image_names(table, replacement) + local outtable={} + for i in ipairs(table) do + outtable[i]=string.gsub(table[i], "_XXXXX", replacement) + end + + return outtable +end + +local function overlay_tube_texture(texture) + -- The texture appears the first time to be colorized as the opaque background. + return ("(%s)^[noalpha^[colorize:#dadada^(%s)"):format(texture, texture) +end + +function pipeworks.make_tube_tile(tile) + if pipeworks.use_real_entities then + return tile + elseif type(tile) == "string" then + return overlay_tube_texture(tile) + else + tile = table.copy(tile) + if tile.color then + -- Won't work 100% of the time, but good enough. + tile.name = tile.name .. "^[multiply:" .. minetest.colorspec_to_colorstring(tile.color) + tile.color = nil + end + tile.name = overlay_tube_texture(tile.name) + tile.backface_culling = nil -- The texture is opaque + return tile + end +end + +function pipeworks.add_node_box(t, b) + if not t or not b then return end + for i in ipairs(b) + do table.insert(t, b[i]) + end +end + +function pipeworks.may_configure(pos, player) + local name = player:get_player_name() + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + + if owner ~= "" and owner == name then -- wielders and filters + return true + end + return not minetest.is_protected(pos, name) +end + +function pipeworks.replace_name(tbl,tr,name) + local ntbl={} + for key,i in pairs(tbl) do + if type(i)=="string" then + ntbl[key]=string.gsub(i,tr,name) + elseif type(i)=="table" then + ntbl[key]=pipeworks.replace_name(i,tr,name) + else + ntbl[key]=i + end + end + return ntbl +end + ---------------------- -- Vector functions -- ---------------------- diff --git a/crafts.lua b/crafts.lua index dc9319b..7ed9671 100644 --- a/crafts.lua +++ b/crafts.lua @@ -1,70 +1,5 @@ -local materials = { - stone = "default:stone", - desert_stone = "default:desert_stone", - desert_sand = "default:desert_sand", - chest = "default:chest", - copper_ingot = "default:copper_ingot", - steel_ingot = "default:steel_ingot", - gold_ingot = "default:gold_ingot", - mese = "default:mese", - mese_crystal = "default:mese_crystal", - mese_crystal_fragment = "default:mese_crystal_fragment", - teleporter = "default:mese", - glass = "default:glass", -} - -if minetest.get_modpath("mcl_core") then - materials = { - stone = "mcl_core:stone", - desert_stone = "mcl_core:redsandstone", - desert_sand = "mcl_core:sand", - chest = "mcl_chests:chest", - steel_ingot = "mcl_core:iron_ingot", - gold_ingot = "mcl_core:gold_ingot", - mese = "mesecons_torch:redstoneblock", - mese_crystal = "mesecons:redstone", - mese_crystal_fragment = "mesecons:redstone", - teleporter = "mesecons_torch:redstoneblock", - copper_ingot = "mcl_copper:copper_ingot", - glass = "mcl_core:glass", - } -elseif minetest.get_modpath("fl_ores") and minetest.get_modpath("fl_stone") then - materials = { - stone = "fl_stone:stone", - desert_stone = "fl_stone:desert_stone", - desert_sand = "fl_stone:desert_sand", - chest = "fl_storage:wood_chest", - steel_ingot = "fl_ores:iron_ingot", - gold_ingot = "fl_ores:gold_ingot", - mese = "fl_ores:iron_ingot", - mese_crystal = "fl_ores:iron_ingot", - mese_crystal_fragment = "fl_ores:iron_ingot", - teleporter = "fl_ores:iron_ingot", - copper_ingot = "fl_ores:copper_ingot", - glass = "fl_glass:framed_glass", - } -elseif minetest.get_modpath("hades_core") then - materials = { - stone = "hades_core:stone", - desert_stone = "hades_core:stone_baked", - desert_sand = "hades_core:volcanic_sand", - chest = "hades_chests:chest"; - steel_ingot = "hades_core:steel_ingot", - gold_ingot = "hades_core:gold_ingot", - mese = "hades_core:mese", - mese_crystal = "hades_core:mese_crystal", - mese_crystal_fragment = "hades_core:mese_crystal_fragment", - teleporter = "hades_materials:teleporter_device", - copper_ingot = "hades_core:copper_ingot", - tin_ingot = "hades_core:tin_ingot", - glass = "hades_core:glass", - } - if minetest.get_modpath("hades_default") then - materials.desert_sand = "hades_default:desert_sand" - end -end - -- Crafting recipes for pipes +local materials = ... minetest.register_craft( { output = "pipeworks:pipe_1_empty 12", @@ -194,15 +129,6 @@ minetest.register_craft( { }, }) -minetest.register_craft( { - output = "pipeworks:steel_block_embedded_tube 1", - recipe = { - { materials.steel_ingot, materials.steel_ingot, materials.steel_ingot }, - { materials.steel_ingot, "pipeworks:tube_1", materials.steel_ingot }, - { materials.steel_ingot, materials.steel_ingot, materials.steel_ingot } - }, -}) - minetest.register_craft( { output = "pipeworks:steel_pane_embedded_tube 1", recipe = { diff --git a/init.lua b/init.lua index 2c21c84..5a86a01 100644 --- a/init.lua +++ b/init.lua @@ -4,21 +4,20 @@ -- and devices that they can connect to. -- -pipeworks = {} -pipeworks.ui_cat_tube_list = {} - -pipeworks.worldpath = minetest.get_worldpath() -pipeworks.modpath = minetest.get_modpath("pipeworks") -local S = minetest.get_translator("pipeworks") - -pipeworks.liquids = {} -pipeworks.liquids.water = { - source = minetest.registered_nodes["mapgen_water_source"].name, - flowing = minetest.registered_nodes["mapgen_water_source"].liquid_alternative_flowing -} -pipeworks.liquids.river_water = { - source = minetest.registered_nodes["mapgen_river_water_source"].name, - flowing = minetest.registered_nodes["mapgen_river_water_source"].liquid_alternative_flowing +pipeworks = { + ui_cat_tube_list = {}, + worldpath = minetest.get_worldpath(), + modpath = minetest.get_modpath("pipeworks"), + liquids = { + water = { + source = minetest.registered_nodes["mapgen_water_source"].name, + flowing = minetest.registered_nodes["mapgen_water_source"].liquid_alternative_flowing + }, + river_water = { + source = minetest.registered_nodes["mapgen_river_water_source"].name, + flowing = minetest.registered_nodes["mapgen_river_water_source"].liquid_alternative_flowing + } + } } dofile(pipeworks.modpath.."/default_settings.lua") @@ -36,97 +35,6 @@ if pipeworks.entity_update_interval >= 0.2 and pipeworks.enable_accelerator_tube minetest.log("warning", "pipeworks accelerator tubes will not entirely work with an entity update interval 0.2 or above.") end --- Random variables - -pipeworks.expect_infinite_stacks = true -if minetest.get_modpath("unified_inventory") or not minetest.settings:get_bool("creative_mode") then - pipeworks.expect_infinite_stacks = false -end - -pipeworks.meseadjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}} - -pipeworks.rules_all = {{x=0, y=0, z=1},{x=0, y=0, z=-1},{x=1, y=0, z=0},{x=-1, y=0, z=0}, - {x=0, y=1, z=1},{x=0, y=1, z=-1},{x=1, y=1, z=0},{x=-1, y=1, z=0}, - {x=0, y=-1, z=1},{x=0, y=-1, z=-1},{x=1, y=-1, z=0},{x=-1, y=-1, z=0}, - {x=0, y=1, z=0}, {x=0, y=-1, z=0}} - -pipeworks.mesecons_rules={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=1,z=0},{x=0,y=-1,z=0}} -pipeworks.digilines_rules={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=1,z=0},{x=0,y=-1,z=0}} - -pipeworks.liquid_texture = minetest.registered_nodes[pipeworks.liquids.water.flowing].tiles[1] -if type(pipeworks.liquid_texture) == "table" then pipeworks.liquid_texture = pipeworks.liquid_texture.name end - -pipeworks.button_off = {text="", texture="pipeworks_button_off.png", addopts="false;false;pipeworks_button_interm.png"} -pipeworks.button_on = {text="", texture="pipeworks_button_on.png", addopts="false;false;pipeworks_button_interm.png"} -pipeworks.button_base = "image_button[0,4.3;1,0.6" -pipeworks.button_label = "label[0.9,4.31;"..S("Allow splitting incoming stacks from tubes").."]" - --- Helper functions - -function pipeworks.fix_image_names(table, replacement) - local outtable={} - for i in ipairs(table) do - outtable[i]=string.gsub(table[i], "_XXXXX", replacement) - end - - return outtable -end - -local function overlay_tube_texture(texture) - -- The texture appears the first time to be colorized as the opaque background. - return ("(%s)^[noalpha^[colorize:#dadada^(%s)"):format(texture, texture) -end - -function pipeworks.make_tube_tile(tile) - if pipeworks.use_real_entities then - return tile - elseif type(tile) == "string" then - return overlay_tube_texture(tile) - else - tile = table.copy(tile) - if tile.color then - -- Won't work 100% of the time, but good enough. - tile.name = tile.name .. "^[multiply:" .. minetest.colorspec_to_colorstring(tile.color) - tile.color = nil - end - tile.name = overlay_tube_texture(tile.name) - tile.backface_culling = nil -- The texture is opaque - return tile - end -end - -function pipeworks.add_node_box(t, b) - if not t or not b then return end - for i in ipairs(b) - do table.insert(t, b[i]) - end -end - -function pipeworks.may_configure(pos, player) - local name = player:get_player_name() - local meta = minetest.get_meta(pos) - local owner = meta:get_string("owner") - - if owner ~= "" and owner == name then -- wielders and filters - return true - end - return not minetest.is_protected(pos, name) -end - -function pipeworks.replace_name(tbl,tr,name) - local ntbl={} - for key,i in pairs(tbl) do - if type(i)=="string" then - ntbl[key]=string.gsub(i,tr,name) - elseif type(i)=="table" then - ntbl[key]=pipeworks.replace_name(i,tr,name) - else - ntbl[key]=i - end - end - return ntbl -end - pipeworks.logger = function(msg) minetest.log("action", "[pipeworks] "..msg) end @@ -150,15 +58,29 @@ dofile(pipeworks.modpath.."/autoplace_tubes.lua") dofile(pipeworks.modpath.."/luaentity.lua") dofile(pipeworks.modpath.."/item_transport.lua") dofile(pipeworks.modpath.."/flowing_logic.lua") -dofile(pipeworks.modpath.."/tube_registration.lua") -dofile(pipeworks.modpath.."/routing_tubes.lua") -dofile(pipeworks.modpath.."/sorting_tubes.lua") -dofile(pipeworks.modpath.."/signal_tubes.lua") -dofile(pipeworks.modpath.."/decorative_tubes.lua") dofile(pipeworks.modpath.."/filter-injector.lua") dofile(pipeworks.modpath.."/trashcan.lua") dofile(pipeworks.modpath.."/wielder.lua") +local materials = loadfile(pipeworks.modpath.."/materials.lua")() + +dofile(pipeworks.modpath.."/tubes/registration.lua") +dofile(pipeworks.modpath.."/tubes/routing.lua") +dofile(pipeworks.modpath.."/tubes/sorting.lua") +dofile(pipeworks.modpath.."/tubes/signal.lua") +loadfile(pipeworks.modpath.."/tubes/embedded_tube.lua")(materials) +dofile(pipeworks.modpath.."/tubes/pane_embedded_tube.lua") + +if pipeworks.enable_teleport_tube then + dofile(pipeworks.modpath.."/tubes/teleport.lua") +end +if pipeworks.enable_lua_tube and minetest.get_modpath("mesecons") then + dofile(pipeworks.modpath.."/tubes/lua.lua") +end +if pipeworks.enable_sand_tube or pipeworks.enable_mese_sand_tube then + dofile(pipeworks.modpath.."/tubes/vacuum.lua") +end + local logicdir = "/pressure_logic/" -- note that even with these files the new flow logic is not yet default. @@ -172,9 +94,6 @@ dofile(pipeworks.modpath..logicdir.."flowable_node_registry_install.lua") if pipeworks.enable_pipes then dofile(pipeworks.modpath.."/pipes.lua") end -if pipeworks.enable_teleport_tube then - dofile(pipeworks.modpath.."/teleport_tube.lua") -end if pipeworks.enable_pipe_devices then dofile(pipeworks.modpath.."/devices.lua") end @@ -191,14 +110,8 @@ end if pipeworks.enable_autocrafter then dofile(pipeworks.modpath.."/autocrafter.lua") end -if pipeworks.enable_lua_tube and minetest.get_modpath("mesecons") then - dofile(pipeworks.modpath.."/lua_tube.lua") -end -if pipeworks.enable_sand_tube or pipeworks.enable_mese_sand_tube then - dofile(pipeworks.modpath.."/vacuum_tubes.lua") -end -dofile(pipeworks.modpath.."/crafts.lua") +loadfile(pipeworks.modpath.."/crafts.lua")(materials) minetest.register_alias("pipeworks:pipe", "pipeworks:pipe_110000_empty") diff --git a/materials.lua b/materials.lua new file mode 100644 index 0000000..ca9adf5 --- /dev/null +++ b/materials.lua @@ -0,0 +1,67 @@ +local materials = { + stone = "default:stone", + desert_stone = "default:desert_stone", + desert_sand = "default:desert_sand", + chest = "default:chest", + copper_ingot = "default:copper_ingot", + steel_ingot = "default:steel_ingot", + gold_ingot = "default:gold_ingot", + mese = "default:mese", + mese_crystal = "default:mese_crystal", + mese_crystal_fragment = "default:mese_crystal_fragment", + teleporter = "default:mese", + glass = "default:glass" +} + +if minetest.get_modpath("mcl_core") then + materials = { + stone = "mcl_core:stone", + desert_stone = "mcl_core:redsandstone", + desert_sand = "mcl_core:sand", + chest = "mcl_chests:chest", + steel_ingot = "mcl_core:iron_ingot", + gold_ingot = "mcl_core:gold_ingot", + mese = "mesecons_torch:redstoneblock", + mese_crystal = "mesecons:redstone", + mese_crystal_fragment = "mesecons:redstone", + teleporter = "mesecons_torch:redstoneblock", + copper_ingot = "mcl_copper:copper_ingot", + glass = "mcl_core:glass", + } +elseif minetest.get_modpath("fl_ores") and minetest.get_modpath("fl_stone") then + materials = { + stone = "fl_stone:stone", + desert_stone = "fl_stone:desert_stone", + desert_sand = "fl_stone:desert_sand", + chest = "fl_storage:wood_chest", + steel_ingot = "fl_ores:iron_ingot", + gold_ingot = "fl_ores:gold_ingot", + mese = "fl_ores:iron_ingot", + mese_crystal = "fl_ores:iron_ingot", + mese_crystal_fragment = "fl_ores:iron_ingot", + teleporter = "fl_ores:iron_ingot", + copper_ingot = "fl_ores:copper_ingot", + glass = "fl_glass:framed_glass", + } +elseif minetest.get_modpath("hades_core") then + materials = { + stone = "hades_core:stone", + desert_stone = "hades_core:stone_baked", + desert_sand = "hades_core:volcanic_sand", + chest = "hades_chests:chest"; + steel_ingot = "hades_core:steel_ingot", + gold_ingot = "hades_core:gold_ingot", + mese = "hades_core:mese", + mese_crystal = "hades_core:mese_crystal", + mese_crystal_fragment = "hades_core:mese_crystal_fragment", + teleporter = "hades_materials:teleporter_device", + copper_ingot = "hades_core:copper_ingot", + tin_ingot = "hades_core:tin_ingot", + glass = "hades_core:glass", + } + if minetest.get_modpath("hades_default") then + materials.desert_sand = "hades_default:desert_sand" + end +end + +return materials \ No newline at end of file diff --git a/tubes/embedded_tube.lua b/tubes/embedded_tube.lua new file mode 100644 index 0000000..cc4c259 --- /dev/null +++ b/tubes/embedded_tube.lua @@ -0,0 +1,68 @@ +local materials = ... +local S = minetest.get_translator("pipeworks") + +local straight = function(pos, node, velocity, stack) return {velocity} end +local steel_tex = "[combine:16x16^[noalpha^[colorize:#D3D3D3" +if minetest.get_modpath("default") then steel_tex = "default_steel_block.png" end + +-- register an embedded tube +function pipeworks.register_embedded_tube(nodename, opts) + minetest.register_node(nodename, { + description = opts.description, + tiles = { + opts.base_texture, + opts.base_texture, + opts.base_texture, + opts.base_texture, + opts.base_texture .. "^pipeworks_tube_connection_metallic.png", + opts.base_texture .. "^pipeworks_tube_connection_metallic.png", + }, + paramtype = "light", + paramtype2 = "facedir", + groups = { + cracky = 1, + oddly_breakable_by_hand = 1, + tubedevice = 1, + dig_glass = 2, + pickaxey=1, + handy=1 + }, + _mcl_hardness = 0.8, + legacy_facedir_simple = true, + _sound_def = { + key = "node_sound_stone_defaults", + }, + tube = { + connect_sides = { + front = 1, + back = 1 + }, + priority = 50, + can_go = straight, + can_insert = function(pos, node, stack, direction) + local dir = minetest.facedir_to_dir(node.param2) + return vector.equals(dir, direction) or vector.equals(vector.multiply(dir, -1), direction) + end + }, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig, + on_rotate = pipeworks.on_rotate, + }) + + minetest.register_craft( { + output = nodename .. " 1", + recipe = { + { opts.base_ingredient, opts.base_ingredient, opts.base_ingredient }, + { opts.base_ingredient, "pipeworks:tube_1", opts.base_ingredient }, + { opts.base_ingredient, opts.base_ingredient, opts.base_ingredient } + }, + }) + pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = nodename +end + +-- steelblock embedded tube +pipeworks.register_embedded_tube("pipeworks:steel_block_embedded_tube", { + description = S("Airtight steelblock embedded tube"), + base_texture = steel_tex, + base_ingredient = materials.steel_ingot +}) diff --git a/lua_tube.lua b/tubes/lua.lua similarity index 100% rename from lua_tube.lua rename to tubes/lua.lua diff --git a/decorative_tubes.lua b/tubes/pane_embedded_tube.lua similarity index 60% rename from decorative_tubes.lua rename to tubes/pane_embedded_tube.lua index 4893d0c..b52aa58 100644 --- a/decorative_tubes.lua +++ b/tubes/pane_embedded_tube.lua @@ -1,39 +1,6 @@ local S = minetest.get_translator("pipeworks") local straight = function(pos, node, velocity, stack) return {velocity} end -local steel_tex = "[combine:16x16^[noalpha^[colorize:#D3D3D3" -if minetest.get_modpath("default") then steel_tex = "default_steel_block.png" end - -minetest.register_node("pipeworks:steel_block_embedded_tube", { - description = S("Airtight steelblock embedded tube"), - tiles = { - steel_tex, steel_tex, - steel_tex, steel_tex, - steel_tex .. "^pipeworks_tube_connection_metallic.png", - steel_tex .. "^pipeworks_tube_connection_metallic.png", - }, - paramtype = "light", - paramtype2 = "facedir", - groups = {cracky=1, oddly_breakable_by_hand = 1, tubedevice = 1, dig_glass = 2, pickaxey=1, handy=1}, - _mcl_hardness=0.8, - legacy_facedir_simple = true, - _sound_def = { - key = "node_sound_stone_defaults", - }, - tube = { - connect_sides = {front = 1, back = 1,}, - priority = 50, - can_go = straight, - can_insert = function(pos, node, stack, direction) - local dir = minetest.facedir_to_dir(node.param2) - return vector.equals(dir, direction) or vector.equals(vector.multiply(dir, -1), direction) - end, - }, - after_place_node = pipeworks.after_place, - after_dig_node = pipeworks.after_dig, - on_rotate = pipeworks.on_rotate, -}) -pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:steel_block_embedded_tube" local pane_box = { type = "fixed", diff --git a/tube_registration.lua b/tubes/registration.lua similarity index 100% rename from tube_registration.lua rename to tubes/registration.lua diff --git a/routing_tubes.lua b/tubes/routing.lua similarity index 100% rename from routing_tubes.lua rename to tubes/routing.lua diff --git a/signal_tubes.lua b/tubes/signal.lua similarity index 100% rename from signal_tubes.lua rename to tubes/signal.lua diff --git a/sorting_tubes.lua b/tubes/sorting.lua similarity index 100% rename from sorting_tubes.lua rename to tubes/sorting.lua diff --git a/teleport_tube.lua b/tubes/teleport.lua similarity index 100% rename from teleport_tube.lua rename to tubes/teleport.lua diff --git a/vacuum_tubes.lua b/tubes/vacuum.lua similarity index 100% rename from vacuum_tubes.lua rename to tubes/vacuum.lua