forked from mtcontrib/pipeworks
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
02322855d5
@ -275,7 +275,8 @@ minetest.register_node("pipeworks:autocrafter", {
|
|||||||
description = S("Autocrafter"),
|
description = S("Autocrafter"),
|
||||||
drawtype = "normal",
|
drawtype = "normal",
|
||||||
tiles = {"pipeworks_autocrafter.png"},
|
tiles = {"pipeworks_autocrafter.png"},
|
||||||
groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1, dig_generic = 1},
|
groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1, dig_generic = 1, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
tube = {insert_object = function(pos, node, stack, direction)
|
tube = {insert_object = function(pos, node, stack, direction)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
|
@ -149,7 +149,8 @@ function fs_helpers.get_inv(y)
|
|||||||
local inv_x = i3.settings.legacy_inventory and 0.75 or 0.22
|
local inv_x = i3.settings.legacy_inventory and 0.75 or 0.22
|
||||||
local inv_y = (y + 0.4) or 6.9
|
local inv_y = (y + 0.4) or 6.9
|
||||||
local size, spacing = 1, 0.1
|
local size, spacing = 1, 0.1
|
||||||
local hotbar_len = i3.settings.hotbar_len
|
local hotbar_len = i3.settings.hotbar_len or (i3.settings.legacy_inventory and 8 or 9)
|
||||||
|
local inv_size = i3.settings.inv_size or (hotbar_len * 4)
|
||||||
|
|
||||||
table.insert(fs, "style_type[box;colors=#77777710,#77777710,#777,#777]")
|
table.insert(fs, "style_type[box;colors=#77777710,#77777710,#777,#777]")
|
||||||
|
|
||||||
@ -162,13 +163,13 @@ function fs_helpers.get_inv(y)
|
|||||||
|
|
||||||
table.insert(fs, "style_type[box;colors=#666]")
|
table.insert(fs, "style_type[box;colors=#666]")
|
||||||
for i=0, 2 do
|
for i=0, 2 do
|
||||||
for j=0, (i3.settings.legacy_inventory and 7 or 8) do
|
for j=0, hotbar_len - 1 do
|
||||||
table.insert(fs, "box["..0.2+(j*0.1)+(j*size)..","..(inv_y+size+spacing+0.05)+(i*0.1)+(i*size)..";"..size..","..size..";]")
|
table.insert(fs, "box["..0.2+(j*0.1)+(j*size)..","..(inv_y+size+spacing+0.05)+(i*0.1)+(i*size)..";"..size..","..size..";]")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
table.insert(fs, "style_type[list;size="..size..";spacing="..spacing.."]")
|
table.insert(fs, "style_type[list;size="..size..";spacing="..spacing.."]")
|
||||||
table.insert(fs, "list[current_player;main;"..inv_x..","..(inv_y + 1.15)..";"..hotbar_len..","..(i3.settings.inv_size / hotbar_len)..";"..hotbar_len.."]")
|
table.insert(fs, "list[current_player;main;"..inv_x..","..(inv_y + 1.15)..";"..hotbar_len..","..(inv_size / hotbar_len)..";"..hotbar_len.."]")
|
||||||
else
|
else
|
||||||
table.insert(fs, "list[current_player;main;0.22,"..y..";8,4;]")
|
table.insert(fs, "list[current_player;main;0.22,"..y..";8,4;]")
|
||||||
end
|
end
|
||||||
|
18
crafts.lua
18
crafts.lua
@ -298,6 +298,24 @@ if pipeworks.enable_mese_tube then
|
|||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if pipeworks.enable_sand_tube then
|
||||||
|
minetest.register_craft( {
|
||||||
|
output = "pipeworks:sand_tube_1 2",
|
||||||
|
recipe = {
|
||||||
|
{"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"},
|
||||||
|
{"group:sand", "group:sand", "group:sand"},
|
||||||
|
{"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"}
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_craft( {
|
||||||
|
output = "pipeworks:sand_tube_1",
|
||||||
|
recipe = {
|
||||||
|
{"group:sand", "pipeworks:tube_1", "group:sand"},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
if pipeworks.enable_mese_sand_tube then
|
if pipeworks.enable_mese_sand_tube then
|
||||||
minetest.register_craft( {
|
minetest.register_craft( {
|
||||||
output = "pipeworks:mese_sand_tube_1 2",
|
output = "pipeworks:mese_sand_tube_1 2",
|
||||||
|
@ -14,7 +14,8 @@ minetest.register_node("pipeworks:steel_block_embedded_tube", {
|
|||||||
},
|
},
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {cracky=1, oddly_breakable_by_hand = 1, tubedevice = 1, dig_glass = 2},
|
groups = {cracky=1, oddly_breakable_by_hand = 1, tubedevice = 1, dig_glass = 2, pickaxey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
legacy_facedir_simple = true,
|
legacy_facedir_simple = true,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_stone_defaults",
|
key = "node_sound_stone_defaults",
|
||||||
@ -62,7 +63,8 @@ minetest.register_node("pipeworks:steel_pane_embedded_tube", {
|
|||||||
collision_box = pane_box,
|
collision_box = pane_box,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {cracky=1, oddly_breakable_by_hand = 1, tubedevice = 1, dig_glass = 2},
|
groups = {cracky=1, oddly_breakable_by_hand = 1, tubedevice = 1, dig_glass = 2, pickaxey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
legacy_facedir_simple = true,
|
legacy_facedir_simple = true,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_stone_defaults",
|
key = "node_sound_stone_defaults",
|
||||||
|
52
devices.lua
52
devices.lua
@ -35,7 +35,7 @@ function pipeworks.rotate_on_place(itemstack, placer, pointed_thing)
|
|||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
local pitch = placer:get_look_pitch()
|
local pitch = -placer:get_look_vertical()
|
||||||
local above = pointed_thing.above
|
local above = pointed_thing.above
|
||||||
local under = pointed_thing.under
|
local under = pointed_thing.under
|
||||||
local fdir = minetest.dir_to_facedir(placer:get_look_dir())
|
local fdir = minetest.dir_to_facedir(placer:get_look_dir())
|
||||||
@ -133,9 +133,9 @@ for s in ipairs(states) do
|
|||||||
|
|
||||||
local dgroups
|
local dgroups
|
||||||
if states[s] == "off" then
|
if states[s] == "off" then
|
||||||
dgroups = {snappy=3, pipe=1, dig_generic = 4}
|
dgroups = {snappy=3, pipe=1, dig_generic = 4, axey=5}
|
||||||
else
|
else
|
||||||
dgroups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4}
|
dgroups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4, axey=5}
|
||||||
end
|
end
|
||||||
|
|
||||||
local pumpname = "pipeworks:pump_"..states[s]
|
local pumpname = "pipeworks:pump_"..states[s]
|
||||||
@ -148,6 +148,7 @@ for s in ipairs(states) do
|
|||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = dgroups,
|
groups = dgroups,
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -202,6 +203,7 @@ for s in ipairs(states) do
|
|||||||
fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 }
|
fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 }
|
||||||
},
|
},
|
||||||
groups = dgroups,
|
groups = dgroups,
|
||||||
|
_mcl_hardness = 1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -251,7 +253,8 @@ minetest.register_node(nodename_valve_loaded, {
|
|||||||
type = "fixed",
|
type = "fixed",
|
||||||
fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 }
|
fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 }
|
||||||
},
|
},
|
||||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -303,7 +306,8 @@ minetest.register_node("pipeworks:grating", {
|
|||||||
},
|
},
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
groups = {snappy=3, pipe=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -330,7 +334,8 @@ minetest.register_node(nodename_spigot_empty, {
|
|||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy=3, pipe=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -367,7 +372,8 @@ minetest.register_node(nodename_spigot_loaded, {
|
|||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -425,7 +431,8 @@ minetest.register_node(nodename_panel_empty, {
|
|||||||
tiles = { "pipeworks_entry_panel.png" },
|
tiles = { "pipeworks_entry_panel.png" },
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy=3, pipe=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -447,7 +454,8 @@ minetest.register_node(nodename_panel_loaded, {
|
|||||||
tiles = { "pipeworks_entry_panel.png" },
|
tiles = { "pipeworks_entry_panel.png" },
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -479,7 +487,8 @@ minetest.register_node(nodename_sensor_empty, {
|
|||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy=3, pipe=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -520,7 +529,8 @@ minetest.register_node(nodename_sensor_loaded, {
|
|||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -567,12 +577,12 @@ new_flow_logic_register.transition_simple_set(sensor_pressure_set, { mesecons=pi
|
|||||||
-- TODO flow-logic-stub: these don't currently do anything under the new flow logic.
|
-- TODO flow-logic-stub: these don't currently do anything under the new flow logic.
|
||||||
for fill = 0, 10 do
|
for fill = 0, 10 do
|
||||||
local filldesc=S("empty")
|
local filldesc=S("empty")
|
||||||
local sgroups = {snappy=3, pipe=1, tankfill=fill+1, dig_generic = 4}
|
local sgroups = {snappy=3, pipe=1, tankfill=fill+1, dig_generic = 4, axey=5}
|
||||||
local image = nil
|
local image = nil
|
||||||
|
|
||||||
if fill ~= 0 then
|
if fill ~= 0 then
|
||||||
filldesc=S("@1% full", 10*fill)
|
filldesc=S("@1% full", 10*fill)
|
||||||
sgroups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1, dig_generic = 4}
|
sgroups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1, dig_generic = 4, axey=5}
|
||||||
image = "pipeworks_storage_tank_fittings.png"
|
image = "pipeworks_storage_tank_fittings.png"
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -589,7 +599,8 @@ for fill = 0, 10 do
|
|||||||
inventory_image = image,
|
inventory_image = image,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -620,6 +631,7 @@ for fill = 0, 10 do
|
|||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = sgroups,
|
groups = sgroups,
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -648,7 +660,8 @@ minetest.register_node(nodename_fountain_empty, {
|
|||||||
tiles = { "pipeworks_fountainhead.png" },
|
tiles = { "pipeworks_fountainhead.png" },
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
groups = {snappy=3, pipe=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -685,7 +698,8 @@ minetest.register_node(nodename_fountain_loaded, {
|
|||||||
tiles = { "pipeworks_fountainhead.png" },
|
tiles = { "pipeworks_fountainhead.png" },
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -737,7 +751,8 @@ minetest.register_node(nodename_sp_empty, {
|
|||||||
tiles = { "pipeworks_straight_pipe_empty.png" },
|
tiles = { "pipeworks_straight_pipe_empty.png" },
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy=3, pipe=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -761,7 +776,8 @@ minetest.register_node(nodename_sp_loaded, {
|
|||||||
tiles = { "pipeworks_straight_pipe_loaded.png" },
|
tiles = { "pipeworks_straight_pipe_loaded.png" },
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4},
|
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
|
@ -388,7 +388,8 @@ for _, data in ipairs({
|
|||||||
"pipeworks_"..data.name.."_top.png",
|
"pipeworks_"..data.name.."_top.png",
|
||||||
},
|
},
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, mesecon = 2},
|
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, mesecon = 2, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
legacy_facedir_simple = true,
|
legacy_facedir_simple = true,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_wood_defaults",
|
key = "node_sound_wood_defaults",
|
||||||
|
23
init.lua
23
init.lua
@ -153,7 +153,6 @@ dofile(pipeworks.modpath.."/flowing_logic.lua")
|
|||||||
dofile(pipeworks.modpath.."/tube_registration.lua")
|
dofile(pipeworks.modpath.."/tube_registration.lua")
|
||||||
dofile(pipeworks.modpath.."/routing_tubes.lua")
|
dofile(pipeworks.modpath.."/routing_tubes.lua")
|
||||||
dofile(pipeworks.modpath.."/sorting_tubes.lua")
|
dofile(pipeworks.modpath.."/sorting_tubes.lua")
|
||||||
dofile(pipeworks.modpath.."/vacuum_tubes.lua")
|
|
||||||
dofile(pipeworks.modpath.."/signal_tubes.lua")
|
dofile(pipeworks.modpath.."/signal_tubes.lua")
|
||||||
dofile(pipeworks.modpath.."/decorative_tubes.lua")
|
dofile(pipeworks.modpath.."/decorative_tubes.lua")
|
||||||
dofile(pipeworks.modpath.."/filter-injector.lua")
|
dofile(pipeworks.modpath.."/filter-injector.lua")
|
||||||
@ -170,18 +169,28 @@ dofile(pipeworks.modpath..logicdir.."abms.lua")
|
|||||||
dofile(pipeworks.modpath..logicdir.."abm_register.lua")
|
dofile(pipeworks.modpath..logicdir.."abm_register.lua")
|
||||||
dofile(pipeworks.modpath..logicdir.."flowable_node_registry_install.lua")
|
dofile(pipeworks.modpath..logicdir.."flowable_node_registry_install.lua")
|
||||||
|
|
||||||
if pipeworks.enable_pipes then dofile(pipeworks.modpath.."/pipes.lua") end
|
if pipeworks.enable_pipes then
|
||||||
if pipeworks.enable_teleport_tube then dofile(pipeworks.modpath.."/teleport_tube.lua") end
|
dofile(pipeworks.modpath.."/pipes.lua")
|
||||||
if pipeworks.enable_pipe_devices then dofile(pipeworks.modpath.."/devices.lua") end
|
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
|
||||||
if pipeworks.enable_redefines and (minetest.get_modpath("default") or minetest.get_modpath("hades_core")) then
|
if pipeworks.enable_redefines and (minetest.get_modpath("default") or minetest.get_modpath("hades_core")) then
|
||||||
dofile(pipeworks.modpath.."/compat-chests.lua")
|
dofile(pipeworks.modpath.."/compat-chests.lua")
|
||||||
dofile(pipeworks.modpath.."/compat-furnaces.lua")
|
dofile(pipeworks.modpath.."/compat-furnaces.lua")
|
||||||
end
|
end
|
||||||
if pipeworks.enable_autocrafter then dofile(pipeworks.modpath.."/autocrafter.lua") end
|
if pipeworks.enable_autocrafter then
|
||||||
if pipeworks.enable_lua_tube and
|
dofile(pipeworks.modpath.."/autocrafter.lua")
|
||||||
(minetest.get_modpath("mesecons") or minetest.get_modpath("digilines")) then
|
end
|
||||||
|
if pipeworks.enable_lua_tube and minetest.get_modpath("mesecons") then
|
||||||
dofile(pipeworks.modpath.."/lua_tube.lua")
|
dofile(pipeworks.modpath.."/lua_tube.lua")
|
||||||
end
|
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")
|
dofile(pipeworks.modpath.."/crafts.lua")
|
||||||
|
|
||||||
|
@ -26,7 +26,8 @@ if not minetest.get_modpath("auto_tree_tap") and
|
|||||||
"pipeworks_nodebreaker_back.png","pipeworks_nodebreaker_front_off.png"},
|
"pipeworks_nodebreaker_back.png","pipeworks_nodebreaker_front_off.png"},
|
||||||
is_ground_content = true,
|
is_ground_content = true,
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1, not_in_creative_inventory=1 },
|
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1, not_in_creative_inventory=1, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_stone_defaults",
|
key = "node_sound_stone_defaults",
|
||||||
},
|
},
|
||||||
|
@ -865,7 +865,7 @@ for white = 0, 1 do
|
|||||||
tiles[3] = tiles[3]..tiles_on_off.R270:format(white == 1 and "on" or "off");
|
tiles[3] = tiles[3]..tiles_on_off.R270:format(white == 1 and "on" or "off");
|
||||||
tiles[4] = tiles[4]..tiles_on_off.R_90:format(white == 1 and "on" or "off");
|
tiles[4] = tiles[4]..tiles_on_off.R_90:format(white == 1 and "on" or "off");
|
||||||
|
|
||||||
local groups = {snappy = 3, tube = 1, tubedevice = 1, overheat = 1, dig_generic = 4}
|
local groups = {snappy = 3, tube = 1, tubedevice = 1, overheat = 1, dig_generic = 4, axey=5}
|
||||||
if red + blue + yellow + green + black + white ~= 0 then
|
if red + blue + yellow + green + black + white ~= 0 then
|
||||||
groups.not_in_creative_inventory = 1
|
groups.not_in_creative_inventory = 1
|
||||||
end
|
end
|
||||||
@ -912,6 +912,7 @@ for white = 0, 1 do
|
|||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
groups = groups,
|
groups = groups,
|
||||||
|
_mcl_hardness=1.6,
|
||||||
drop = BASENAME.."000000",
|
drop = BASENAME.."000000",
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
selection_box = selection_box,
|
selection_box = selection_box,
|
||||||
@ -1023,7 +1024,8 @@ minetest.register_node(BASENAME .. "_burnt", {
|
|||||||
is_burnt = true,
|
is_burnt = true,
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
groups = {snappy = 3, tube = 1, tubedevice = 1, not_in_creative_inventory=1, dig_generic = 4},
|
groups = {snappy = 3, tube = 1, tubedevice = 1, not_in_creative_inventory=1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
drop = BASENAME.."000000",
|
drop = BASENAME.."000000",
|
||||||
sunlight_propagates = true,
|
sunlight_propagates = true,
|
||||||
selection_box = selection_box,
|
selection_box = selection_box,
|
||||||
|
4
mod.conf
4
mod.conf
@ -1,5 +1,5 @@
|
|||||||
name = pipeworks
|
name = pipeworks
|
||||||
description = This mod uses mesh nodes and nodeboxes to supply a complete set of 3D pipes and tubes, along with devices that work with them.
|
description = This mod uses mesh nodes and nodeboxes to supply a complete set of 3D pipes and tubes, along with devices that work with them.
|
||||||
depends = basic_materials
|
depends = basic_materials
|
||||||
optional_depends = mesecons, mesecons_mvps, digilines, signs_lib, unified_inventory, default, screwdriver, fl_mapgen, sound_api, i3, hades_core, hades_furnaces, hades_chests
|
optional_depends = mesecons, mesecons_mvps, digilines, signs_lib, unified_inventory, default, screwdriver, fl_mapgen, sound_api, i3, hades_core, hades_furnaces, hades_chests, mcl_mapgen_core
|
||||||
min_minetest_version = 5.2.0
|
min_minetest_version = 5.4.0
|
||||||
|
@ -37,11 +37,11 @@ for index, connects in ipairs(cconnects) do
|
|||||||
end
|
end
|
||||||
--]]
|
--]]
|
||||||
|
|
||||||
local pgroups = {snappy = 3, pipe = 1, not_in_creative_inventory = 1, dig_generic = 4}
|
local pgroups = {snappy = 3, pipe = 1, not_in_creative_inventory = 1, dig_generic = 4, axey=5}
|
||||||
local pipedesc = S("Pipe Segment").." "..dump(connects)
|
local pipedesc = S("Pipe Segment").." "..dump(connects)
|
||||||
|
|
||||||
if #connects == 0 then
|
if #connects == 0 then
|
||||||
pgroups = {snappy = 3, tube = 1, dig_generic = 4}
|
pgroups = {snappy = 3, tube = 1, dig_generic = 4, axey=5}
|
||||||
pipedesc = S("Pipe Segment")
|
pipedesc = S("Pipe Segment")
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -76,6 +76,7 @@ for index, connects in ipairs(cconnects) do
|
|||||||
fixed = outsel
|
fixed = outsel
|
||||||
},
|
},
|
||||||
groups = pgroups,
|
groups = pgroups,
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
@ -93,7 +94,7 @@ for index, connects in ipairs(cconnects) do
|
|||||||
pipenumber = index
|
pipenumber = index
|
||||||
})
|
})
|
||||||
|
|
||||||
local pgroups = {snappy = 3, pipe = 1, not_in_creative_inventory = 1, dig_generic = 4}
|
local pgroups = {snappy = 3, pipe = 1, not_in_creative_inventory = 1, dig_generic = 4, axey=5}
|
||||||
|
|
||||||
minetest.register_node("pipeworks:pipe_"..index.."_loaded", {
|
minetest.register_node("pipeworks:pipe_"..index.."_loaded", {
|
||||||
description = pipedesc,
|
description = pipedesc,
|
||||||
@ -112,6 +113,7 @@ for index, connects in ipairs(cconnects) do
|
|||||||
fixed = outsel
|
fixed = outsel
|
||||||
},
|
},
|
||||||
groups = pgroups,
|
groups = pgroups,
|
||||||
|
_mcl_hardness = 1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_metal_defaults",
|
key = "node_sound_metal_defaults",
|
||||||
},
|
},
|
||||||
|
@ -168,7 +168,8 @@ if pipeworks.enable_one_way_tube then
|
|||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
node_box = {type = "fixed",
|
node_box = {type = "fixed",
|
||||||
fixed = {{-1/2, -9/64, -9/64, 1/2, 9/64, 9/64}}},
|
fixed = {{-1/2, -9/64, -9/64, 1/2, 9/64, 9/64}}},
|
||||||
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1},
|
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_wood_defaults",
|
key = "node_sound_wood_defaults",
|
||||||
},
|
},
|
||||||
|
@ -84,3 +84,6 @@ pipeworks_use_real_entities (Use Real Entities) bool true
|
|||||||
#A high value may cause issues with tube entity visuals.
|
#A high value may cause issues with tube entity visuals.
|
||||||
#A value 0.2 or above may cause issues with accelerator tubes.
|
#A value 0.2 or above may cause issues with accelerator tubes.
|
||||||
pipeworks_entity_update_interval (Entity Update Interval) float 0 0 0.8
|
pipeworks_entity_update_interval (Entity Update Interval) float 0 0 0.8
|
||||||
|
|
||||||
|
# if set to true, items passing through teleport tubes will log log where they came from and where they went.
|
||||||
|
pipeworks_log_teleport_tubes (Log Teleport Tubes) bool false
|
||||||
|
@ -12,7 +12,7 @@ local function after_break(pos)
|
|||||||
end
|
end
|
||||||
|
|
||||||
if minetest.get_modpath("mesecons") and pipeworks.enable_detector_tube then
|
if minetest.get_modpath("mesecons") and pipeworks.enable_detector_tube then
|
||||||
local detector_tube_step = 5 * tonumber(minetest.settings:get("dedicated_server_step"))
|
local detector_tube_step = 5 * (tonumber(minetest.settings:get("dedicated_server_step")) or 0.09)
|
||||||
pipeworks.register_tube("pipeworks:detector_tube_on", {
|
pipeworks.register_tube("pipeworks:detector_tube_on", {
|
||||||
description = S("Detecting Pneumatic Tube Segment on"),
|
description = S("Detecting Pneumatic Tube Segment on"),
|
||||||
inventory_image = "pipeworks_detector_tube_inv.png",
|
inventory_image = "pipeworks_detector_tube_inv.png",
|
||||||
|
@ -1,190 +1,330 @@
|
|||||||
|
|
||||||
local S = minetest.get_translator("pipeworks")
|
local S = minetest.get_translator("pipeworks")
|
||||||
local filename = minetest.get_worldpath().."/teleport_tubes" -- Only used for backward-compat
|
local filename = minetest.get_worldpath().."/teleport_tubes" -- Only used for backward-compat
|
||||||
local storage = minetest.get_mod_storage()
|
local storage = minetest.get_mod_storage()
|
||||||
|
|
||||||
local tp_tube_db = nil -- nil forces a read
|
local enable_logging = minetest.settings:get_bool("pipeworks_log_teleport_tubes", false)
|
||||||
local tp_tube_db_version = 3.0
|
|
||||||
|
|
||||||
-- cached rceiver list: hash(pos) => {receivers}
|
local has_digilines = minetest.get_modpath("digilines")
|
||||||
local cache = {}
|
|
||||||
|
|
||||||
local function hash(pos)
|
-- V1: Serialized text file indexed by vector position.
|
||||||
return string.format("%.30g", minetest.hash_node_position(pos))
|
-- V2: Serialized text file indexed by hash position.
|
||||||
|
-- V3: Mod storage using serialized tables.
|
||||||
|
-- V4: Mod storage using "<can_receive>:<channel>" format.
|
||||||
|
local tube_db_version = 4
|
||||||
|
local tube_db = {}
|
||||||
|
local receiver_cache = {}
|
||||||
|
|
||||||
|
local function hash_pos(pos)
|
||||||
|
vector.round(pos)
|
||||||
|
return string.format("%.0f", minetest.hash_node_position(pos))
|
||||||
|
end
|
||||||
|
|
||||||
|
local function serialize_tube(tube)
|
||||||
|
return string.format("%d:%s", tube.cr, tube.channel)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function deserialize_tube(hash, str)
|
||||||
|
local sep = str:sub(2, 2) == ":"
|
||||||
|
local cr = tonumber(str:sub(1, 1))
|
||||||
|
local channel = str:sub(3)
|
||||||
|
if sep and cr and channel then
|
||||||
|
local pos = minetest.get_position_from_hash(tonumber(hash))
|
||||||
|
return {x = pos.x, y = pos.y, z = pos.z, cr = cr, channel = channel}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function save_tube_db()
|
local function save_tube_db()
|
||||||
-- reset tp-tube cache
|
receiver_cache = {}
|
||||||
cache = {}
|
local fields = {version = tube_db_version}
|
||||||
|
for key, val in pairs(tube_db) do
|
||||||
local fields = {version = tp_tube_db_version}
|
fields[key] = serialize_tube(val)
|
||||||
for key, val in pairs(tp_tube_db) do
|
|
||||||
fields[key] = minetest.serialize(val)
|
|
||||||
end
|
end
|
||||||
storage:from_table({fields = fields})
|
storage:from_table({fields = fields})
|
||||||
end
|
end
|
||||||
|
|
||||||
local function save_tube_db_entry(hash)
|
local function save_tube(hash)
|
||||||
-- reset tp-tube cache
|
local tube = tube_db[hash]
|
||||||
cache = {}
|
receiver_cache[tube.channel] = nil
|
||||||
|
storage:set_string(hash, serialize_tube(tube))
|
||||||
|
end
|
||||||
|
|
||||||
local val = tp_tube_db[hash]
|
local function remove_tube(pos)
|
||||||
storage:set_string(hash, val and minetest.serialize(val) or "")
|
local hash = hash_pos(pos)
|
||||||
|
if tube_db[hash] then
|
||||||
|
receiver_cache[tube_db[hash].channel] = nil
|
||||||
|
tube_db[hash] = nil
|
||||||
|
storage:set_string(hash, "")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function migrate_tube_db()
|
local function migrate_tube_db()
|
||||||
local old_version = tp_tube_db.version or 0
|
if storage:get_int("version") == 3 then
|
||||||
tp_tube_db.version = nil
|
for key, val in pairs(storage:to_table().fields) do
|
||||||
if old_version < 2.0 then
|
if tonumber(key) then
|
||||||
|
tube_db[key] = minetest.deserialize(val)
|
||||||
|
elseif key ~= "version" then
|
||||||
|
error("Unknown field in teleport tube database: "..key)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
save_tube_db()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local file = io.open(filename, "r")
|
||||||
|
if file then
|
||||||
|
local content = file:read("*all")
|
||||||
|
io.close(file)
|
||||||
|
if content and content ~= "" then
|
||||||
|
tube_db = minetest.deserialize(content)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local version = tube_db.version or 0
|
||||||
|
tube_db.version = nil
|
||||||
|
if version < 2 then
|
||||||
local tmp_db = {}
|
local tmp_db = {}
|
||||||
for _, val in pairs(tp_tube_db) do
|
for _, val in pairs(tube_db) do
|
||||||
if(val.channel ~= "") then -- skip unconfigured tubes
|
if val.channel ~= "" then -- Skip unconfigured tubes
|
||||||
tmp_db[hash(val)] = val
|
tmp_db[hash_pos(val)] = val
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
tp_tube_db = tmp_db
|
tube_db = tmp_db
|
||||||
end
|
end
|
||||||
save_tube_db()
|
save_tube_db()
|
||||||
end
|
end
|
||||||
|
|
||||||
local function read_tube_db()
|
local function read_tube_db()
|
||||||
local file = not storage:contains("version") and io.open(filename, "r")
|
local version = storage:get_int("version")
|
||||||
if not file then
|
if version < tube_db_version then
|
||||||
tp_tube_db = {}
|
migrate_tube_db()
|
||||||
|
elseif version > tube_db_version then
|
||||||
|
error("Cannot read teleport tube database of version "..version)
|
||||||
|
else
|
||||||
for key, val in pairs(storage:to_table().fields) do
|
for key, val in pairs(storage:to_table().fields) do
|
||||||
if tonumber(key) then
|
if tonumber(key) then
|
||||||
tp_tube_db[key] = minetest.deserialize(val)
|
tube_db[key] = deserialize_tube(key, val)
|
||||||
elseif key == "version" then
|
elseif key ~= "version" then
|
||||||
tp_tube_db.version = tonumber(val)
|
error("Unknown field in teleport tube database: "..key)
|
||||||
else
|
|
||||||
error("Unknown field in teleport tube DB: " .. key)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
tube_db.version = nil
|
||||||
|
end
|
||||||
|
|
||||||
if tp_tube_db.version == nil then
|
local function set_tube(pos, channel, cr)
|
||||||
tp_tube_db.version = tp_tube_db_version
|
local hash = hash_pos(pos)
|
||||||
storage:set_string("version", tp_tube_db.version)
|
local tube = tube_db[hash]
|
||||||
elseif tp_tube_db.version > tp_tube_db_version then
|
|
||||||
error("Cannot read teleport tube DB of version " .. tp_tube_db.version)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
local file_content = file:read("*all")
|
|
||||||
io.close(file)
|
|
||||||
|
|
||||||
pipeworks.logger("Moving teleport tube DB into mod storage from " .. filename)
|
|
||||||
|
|
||||||
if file_content and file_content ~= "" then
|
|
||||||
tp_tube_db = minetest.deserialize(file_content)
|
|
||||||
else
|
|
||||||
tp_tube_db = {version = 2.0}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if(not tp_tube_db.version or tonumber(tp_tube_db.version) < tp_tube_db_version) then
|
|
||||||
migrate_tube_db()
|
|
||||||
end
|
|
||||||
tp_tube_db.version = nil
|
|
||||||
|
|
||||||
return tp_tube_db
|
|
||||||
end
|
|
||||||
|
|
||||||
-- debug formatter for coordinates used below
|
|
||||||
local fmt = function(pos)
|
|
||||||
return pos.x..", "..pos.y..", "..pos.z
|
|
||||||
end
|
|
||||||
|
|
||||||
-- updates or adds a tube
|
|
||||||
local function set_tube(pos, channel, can_receive)
|
|
||||||
local tubes = tp_tube_db or read_tube_db()
|
|
||||||
local hash = hash(pos)
|
|
||||||
local tube = tubes[hash]
|
|
||||||
if tube then
|
if tube then
|
||||||
|
if tube.channel ~= channel or tube.cr ~= cr then
|
||||||
tube.channel = channel
|
tube.channel = channel
|
||||||
tube.cr = can_receive
|
tube.cr = cr
|
||||||
save_tube_db_entry(hash)
|
save_tube(hash)
|
||||||
return
|
|
||||||
end
|
end
|
||||||
|
else
|
||||||
-- we haven't found any tp tube to update, so lets add it
|
tube_db[hash] = {x = pos.x, y = pos.y, z = pos.z, channel = channel, cr = cr}
|
||||||
-- but sanity check that the hash has not already been inserted.
|
save_tube(hash)
|
||||||
-- if so, complain very loudly and refuse the update so the player knows something is amiss.
|
|
||||||
-- to catch regressions of https://github.com/minetest-mods/pipeworks/issues/166
|
|
||||||
local existing = tp_tube_db[hash]
|
|
||||||
if existing ~= nil then
|
|
||||||
local e = "error"
|
|
||||||
minetest.log(e, "pipeworks teleport tube update refused due to position hash collision")
|
|
||||||
minetest.log(e, "collided hash: "..hash)
|
|
||||||
minetest.log(e, "tried-to-place tube: "..fmt(pos))
|
|
||||||
minetest.log(e, "existing tube: "..fmt(existing))
|
|
||||||
return
|
|
||||||
end
|
end
|
||||||
|
|
||||||
tp_tube_db[hash] = {x=pos.x,y=pos.y,z=pos.z,channel=channel,cr=can_receive}
|
|
||||||
save_tube_db_entry(hash)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function remove_tube(pos)
|
|
||||||
local tubes = tp_tube_db or read_tube_db()
|
|
||||||
local hash = hash(pos)
|
|
||||||
tubes[hash] = nil
|
|
||||||
save_tube_db_entry(hash)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function read_node_with_vm(pos)
|
|
||||||
local vm = VoxelManip()
|
|
||||||
local MinEdge, MaxEdge = vm:read_from_map(pos, pos)
|
|
||||||
local data = vm:get_data()
|
|
||||||
local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge})
|
|
||||||
return minetest.get_name_from_content_id(data[area:index(pos.x, pos.y, pos.z)])
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local function get_receivers(pos, channel)
|
local function get_receivers(pos, channel)
|
||||||
local hash = minetest.hash_node_position(pos)
|
local hash = hash_pos(pos)
|
||||||
|
local cache = receiver_cache[channel] or {}
|
||||||
if cache[hash] then
|
if cache[hash] then
|
||||||
-- re-use cached result
|
|
||||||
return cache[hash]
|
return cache[hash]
|
||||||
end
|
end
|
||||||
|
|
||||||
local tubes = tp_tube_db or read_tube_db()
|
|
||||||
local receivers = {}
|
local receivers = {}
|
||||||
for key, val in pairs(tubes) do
|
for key, val in pairs(tube_db) do
|
||||||
-- skip all non-receivers and the tube that it came from as early as possible, as this is called often
|
if val.cr == 1 and val.channel == channel and not vector.equals(val, pos) then
|
||||||
if (val.cr == 1 and val.channel == channel and (val.x ~= pos.x or val.y ~= pos.y or val.z ~= pos.z)) then
|
minetest.load_area(val)
|
||||||
local is_loaded = (minetest.get_node_or_nil(val) ~= nil)
|
local node_name = minetest.get_node(val).name
|
||||||
local node_name = is_loaded and minetest.get_node(pos).name or read_node_with_vm(val)
|
if node_name:find("pipeworks:teleport_tube") then
|
||||||
|
|
||||||
if minetest.registered_nodes[node_name] and minetest.registered_nodes[node_name].is_teleport_tube then
|
|
||||||
table.insert(receivers, val)
|
table.insert(receivers, val)
|
||||||
else
|
else
|
||||||
tp_tube_db[key] = nil
|
remove_tube(val)
|
||||||
save_tube_db_entry(key)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
-- cache the result for next time
|
|
||||||
cache[hash] = receivers
|
cache[hash] = receivers
|
||||||
|
receiver_cache[channel] = cache
|
||||||
return receivers
|
return receivers
|
||||||
end
|
end
|
||||||
|
|
||||||
local function update_meta(meta, can_receive)
|
local help_text = S("Channels are public by default").."\n"..
|
||||||
meta:set_int("can_receive", can_receive and 1 or 0)
|
|
||||||
local cr_state = can_receive and "on" or "off"
|
|
||||||
local itext = S("Channels are public by default").."\n"..
|
|
||||||
S("Use <player>:<channel> for fully private channels").."\n"..
|
S("Use <player>:<channel> for fully private channels").."\n"..
|
||||||
S("Use <player>\\;<channel> for private receivers")
|
S("Use <player>\\;<channel> for private receivers")
|
||||||
local size = "8.5,4"
|
|
||||||
meta:set_string("formspec",
|
local size = has_digilines and "8,5.9" or "8,4.4"
|
||||||
"formspec_version[2]"..
|
|
||||||
"size["..size.."]"..
|
local formspec = "formspec_version[2]size["..size.."]"..
|
||||||
pipeworks.fs_helpers.get_prepends(size)..
|
pipeworks.fs_helpers.get_prepends(size)..
|
||||||
"image[0.5,o;1,1;pipeworks_teleport_tube_inv.png]"..
|
"image[0.5,0.3;1,1;pipeworks_teleport_tube_inv.png]"..
|
||||||
"label[1.5,0.5;"..S("Teleporting Tube").."]"..
|
"label[1.75,0.8;"..S("Teleporting Tube").."]"..
|
||||||
"field[0.5,1.6;4.3,0.75;channel;"..S("Channel")..";${channel}]"..
|
"field[0.5,1.7;5,0.8;channel;"..S("Channel")..";${channel}]"..
|
||||||
"button[4.8,1.6;1.5,0.75;set_channel;"..S("Set").."]"..
|
"button_exit[5.5,1.7;2,0.8;save;"..S("Save").."]"..
|
||||||
"label[7.0,0.5;"..S("Receive").."]"..
|
"label[6.5,0.6;"..S("Receive").."]"..
|
||||||
"image_button[7.0,0.75;1,0.6;pipeworks_button_" .. cr_state .. ".png;cr" .. (can_receive and 0 or 1) .. ";;;false;pipeworks_button_interm.png]"..
|
"label[0.5,2.8;"..help_text.."]"
|
||||||
"button_exit[6.3,1.6;2,0.75;close;"..S("Close").."]"..
|
|
||||||
"label[0.5,2.7;"..itext.."]")
|
if has_digilines then
|
||||||
|
formspec = formspec..
|
||||||
|
"field[0.5,4.6;5,0.8;digiline_channel;"..S("Digiline Channel")..";${digiline_channel}]"..
|
||||||
|
"button_exit[5.5,4.6;2,0.8;save;"..S("Save").."]"
|
||||||
|
end
|
||||||
|
|
||||||
|
local function update_meta(meta)
|
||||||
|
local channel = meta:get_string("channel")
|
||||||
|
local cr = meta:get_int("can_receive") == 1
|
||||||
|
if channel == "" then
|
||||||
|
meta:set_string("infotext", S("Unconfigured Teleportation Tube"))
|
||||||
|
else
|
||||||
|
local desc = cr and "sending and receiving" or "sending"
|
||||||
|
meta:set_string("infotext", S("Teleportation Tube @1 on '@2'", desc, channel))
|
||||||
|
end
|
||||||
|
local state = cr and "on" or "off"
|
||||||
|
meta:set_string("formspec", formspec..
|
||||||
|
"image_button[6.4,0.8;1,0.6;pipeworks_button_"..state..
|
||||||
|
".png;cr_"..state..";;;false;pipeworks_button_interm.png]")
|
||||||
|
end
|
||||||
|
|
||||||
|
local function update_tube(pos, channel, cr, player_name)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if meta:get_string("channel") == channel and meta:get_int("can_receive") == cr then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
if channel == "" then
|
||||||
|
meta:set_string("channel", "")
|
||||||
|
meta:set_int("can_receive", cr)
|
||||||
|
remove_tube(pos)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local name, mode = channel:match("^([^:;]+)([:;])")
|
||||||
|
if name and mode and name ~= player_name then
|
||||||
|
if mode == ":" then
|
||||||
|
minetest.chat_send_player(player_name,
|
||||||
|
S("Sorry, channel '@1' is reserved for exclusive use by @2", channel, name))
|
||||||
|
return
|
||||||
|
elseif mode == ";" and cr ~= 0 then
|
||||||
|
minetest.chat_send_player(player_name,
|
||||||
|
S("Sorry, receiving from channel '@1' is reserved for @2", channel, name))
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
meta:set_string("channel", channel)
|
||||||
|
meta:set_int("can_receive", cr)
|
||||||
|
set_tube(pos, channel, cr)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function receive_fields(pos, _, fields, sender)
|
||||||
|
if not fields.channel or not pipeworks.may_configure(pos, sender) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local channel = fields.channel:trim()
|
||||||
|
local cr = meta:get_int("can_receive")
|
||||||
|
if fields.cr_on then
|
||||||
|
cr = 0
|
||||||
|
elseif fields.cr_off then
|
||||||
|
cr = 1
|
||||||
|
end
|
||||||
|
if has_digilines and fields.digiline_channel then
|
||||||
|
meta:set_string("digiline_channel", fields.digiline_channel)
|
||||||
|
end
|
||||||
|
update_tube(pos, channel, cr, sender:get_player_name())
|
||||||
|
update_meta(meta)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function can_go(pos, node, velocity, stack)
|
||||||
|
velocity.x = 0
|
||||||
|
velocity.y = 0
|
||||||
|
velocity.z = 0
|
||||||
|
local src_meta = minetest.get_meta(pos)
|
||||||
|
local channel = src_meta:get_string("channel")
|
||||||
|
if channel == "" then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
local receivers = get_receivers(pos, channel)
|
||||||
|
if #receivers == 0 then
|
||||||
|
return {}
|
||||||
|
end
|
||||||
|
local target = receivers[math.random(1, #receivers)]
|
||||||
|
if enable_logging then
|
||||||
|
local src_owner = src_meta:get_string("owner")
|
||||||
|
local dst_meta = minetest.get_meta(pos)
|
||||||
|
local dst_owner = dst_meta:get_string("owner")
|
||||||
|
minetest.log("action", string.format("[pipeworks] %s teleported from %s (owner=%s) to %s (owner=%s) via %s",
|
||||||
|
stack:to_string(), minetest.pos_to_string(pos), src_owner, minetest.pos_to_string(target), dst_owner, channel
|
||||||
|
))
|
||||||
|
end
|
||||||
|
pos.x = target.x
|
||||||
|
pos.y = target.y
|
||||||
|
pos.z = target.z
|
||||||
|
return pipeworks.meseadjlist
|
||||||
|
end
|
||||||
|
|
||||||
|
local function repair_tube(pos, node)
|
||||||
|
minetest.swap_node(pos, {name = node.name, param2 = node.param2})
|
||||||
|
pipeworks.scan_for_tube_objects(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local channel = meta:get_string("channel")
|
||||||
|
if channel ~= "" then
|
||||||
|
set_tube(pos, channel, meta:get_int("can_receive"))
|
||||||
|
end
|
||||||
|
update_meta(meta)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function digiline_action(pos, _, digiline_channel, msg)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if digiline_channel ~= meta:get_string("digiline_channel") then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local channel = meta:get_string("channel")
|
||||||
|
local can_receive = meta:get_int("can_receive")
|
||||||
|
if type(msg) == "string" then
|
||||||
|
channel = msg
|
||||||
|
elseif type(msg) == "table" then
|
||||||
|
if type(msg.channel) == "string" then
|
||||||
|
channel = msg.channel
|
||||||
|
end
|
||||||
|
if msg.can_receive == 1 or msg.can_receive == true then
|
||||||
|
can_receive = 1
|
||||||
|
elseif msg.can_receive == 0 or msg.can_receive == false then
|
||||||
|
can_receive = 0
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local player_name = meta:get_string("owner")
|
||||||
|
update_tube(pos, channel, can_receive, player_name)
|
||||||
|
update_meta(meta)
|
||||||
|
end
|
||||||
|
|
||||||
|
local def = {
|
||||||
|
tube = {
|
||||||
|
can_go = can_go,
|
||||||
|
on_repair = repair_tube,
|
||||||
|
},
|
||||||
|
on_construct = function(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
meta:set_int("can_receive", 1) -- Enabled by default
|
||||||
|
update_meta(meta)
|
||||||
|
end,
|
||||||
|
on_receive_fields = receive_fields,
|
||||||
|
on_destruct = remove_tube,
|
||||||
|
}
|
||||||
|
|
||||||
|
if has_digilines then
|
||||||
|
def.after_place_node = function(pos, placer)
|
||||||
|
-- Set owner for digilines
|
||||||
|
minetest.get_meta(pos):set_string("owner", placer:get_player_name())
|
||||||
|
pipeworks.after_place(pos)
|
||||||
|
end
|
||||||
|
def.digiline = {
|
||||||
|
receptor = {
|
||||||
|
rules = pipeworks.digilines_rules,
|
||||||
|
},
|
||||||
|
effector = {
|
||||||
|
rules = pipeworks.digilines_rules,
|
||||||
|
action = digiline_action,
|
||||||
|
}
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
pipeworks.register_tube("pipeworks:teleport_tube", {
|
pipeworks.register_tube("pipeworks:teleport_tube", {
|
||||||
@ -194,120 +334,14 @@ pipeworks.register_tube("pipeworks:teleport_tube", {
|
|||||||
plain = { "pipeworks_teleport_tube_plain.png" },
|
plain = { "pipeworks_teleport_tube_plain.png" },
|
||||||
ends = { "pipeworks_teleport_tube_end.png" },
|
ends = { "pipeworks_teleport_tube_end.png" },
|
||||||
short = "pipeworks_teleport_tube_short.png",
|
short = "pipeworks_teleport_tube_short.png",
|
||||||
node_def = {
|
node_def = def,
|
||||||
is_teleport_tube = true,
|
|
||||||
tube = {
|
|
||||||
can_go = function(pos,node,velocity,stack)
|
|
||||||
velocity.x = 0
|
|
||||||
velocity.y = 0
|
|
||||||
velocity.z = 0
|
|
||||||
|
|
||||||
local channel = minetest.get_meta(pos):get_string("channel")
|
|
||||||
if channel == "" then return {} end
|
|
||||||
|
|
||||||
local target = get_receivers(pos, channel)
|
|
||||||
if target[1] == nil then return {} end
|
|
||||||
|
|
||||||
local d = math.random(1,#target)
|
|
||||||
pos.x = target[d].x
|
|
||||||
pos.y = target[d].y
|
|
||||||
pos.z = target[d].z
|
|
||||||
return pipeworks.meseadjlist
|
|
||||||
end,
|
|
||||||
on_repair = function(pos, node)
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
local channel = meta:get_string("channel")
|
|
||||||
minetest.swap_node(pos, { name = node.name, param2 = node.param2 })
|
|
||||||
pipeworks.scan_for_tube_objects(pos)
|
|
||||||
if channel ~= "" then
|
|
||||||
local can_receive = meta:get_int("can_receive")
|
|
||||||
set_tube(pos, channel, can_receive)
|
|
||||||
local cr_description = (can_receive == 1) and "sending and receiving" or "sending"
|
|
||||||
meta:set_string("infotext", S("Teleportation Tube @1 on '@2'", cr_description, channel))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
},
|
|
||||||
on_construct = function(pos)
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
update_meta(meta, true)
|
|
||||||
meta:set_string("infotext", S("Unconfigured Teleportation Tube"))
|
|
||||||
end,
|
|
||||||
on_receive_fields = function(pos,formname,fields,sender)
|
|
||||||
if not fields.channel -- ignore escaping or clientside manipulation of the form
|
|
||||||
or (fields.quit and not fields.key_enter_field)
|
|
||||||
or not pipeworks.may_configure(pos, sender) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local new_channel = tostring(fields.channel):trim()
|
|
||||||
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
local can_receive = meta:get_int("can_receive")
|
|
||||||
|
|
||||||
-- check for private channels each time before actually changing anything
|
|
||||||
-- to not even allow switching between can_receive states of private channels
|
|
||||||
if new_channel ~= "" then
|
|
||||||
local sender_name = sender:get_player_name()
|
|
||||||
local name, mode = new_channel:match("^([^:;]+)([:;])")
|
|
||||||
if name and mode and name ~= sender_name then
|
|
||||||
--channels starting with '[name]:' can only be used by the named player
|
|
||||||
if mode == ":" then
|
|
||||||
minetest.chat_send_player(sender_name, S("Sorry, channel '@1' is reserved for exclusive use by @2",
|
|
||||||
new_channel, name))
|
|
||||||
return
|
|
||||||
|
|
||||||
--channels starting with '[name];' can be used by other players, but cannot be received from
|
|
||||||
elseif mode == ";" and (fields.cr1 or (can_receive ~= 0 and not fields.cr0)) then
|
|
||||||
minetest.chat_send_player(sender_name, S("Sorry, receiving from channel '@1' is reserved for @2",
|
|
||||||
new_channel, name))
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local dirty = false
|
|
||||||
|
|
||||||
-- was the channel changed?
|
|
||||||
local channel = meta:get_string("channel")
|
|
||||||
if new_channel ~= channel and (fields.key_enter_field == "channel" or fields.set_channel) then
|
|
||||||
channel = new_channel
|
|
||||||
meta:set_string("channel", channel)
|
|
||||||
dirty = true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- test if a can_receive button was pressed
|
|
||||||
if fields.cr0 and can_receive ~= 0 then
|
|
||||||
can_receive = 0
|
|
||||||
update_meta(meta, false)
|
|
||||||
dirty = true
|
|
||||||
elseif fields.cr1 and can_receive ~= 1 then
|
|
||||||
can_receive = 1
|
|
||||||
update_meta(meta, true)
|
|
||||||
dirty = true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- save if we changed something, handle the empty channel while we're at it
|
|
||||||
if dirty then
|
|
||||||
if channel ~= "" then
|
|
||||||
set_tube(pos, channel, can_receive)
|
|
||||||
local cr_description = (can_receive == 1) and "sending and receiving" or "sending"
|
|
||||||
meta:set_string("infotext", S("Teleportation Tube @1 on '@2'", cr_description, channel))
|
|
||||||
else
|
|
||||||
-- remove empty channel tubes, to not have to search through them
|
|
||||||
remove_tube(pos)
|
|
||||||
meta:set_string("infotext", S("Unconfigured Teleportation Tube"))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
on_destruct = function(pos)
|
|
||||||
remove_tube(pos)
|
|
||||||
end
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
|
|
||||||
if minetest.get_modpath("mesecons_mvps") ~= nil then
|
if minetest.get_modpath("mesecons_mvps") then
|
||||||
|
-- Update tubes when moved by pistons
|
||||||
mesecon.register_on_mvps_move(function(moved_nodes)
|
mesecon.register_on_mvps_move(function(moved_nodes)
|
||||||
for _, n in ipairs(moved_nodes) do
|
for _, n in ipairs(moved_nodes) do
|
||||||
if string.find(n.node.name, "pipeworks:teleport_tube") ~= nil then
|
if n.node.name:find("pipeworks:teleport_tube") then
|
||||||
local meta = minetest.get_meta(n.pos)
|
local meta = minetest.get_meta(n.pos)
|
||||||
set_tube(n.pos, meta:get_string("channel"), meta:get_int("can_receive"))
|
set_tube(n.pos, meta:get_string("channel"), meta:get_int("can_receive"))
|
||||||
end
|
end
|
||||||
@ -317,11 +351,21 @@ end
|
|||||||
|
|
||||||
-- Expose teleport tube database API for other mods
|
-- Expose teleport tube database API for other mods
|
||||||
pipeworks.tptube = {
|
pipeworks.tptube = {
|
||||||
hash = hash,
|
version = tube_db_version,
|
||||||
|
hash = hash_pos,
|
||||||
|
get_db = function() return tube_db end,
|
||||||
save_tube_db = save_tube_db,
|
save_tube_db = save_tube_db,
|
||||||
save_tube_db_entry = save_tube_db_entry,
|
|
||||||
get_db = function() return tp_tube_db or read_tube_db() end,
|
|
||||||
set_tube = set_tube,
|
set_tube = set_tube,
|
||||||
update_meta = update_meta,
|
save_tube = save_tube,
|
||||||
tp_tube_db_version = tp_tube_db_version
|
update_tube = update_tube,
|
||||||
|
update_meta = function(meta, cr)
|
||||||
|
-- Legacy behaviour
|
||||||
|
if cr ~= nil then
|
||||||
|
meta:set_int("can_receive", cr and 1 or 0)
|
||||||
|
end
|
||||||
|
update_meta(meta)
|
||||||
|
end,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-- Load the database
|
||||||
|
read_tube_db()
|
||||||
|
@ -10,7 +10,8 @@ minetest.register_node("pipeworks:trashcan", {
|
|||||||
"pipeworks_trashcan_side.png",
|
"pipeworks_trashcan_side.png",
|
||||||
"pipeworks_trashcan_side.png",
|
"pipeworks_trashcan_side.png",
|
||||||
},
|
},
|
||||||
groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1, dig_generic = 4},
|
groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1, dig_generic = 4, axey=5},
|
||||||
|
_mcl_hardness=1.6,
|
||||||
tube = {
|
tube = {
|
||||||
insert_object = function(pos, node, stack, direction)
|
insert_object = function(pos, node, stack, direction)
|
||||||
return ItemStack("")
|
return ItemStack("")
|
||||||
|
@ -61,13 +61,13 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e
|
|||||||
outimgs[vti[v]] = ends[v]
|
outimgs[vti[v]] = ends[v]
|
||||||
end
|
end
|
||||||
|
|
||||||
local tgroups = {snappy = 3, tube = 1, tubedevice = 1, not_in_creative_inventory = 1, dig_generic = 4}
|
local tgroups = {snappy = 3, tube = 1, tubedevice = 1, not_in_creative_inventory = 1, dig_generic = 4, axey=5}
|
||||||
local tubedesc = string.format("%s %s", desc, dump(connects))
|
local tubedesc = string.format("%s %s", desc, dump(connects))
|
||||||
local iimg = type(plain[1]) == "table" and plain[1].name or plain[1]
|
local iimg = type(plain[1]) == "table" and plain[1].name or plain[1]
|
||||||
local wscale = {x = 1, y = 1, z = 1}
|
local wscale = {x = 1, y = 1, z = 1}
|
||||||
|
|
||||||
if #connects == 0 then
|
if #connects == 0 then
|
||||||
tgroups = {snappy = 3, tube = 1, tubedevice = 1, dig_generic = 4}
|
tgroups = {snappy = 3, tube = 1, tubedevice = 1, dig_generic = 4, axey=5}
|
||||||
tubedesc = desc
|
tubedesc = desc
|
||||||
iimg=inv
|
iimg=inv
|
||||||
outimgs = {
|
outimgs = {
|
||||||
@ -106,6 +106,7 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e
|
|||||||
fixed = outboxes
|
fixed = outboxes
|
||||||
},
|
},
|
||||||
groups = tgroups,
|
groups = tgroups,
|
||||||
|
_mcl_hardness=1.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_wood_defaults",
|
key = "node_sound_wood_defaults",
|
||||||
},
|
},
|
||||||
|
139
vacuum_tubes.lua
139
vacuum_tubes.lua
@ -1,4 +1,37 @@
|
|||||||
|
|
||||||
local S = minetest.get_translator("pipeworks")
|
local S = minetest.get_translator("pipeworks")
|
||||||
|
|
||||||
|
local enable_max = minetest.settings:get_bool("pipeworks_enable_items_per_tube_limit", true)
|
||||||
|
local max_items = tonumber(minetest.settings:get("pipeworks_max_items_per_tube")) or 30
|
||||||
|
max_items = math.ceil(max_items / 2) -- Limit vacuuming to half the max limit
|
||||||
|
|
||||||
|
local function vacuum(pos, radius)
|
||||||
|
radius = radius + 0.5
|
||||||
|
local min_pos = vector.subtract(pos, radius)
|
||||||
|
local max_pos = vector.add(pos, radius)
|
||||||
|
local count = 0
|
||||||
|
for _, obj in pairs(minetest.get_objects_in_area(min_pos, max_pos)) do
|
||||||
|
local entity = obj:get_luaentity()
|
||||||
|
if entity and entity.name == "__builtin:item" then
|
||||||
|
if entity.itemstring ~= "" then
|
||||||
|
pipeworks.tube_inject_item(pos, pos, vector.new(0, 0, 0), entity.itemstring)
|
||||||
|
entity.itemstring = ""
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
obj:remove()
|
||||||
|
if enable_max and count >= max_items then
|
||||||
|
return -- Don't break tube by vacuuming too many items
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local function set_timer(pos)
|
||||||
|
local timer = minetest.get_node_timer(pos)
|
||||||
|
-- Randomize timer so not all tubes vacuum at the same time
|
||||||
|
timer:start(math.random(10, 20) * 0.1)
|
||||||
|
end
|
||||||
|
|
||||||
if pipeworks.enable_sand_tube then
|
if pipeworks.enable_sand_tube then
|
||||||
pipeworks.register_tube("pipeworks:sand_tube", {
|
pipeworks.register_tube("pipeworks:sand_tube", {
|
||||||
description = S("Vacuuming Pneumatic Tube Segment"),
|
description = S("Vacuuming Pneumatic Tube Segment"),
|
||||||
@ -7,29 +40,27 @@ if pipeworks.enable_sand_tube then
|
|||||||
noctr = {"pipeworks_sand_tube_noctr.png"},
|
noctr = {"pipeworks_sand_tube_noctr.png"},
|
||||||
plain = {"pipeworks_sand_tube_plain.png"},
|
plain = {"pipeworks_sand_tube_plain.png"},
|
||||||
ends = {"pipeworks_sand_tube_end.png"},
|
ends = {"pipeworks_sand_tube_end.png"},
|
||||||
node_def = {groups = {vacuum_tube = 1}},
|
node_def = {
|
||||||
})
|
groups = {vacuum_tube = 1},
|
||||||
|
on_construct = set_timer,
|
||||||
minetest.register_craft( {
|
on_timer = function(pos, elapsed)
|
||||||
output = "pipeworks:sand_tube_1 2",
|
vacuum(pos, 2)
|
||||||
recipe = {
|
set_timer(pos)
|
||||||
{"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"},
|
end,
|
||||||
{"group:sand", "group:sand", "group:sand"},
|
|
||||||
{"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet"}
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_craft( {
|
|
||||||
output = "pipeworks:sand_tube_1",
|
|
||||||
recipe = {
|
|
||||||
{"group:sand", "pipeworks:tube_1", "group:sand"},
|
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
if pipeworks.enable_mese_sand_tube then
|
if pipeworks.enable_mese_sand_tube then
|
||||||
|
local formspec = "formspec_version[2]size[8,3]"..
|
||||||
|
pipeworks.fs_helpers.get_prepends("8,3")..
|
||||||
|
"image[0.5,0.3;1,1;pipeworks_mese_sand_tube_inv.png]"..
|
||||||
|
"label[1.75,0.8;"..S("Adjustable Vacuuming Tube").."]"..
|
||||||
|
"field[0.5,1.7;5,0.8;dist;"..S("Radius")..";${dist}]"..
|
||||||
|
"button_exit[5.5,1.7;2,0.8;save;"..S("Save").."]"
|
||||||
|
|
||||||
pipeworks.register_tube("pipeworks:mese_sand_tube", {
|
pipeworks.register_tube("pipeworks:mese_sand_tube", {
|
||||||
description = S("Adjustable Vacuuming Pneumatic Tube Segment"),
|
description = S("Adjustable Vacuuming Tube"),
|
||||||
inventory_image = "pipeworks_mese_sand_tube_inv.png",
|
inventory_image = "pipeworks_mese_sand_tube_inv.png",
|
||||||
short = "pipeworks_mese_sand_tube_short.png",
|
short = "pipeworks_mese_sand_tube_short.png",
|
||||||
noctr = {"pipeworks_mese_sand_tube_noctr.png"},
|
noctr = {"pipeworks_mese_sand_tube_noctr.png"},
|
||||||
@ -39,69 +70,33 @@ if pipeworks.enable_mese_sand_tube then
|
|||||||
groups = {vacuum_tube = 1},
|
groups = {vacuum_tube = 1},
|
||||||
on_construct = function(pos)
|
on_construct = function(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local size = "6.0,2.4"
|
meta:set_int("dist", 2)
|
||||||
meta:set_int("dist", 0)
|
meta:set_string("formspec", formspec)
|
||||||
meta:set_string("formspec",
|
meta:set_string("infotext", S("Adjustable Vacuuming Tube (@1m)", 2))
|
||||||
"size["..size.."]"..
|
set_timer(pos)
|
||||||
pipeworks.fs_helpers.get_prepends(size) ..
|
|
||||||
"image[0.2,0;1,1;pipeworks_mese_sand_tube_inv.png]"..
|
|
||||||
"label[1.2,0.2;"..S("Adjustable Vacuuming Tube").."]"..
|
|
||||||
"field[0.5,1.6;2.1,1;dist;"..S("Radius")..";${dist}]"..
|
|
||||||
"button[2.3,1.3;1.5,1;set_dist;"..S("Set").."]"..
|
|
||||||
"button_exit[3.8,1.3;2,1;close;"..S("Close").."]")
|
|
||||||
meta:set_string("infotext", S("Adjustable Vacuuming Pneumatic Tube Segment"))
|
|
||||||
end,
|
end,
|
||||||
on_receive_fields = function(pos,formname,fields,sender)
|
on_timer = function(pos, elapsed)
|
||||||
if (fields.quit and not fields.key_enter_field)
|
local radius = minetest.get_meta(pos):get_int("dist")
|
||||||
or (fields.key_enter_field ~= "dist" and not fields.set_dist)
|
vacuum(pos, radius)
|
||||||
or not pipeworks.may_configure(pos, sender) then
|
set_timer(pos)
|
||||||
|
end,
|
||||||
|
on_receive_fields = function(pos, _, fields, sender)
|
||||||
|
if not fields.dist or not pipeworks.may_configure(pos, sender) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local dist = tonumber(fields.dist)
|
local dist = math.min(math.max(tonumber(fields.dist) or 0, 0), 8)
|
||||||
if dist then
|
|
||||||
dist = math.max(0, dist)
|
|
||||||
dist = math.min(8, dist)
|
|
||||||
meta:set_int("dist", dist)
|
meta:set_int("dist", dist)
|
||||||
meta:set_string("infotext", S("Adjustable Vacuuming Pneumatic Tube Segment (@1m)", dist))
|
meta:set_string("infotext", S("Adjustable Vacuuming Tube (@1m)", dist))
|
||||||
end
|
|
||||||
end,
|
end,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
local function vacuum(pos, radius)
|
minetest.register_lbm({
|
||||||
radius = radius + 0.5
|
label = "Vacuum tube node timer starter",
|
||||||
for _, object in pairs(minetest.get_objects_inside_radius(pos, math.sqrt(3) * radius)) do
|
name = "pipeworks:vacuum_tube_start",
|
||||||
local lua_entity = object:get_luaentity()
|
nodenames = {"group:vacuum_tube"},
|
||||||
if not object:is_player() and lua_entity and lua_entity.name == "__builtin:item" then
|
run_at_every_load = false,
|
||||||
local obj_pos = object:get_pos()
|
action = set_timer,
|
||||||
local minpos = vector.subtract(pos, radius)
|
|
||||||
local maxpos = vector.add(pos, radius)
|
|
||||||
if obj_pos.x >= minpos.x and obj_pos.x <= maxpos.x
|
|
||||||
and obj_pos.y >= minpos.y and obj_pos.y <= maxpos.y
|
|
||||||
and obj_pos.z >= minpos.z and obj_pos.z <= maxpos.z then
|
|
||||||
if lua_entity.itemstring ~= "" then
|
|
||||||
pipeworks.tube_inject_item(pos, pos, vector.new(0, 0, 0), lua_entity.itemstring)
|
|
||||||
lua_entity.itemstring = ""
|
|
||||||
end
|
|
||||||
object:remove()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_abm({nodenames = {"group:vacuum_tube"},
|
|
||||||
interval = 1,
|
|
||||||
chance = 1,
|
|
||||||
label = "Vacuum tubes",
|
|
||||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
|
||||||
if node.name:find("pipeworks:sand_tube") then
|
|
||||||
vacuum(pos, 2)
|
|
||||||
else
|
|
||||||
local radius = minetest.get_meta(pos):get_int("dist")
|
|
||||||
vacuum(pos, radius)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
})
|
})
|
||||||
|
11
wielder.lua
11
wielder.lua
@ -146,7 +146,7 @@ local function register_wielder(data)
|
|||||||
data.fixup_node = data.fixup_node or function (pos, node) end
|
data.fixup_node = data.fixup_node or function (pos, node) end
|
||||||
data.fixup_oldmetadata = data.fixup_oldmetadata or function (m) return m end
|
data.fixup_oldmetadata = data.fixup_oldmetadata or function (m) return m end
|
||||||
for _, state in ipairs({ "off", "on" }) do
|
for _, state in ipairs({ "off", "on" }) do
|
||||||
local groups = { snappy=2, choppy=2, oddly_breakable_by_hand=2, mesecon=2, tubedevice=1, tubedevice_receiver=1 }
|
local groups = { snappy=2, choppy=2, oddly_breakable_by_hand=2, mesecon=2, tubedevice=1, tubedevice_receiver=1, axey=5 }
|
||||||
if state == "on" then groups.not_in_creative_inventory = 1 end
|
if state == "on" then groups.not_in_creative_inventory = 1 end
|
||||||
local tile_images = {}
|
local tile_images = {}
|
||||||
for _, face in ipairs({ "top", "bottom", "side2", "side1", "back", "front" }) do
|
for _, face in ipairs({ "top", "bottom", "side2", "side1", "back", "front" }) do
|
||||||
@ -199,6 +199,7 @@ local function register_wielder(data)
|
|||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
tubelike = 1,
|
tubelike = 1,
|
||||||
groups = groups,
|
groups = groups,
|
||||||
|
_mcl_hardness=0.6,
|
||||||
_sound_def = {
|
_sound_def = {
|
||||||
key = "node_sound_stone_defaults",
|
key = "node_sound_stone_defaults",
|
||||||
},
|
},
|
||||||
@ -336,6 +337,10 @@ if pipeworks.enable_node_breaker then
|
|||||||
masquerade_as_owner = true,
|
masquerade_as_owner = true,
|
||||||
sneak = false,
|
sneak = false,
|
||||||
act = function(virtplayer, pointed_thing)
|
act = function(virtplayer, pointed_thing)
|
||||||
|
if minetest.is_protected(vector.add(virtplayer:get_pos(), assumed_eye_pos), virtplayer:get_player_name()) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
--local dname = "nodebreaker.act() "
|
--local dname = "nodebreaker.act() "
|
||||||
local wieldstack = virtplayer:get_wielded_item()
|
local wieldstack = virtplayer:get_wielded_item()
|
||||||
local oldwieldstack = ItemStack(wieldstack)
|
local oldwieldstack = ItemStack(wieldstack)
|
||||||
@ -427,6 +432,10 @@ if pipeworks.enable_deployer then
|
|||||||
masquerade_as_owner = true,
|
masquerade_as_owner = true,
|
||||||
sneak = false,
|
sneak = false,
|
||||||
act = function(virtplayer, pointed_thing)
|
act = function(virtplayer, pointed_thing)
|
||||||
|
if minetest.is_protected(vector.add(virtplayer:get_pos(), assumed_eye_pos), virtplayer:get_player_name()) then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local wieldstack = virtplayer:get_wielded_item()
|
local wieldstack = virtplayer:get_wielded_item()
|
||||||
virtplayer:set_wielded_item((minetest.registered_items[wieldstack:get_name()] or {on_place=minetest.item_place}).on_place(wieldstack, virtplayer, pointed_thing) or wieldstack)
|
virtplayer:set_wielded_item((minetest.registered_items[wieldstack:get_name()] or {on_place=minetest.item_place}).on_place(wieldstack, virtplayer, pointed_thing) or wieldstack)
|
||||||
end,
|
end,
|
||||||
|
Loading…
Reference in New Issue
Block a user