mirror of
https://github.com/mt-mods/pipeworks.git
synced 2025-07-06 10:10:34 +02:00
Compare commits
81 Commits
2021-01-30
...
b11cb37123
Author | SHA1 | Date | |
---|---|---|---|
b11cb37123 | |||
b6c02ac8de | |||
54243764e0 | |||
1823690dad | |||
503c1190ed | |||
75894355d4 | |||
5bba517b03 | |||
7b15bdbd1f | |||
90425fde95 | |||
1349ff8dd8 | |||
3b31b6f9c0 | |||
4fce320d9c | |||
55ded7e569 | |||
e3d94cb3a8 | |||
97903327a5 | |||
37eef73695 | |||
3092ce771f | |||
96ccd29dd2 | |||
8e0b25fb2c | |||
8a29f8844c | |||
5aa0501872 | |||
66070dd801 | |||
5618003be3 | |||
06fd754216 | |||
794cae675e | |||
7d3a61e595 | |||
a70115ab8d | |||
23fe215721 | |||
8f067db7cd | |||
e082ea473b | |||
7ee74133e1 | |||
cec6049dd1 | |||
047718b3c3 | |||
01f4ea066c | |||
7ba685344c | |||
c39d40e940 | |||
48b082e014 | |||
c01bd7b888 | |||
2670fd88a9 | |||
3536004667 | |||
b53a1ee477 | |||
29bac67d3a | |||
e2fdcc4fb2 | |||
db6d1bd9c1 | |||
79dc5f5c7d | |||
01d44056a2 | |||
c7d44272e6 | |||
5837d62979 | |||
e4db1e885e | |||
fc6efb450c | |||
828c50e85d | |||
4add40705f | |||
a6e4f2dceb | |||
7ad991ce40 | |||
f7839444cd | |||
d2954c5277 | |||
93f5fb3d87 | |||
9ad6e5d07a | |||
31e1255245 | |||
a535bebd2e | |||
a735d1a155 | |||
be2776fc46 | |||
a2c0dd1130 | |||
f0ef43823c | |||
17a602a5a1 | |||
2294a23582 | |||
b2d2ccbcba | |||
ee03959a65 | |||
4dd30df37a | |||
946da11206 | |||
77c8026400 | |||
70b521c721 | |||
6d795b7d34 | |||
92249b7941 | |||
e04fb691ad | |||
ac80224371 | |||
34262ed8d5 | |||
5cfe8d893f | |||
975e20f704 | |||
2693e2ecbb | |||
c93df73a5c |
13
.github/workflows/luacheck.yml
vendored
Normal file
13
.github/workflows/luacheck.yml
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
name: luacheck
|
||||
on: [push, pull_request]
|
||||
jobs:
|
||||
build:
|
||||
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 ./
|
25
.luacheckrc
Normal file
25
.luacheckrc
Normal file
@ -0,0 +1,25 @@
|
||||
unused_args = false
|
||||
max_line_length= 240
|
||||
redefined = false
|
||||
|
||||
globals = {
|
||||
"pipeworks",
|
||||
"luaentity"
|
||||
}
|
||||
|
||||
read_globals = {
|
||||
-- Stdlib
|
||||
string = {fields = {"split"}},
|
||||
table = {fields = {"copy", "getn"}},
|
||||
|
||||
-- Minetest
|
||||
"vector", "ItemStack",
|
||||
"dump", "minetest",
|
||||
"VoxelManip", "VoxelArea",
|
||||
|
||||
-- mods
|
||||
"default", "mesecon", "digiline",
|
||||
"screwdriver", "unified_inventory",
|
||||
"i3",
|
||||
|
||||
}
|
6
README
6
README
@ -1,7 +1,7 @@
|
||||
This mod uses nodeboxes to supply a complete set of 3D pipes and tubes,
|
||||
along devices that work with them.
|
||||
|
||||
See https://gitlab.com/VanessaE/pipeworks/wikis/ for detailed information about usage of this mod.
|
||||
See https://github.com/mt-mods/pipeworks/wiki/ for detailed information about usage of this mod.
|
||||
|
||||
Unlike the previous version of this mod, these pipes are rounded, and when
|
||||
placed, they'll automatically join together as needed. Pipes can go vertically
|
||||
@ -20,3 +20,7 @@ This mod is a work in progress.
|
||||
|
||||
Please note that owing to the nature of this mod, I have opted to use 64px
|
||||
textures. Anything less just looks terrible.
|
||||
|
||||
The teleport tube database used to be kept in a file named 'teleport_tubes'.
|
||||
The database is now kept in mod storage. The migration from 'teleport_tubes' is
|
||||
automatic. The old file is then kept around but is not used at all.
|
||||
|
@ -47,7 +47,7 @@ local function autocraft(inventory, craft)
|
||||
end
|
||||
-- consume material
|
||||
for itemname, number in pairs(consumption) do
|
||||
for i = 1, number do -- We have to do that since remove_item does not work if count > stack_max
|
||||
for _ = 1, number do -- We have to do that since remove_item does not work if count > stack_max
|
||||
inventory:remove_item("src", ItemStack(itemname))
|
||||
end
|
||||
end
|
||||
@ -67,13 +67,16 @@ local function run_autocrafter(pos, elapsed)
|
||||
local inventory = meta:get_inventory()
|
||||
local craft = get_craft(pos, inventory)
|
||||
local output_item = craft.output.item
|
||||
-- NALC: existence de limitgroup ?
|
||||
local limitcraft = minetest.get_item_group(output_item:get_name(), "limitcraft") or 0
|
||||
-- only use crafts that have an actual result
|
||||
if output_item:is_empty() then
|
||||
-- NALC: ou si l'item n'est pas dans le group limitcraft
|
||||
if output_item:is_empty() or limitcraft > 0 then
|
||||
meta:set_string("infotext", S("unconfigured Autocrafter: unknown recipe"))
|
||||
return false
|
||||
end
|
||||
|
||||
for step = 1, math.floor(elapsed/craft_time) do
|
||||
for _ = 1, math.floor(elapsed/craft_time) do
|
||||
local continue = autocraft(inventory, craft)
|
||||
if not continue then return false end
|
||||
end
|
||||
@ -106,7 +109,6 @@ local function after_recipe_change(pos, inventory)
|
||||
inventory:set_stack("output", 1, "")
|
||||
return
|
||||
end
|
||||
local recipe_changed = false
|
||||
local recipe = inventory:get_list("recipe")
|
||||
|
||||
local hash = minetest.hash_node_position(pos)
|
||||
@ -173,26 +175,47 @@ end
|
||||
local function update_meta(meta, enabled)
|
||||
local state = enabled and "on" or "off"
|
||||
meta:set_int("enabled", enabled and 1 or 0)
|
||||
local fs = "size[8,12]"..
|
||||
"list[context;recipe;0,0;3,3;]"..
|
||||
"image[3,1;1,1;gui_hb_bg.png^[colorize:#141318:255]"..
|
||||
"list[context;output;3,1;1,1;]"..
|
||||
"image_button[3,2;1,0.6;pipeworks_button_" .. state .. ".png;" .. state .. ";;;false;pipeworks_button_interm.png]" ..
|
||||
"list[context;src;0,4.5;8,3;]"..
|
||||
"list[context;dst;4,0;4,3;]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
default.get_hotbar_bg(0,8) ..
|
||||
"list[current_player;main;0,8;8,4;]" ..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;src]" ..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;dst]" ..
|
||||
"listring[current_player;main]"
|
||||
local list_backgrounds = ""
|
||||
if minetest.get_modpath("i3") then
|
||||
list_backgrounds = "style_type[box;colors=#666]"
|
||||
for i=0, 2 do
|
||||
for j=0, 2 do
|
||||
list_backgrounds = list_backgrounds .. "box[".. 0.22+(i*1.25) ..",".. 0.22+(j*1.25) ..";1,1;]"
|
||||
end
|
||||
end
|
||||
for i=0, 3 do
|
||||
for j=0, 2 do
|
||||
list_backgrounds = list_backgrounds .. "box[".. 5.28+(i*1.25) ..",".. 0.22+(j*1.25) ..";1,1;]"
|
||||
end
|
||||
end
|
||||
for i=0, 7 do
|
||||
for j=0, 2 do
|
||||
list_backgrounds = list_backgrounds .. "box[".. 0.22+(i*1.25) ..",".. 5+(j*1.25) ..";1,1;]"
|
||||
end
|
||||
end
|
||||
end
|
||||
local size = "10.2,14"
|
||||
local fs =
|
||||
"formspec_version[2]"..
|
||||
"size["..size.."]"..
|
||||
pipeworks.fs_helpers.get_prepends(size)..
|
||||
list_backgrounds..
|
||||
"list[context;recipe;0.22,0.22;3,3;]"..
|
||||
"image[4,1.45;1,1;[combine:16x16^[noalpha^[colorize:#141318:255]"..
|
||||
"list[context;output;4,1.45;1,1;]"..
|
||||
"image_button[4,2.6;1,0.6;pipeworks_button_" .. state .. ".png;" .. state .. ";;;false;pipeworks_button_interm.png]" ..
|
||||
"list[context;dst;5.28,0.22;4,3;]"..
|
||||
"list[context;src;0.22,5;8,3;]"..
|
||||
pipeworks.fs_helpers.get_inv(9)..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;src]" ..
|
||||
"listring[current_player;main]"..
|
||||
"listring[context;dst]" ..
|
||||
"listring[current_player;main]"
|
||||
if minetest.get_modpath("digilines") then
|
||||
fs = fs.."field[1,3.5;4,1;channel;"..S("Channel")..";${channel}]"
|
||||
fs = fs.."button_exit[5,3.2;2,1;save;"..S("Save").."]"
|
||||
fs = fs.."field[0.22,4.1;4.5,0.75;channel;"..S("Channel")..";${channel}]"..
|
||||
"button[5,4.1;1.5,0.75;set_channel;"..S("Set").."]"..
|
||||
"button_exit[6.8,4.1;2,0.75;close;"..S("Close").."]"
|
||||
end
|
||||
meta:set_string("formspec",fs)
|
||||
|
||||
@ -252,7 +275,7 @@ minetest.register_node("pipeworks:autocrafter", {
|
||||
description = S("Autocrafter"),
|
||||
drawtype = "normal",
|
||||
tiles = {"pipeworks_autocrafter.png"},
|
||||
groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1},
|
||||
groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1, dig_generic = 1},
|
||||
tube = {insert_object = function(pos, node, stack, direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
@ -277,7 +300,9 @@ minetest.register_node("pipeworks:autocrafter", {
|
||||
update_meta(meta, false)
|
||||
end,
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
if not pipeworks.may_configure(pos, sender) then return end
|
||||
if (fields.quit and not fields.key_enter_field) or not pipeworks.may_configure(pos, sender) then
|
||||
return
|
||||
end
|
||||
local meta = minetest.get_meta(pos)
|
||||
if fields.on then
|
||||
update_meta(meta, false)
|
||||
@ -286,8 +311,9 @@ minetest.register_node("pipeworks:autocrafter", {
|
||||
if update_meta(meta, true) then
|
||||
start_crafter(pos)
|
||||
end
|
||||
elseif fields.save then
|
||||
meta:set_string("channel",fields.channel)
|
||||
end
|
||||
if fields.channel then
|
||||
meta:set_string("channel", fields.channel)
|
||||
end
|
||||
end,
|
||||
can_dig = function(pos, player)
|
||||
@ -424,12 +450,4 @@ minetest.register_node("pipeworks:autocrafter", {
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:autocrafter 2",
|
||||
recipe = {
|
||||
{ "default:steel_ingot", "default:mese_crystal", "default:steel_ingot" },
|
||||
{ "basic_materials:plastic_sheet", "default:steel_ingot", "basic_materials:plastic_sheet" },
|
||||
{ "default:steel_ingot", "default:mese_crystal", "default:steel_ingot" }
|
||||
},
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:autocrafter"
|
||||
|
@ -81,7 +81,7 @@ local function tube_autoroute(pos)
|
||||
local basename = nodedef.basename
|
||||
if nodedef.style == "old" then
|
||||
local nsurround = ""
|
||||
for i, n in ipairs(active) do
|
||||
for _, n in ipairs(active) do
|
||||
nsurround = nsurround..n
|
||||
end
|
||||
nctr.name = basename.."_"..nsurround
|
||||
|
60
common.lua
60
common.lua
@ -114,7 +114,7 @@ local fs_helpers = {}
|
||||
pipeworks.fs_helpers = fs_helpers
|
||||
function fs_helpers.on_receive_fields(pos, fields)
|
||||
local meta = minetest.get_meta(pos)
|
||||
for field, value in pairs(fields) do
|
||||
for field in pairs(fields) do
|
||||
if pipeworks.string_startswith(field, "fs_helpers_cycling:") then
|
||||
local l = field:split(":")
|
||||
local new_value = tonumber(l[2])
|
||||
@ -143,6 +143,55 @@ function fs_helpers.cycling_button(meta, base, meta_name, values)
|
||||
return base..";"..(texture_name and texture_name..";" or "")..field..";"..minetest.formspec_escape(text)..(addopts and ";"..addopts or "").."]"
|
||||
end
|
||||
|
||||
function fs_helpers.get_inv(y)
|
||||
local fs = {}
|
||||
if minetest.get_modpath("i3") then
|
||||
local inv_x = i3.settings.legacy_inventory and 0.75 or 0.22
|
||||
local inv_y = (y + 0.4) or 6.9
|
||||
local size, spacing = 1, 0.1
|
||||
local hotbar_len = i3.settings.hotbar_len
|
||||
|
||||
table.insert(fs, "style_type[box;colors=#77777710,#77777710,#777,#777]")
|
||||
|
||||
for i = 0, hotbar_len - 1 do
|
||||
table.insert(fs, "box["..(i * size + inv_x + (i * spacing))..","..inv_y..";"..size..","..size..";]")
|
||||
end
|
||||
|
||||
table.insert(fs, "style_type[list;size="..size..";spacing="..spacing.."]")
|
||||
table.insert(fs, "list[current_player;main;"..inv_x..","..inv_y..";"..hotbar_len..",1;]")
|
||||
|
||||
table.insert(fs, "style_type[box;colors=#666]")
|
||||
for i=0, 2 do
|
||||
for j=0, (i3.settings.legacy_inventory and 7 or 8) 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..";]")
|
||||
end
|
||||
end
|
||||
|
||||
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.."]")
|
||||
else
|
||||
table.insert(fs, "list[current_player;main;0.22,"..y..";8,4;]")
|
||||
end
|
||||
|
||||
return table.concat(fs, "")
|
||||
end
|
||||
|
||||
function fs_helpers.get_prepends(size)
|
||||
local prepend = {}
|
||||
|
||||
if minetest.get_modpath("i3") then
|
||||
prepend = {
|
||||
"no_prepend[]",
|
||||
"bgcolor[black;neither]",
|
||||
"background9[0,0;"..size..";i3_bg_full.png;false;10]",
|
||||
"style_type[button;border=false;bgimg=[combine:16x16^[noalpha^[colorize:#6b6b6b]",
|
||||
"listcolors[#0000;#ffffff20]"
|
||||
}
|
||||
end
|
||||
|
||||
return table.concat(prepend, "")
|
||||
end
|
||||
|
||||
---------
|
||||
-- Env --
|
||||
---------
|
||||
@ -183,7 +232,7 @@ function pipeworks.create_fake_player(def, is_dynamic)
|
||||
is_player = delay(true),
|
||||
is_fake_player = true,
|
||||
|
||||
_formspec = def.formspec or default.gui_survival_form,
|
||||
_formspec = def.formspec or "",
|
||||
_hp = def.hp or 20,
|
||||
_breath = 11,
|
||||
_pos = def.position and table.copy(def.position) or vector.new(),
|
||||
@ -223,7 +272,7 @@ function pipeworks.create_fake_player(def, is_dynamic)
|
||||
return self._inventory:set_stack(def.wield_list,
|
||||
self._wield_index, item)
|
||||
end
|
||||
_wielded_item = ItemStack(item)
|
||||
self._wielded_item = ItemStack(item)
|
||||
end,
|
||||
get_wielded_item = function(self, item)
|
||||
if self._inventory and def.wield_list then
|
||||
@ -242,17 +291,18 @@ function pipeworks.create_fake_player(def, is_dynamic)
|
||||
set_bone_position = delay(),
|
||||
hud_change = delay(),
|
||||
}
|
||||
local _trash
|
||||
-- Getter & setter functions
|
||||
p.get_inventory_formspec, p.set_inventory_formspec
|
||||
= get_set_wrap("formspec", is_dynamic)
|
||||
p.get_breath, p.set_breath = get_set_wrap("breath", is_dynamic)
|
||||
p.get_hp, p.set_hp = get_set_wrap("hp", is_dynamic)
|
||||
p.get_pos, p.set_pos = get_set_wrap("pos", is_dynamic)
|
||||
_trash, p.move_to = get_set_wrap("pos", is_dynamic)
|
||||
p.get_wield_index, p.set_wield_index = get_set_wrap("wield_index", true)
|
||||
p.get_properties, p.set_properties = get_set_wrap("properties", false)
|
||||
|
||||
-- For players, move_to and get_pos do the same
|
||||
p.move_to = p.get_pos
|
||||
|
||||
-- Backwards compatibilty
|
||||
p.getpos = p.get_pos
|
||||
p.setpos = p.set_pos
|
||||
|
@ -11,33 +11,72 @@ local tube_entry = "^pipeworks_tube_connection_wooden.png"
|
||||
-- Chest Locals
|
||||
local open_chests = {}
|
||||
|
||||
local function get_chest_formspec(pos)
|
||||
local spos = pos.x .. "," .. pos.y .. "," .. pos.z
|
||||
local formspec =
|
||||
"size[8,9]" ..
|
||||
default.gui_bg ..
|
||||
default.gui_bg_img ..
|
||||
default.gui_slots ..
|
||||
"list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" ..
|
||||
"list[current_player;main;0,4.85;8,1;]" ..
|
||||
"list[current_player;main;0,6.08;8,3;8]" ..
|
||||
"listring[nodemeta:" .. spos .. ";main]" ..
|
||||
"listring[current_player;main]" ..
|
||||
default.get_hotbar_bg(0,4.85)
|
||||
local get_chest_formspec
|
||||
|
||||
-- Pipeworks Switch
|
||||
formspec = formspec ..
|
||||
fs_helpers.cycling_button(
|
||||
minetest.get_meta(pos),
|
||||
pipeworks.button_base,
|
||||
"splitstacks",
|
||||
{
|
||||
pipeworks.button_off,
|
||||
pipeworks.button_on
|
||||
}
|
||||
)..pipeworks.button_label
|
||||
if minetest.get_modpath("default") then
|
||||
function get_chest_formspec(pos)
|
||||
local spos = pos.x .. "," .. pos.y .. "," .. pos.z
|
||||
local formspec =
|
||||
"size[8,9]" ..
|
||||
default.gui_bg ..
|
||||
default.gui_bg_img ..
|
||||
default.gui_slots ..
|
||||
"list[nodemeta:" .. spos .. ";main;0,0.3;8,4;]" ..
|
||||
"list[current_player;main;0,4.85;8,1;]" ..
|
||||
"list[current_player;main;0,6.08;8,3;8]" ..
|
||||
"listring[nodemeta:" .. spos .. ";main]" ..
|
||||
"listring[current_player;main]" ..
|
||||
default.get_hotbar_bg(0,4.85)
|
||||
|
||||
return formspec
|
||||
-- Pipeworks Switch
|
||||
formspec = formspec ..
|
||||
fs_helpers.cycling_button(
|
||||
minetest.get_meta(pos),
|
||||
pipeworks.button_base,
|
||||
"splitstacks",
|
||||
{
|
||||
pipeworks.button_off,
|
||||
pipeworks.button_on
|
||||
}
|
||||
)..pipeworks.button_label
|
||||
|
||||
return formspec
|
||||
end
|
||||
else
|
||||
local function get_hotbar_bg(x,y)
|
||||
local out = ""
|
||||
for i=0,7,1 do
|
||||
out = out .."image["..x+i..","..y..";1,1;gui_hb_bg.png]"
|
||||
end
|
||||
return out
|
||||
end
|
||||
|
||||
function get_chest_formspec(pos)
|
||||
local spos = pos.x .. "," .. pos.y .. "," .. pos.z
|
||||
local formspec =
|
||||
"size[10,9]" ..
|
||||
"background9[8,8;8,9;hades_chests_chestui.png;true;8]"..
|
||||
"list[nodemeta:" .. spos .. ";main;0,0.3;10,4;]" ..
|
||||
"list[current_player;main;0,4.85;10,1;]" ..
|
||||
"list[current_player;main;0,6.08;10,3;10]" ..
|
||||
"listring[nodemeta:" .. spos .. ";main]" ..
|
||||
"listring[current_player;main]" ..
|
||||
get_hotbar_bg(0,4.85)
|
||||
|
||||
-- Pipeworks Switch
|
||||
formspec = formspec ..
|
||||
fs_helpers.cycling_button(
|
||||
minetest.get_meta(pos),
|
||||
pipeworks.button_base,
|
||||
"splitstacks",
|
||||
{
|
||||
pipeworks.button_off,
|
||||
pipeworks.button_on
|
||||
}
|
||||
)..pipeworks.button_label
|
||||
|
||||
return formspec
|
||||
end
|
||||
end
|
||||
|
||||
local function chest_lid_obstructed(pos)
|
||||
@ -65,13 +104,15 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
local node = minetest.get_node(pos)
|
||||
|
||||
open_chests[pn] = nil
|
||||
for k, v in pairs(open_chests) do
|
||||
for _, v in pairs(open_chests) do
|
||||
if v.pos.x == pos.x and v.pos.y == pos.y and v.pos.z == pos.z then
|
||||
return true
|
||||
end
|
||||
end
|
||||
minetest.after(0.2, function()
|
||||
minetest.swap_node(pos, { name = "default:" .. swap, param2 = node.param2 })
|
||||
if minetest.get_modpath("default") then
|
||||
minetest.swap_node(pos, { name = "default:" .. swap, param2 = node.param2 })
|
||||
end
|
||||
|
||||
-- Pipeworks notification
|
||||
pipeworks.after_place(pos)
|
||||
@ -88,10 +129,18 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
|
||||
end)
|
||||
|
||||
-- Original Definitions
|
||||
local old_chest_def = table.copy(minetest.registered_items["default:chest"])
|
||||
local old_chest_open_def = table.copy(minetest.registered_items["default:chest_open"])
|
||||
local old_chest_locked_def = table.copy(minetest.registered_items["default:chest_locked"])
|
||||
local old_chest_locked_open_def = table.copy(minetest.registered_items["default:chest_locked_open"])
|
||||
local old_chest_def, old_chest_open_def, old_chest_locked_def, old_chest_locked_open_def
|
||||
if minetest.get_modpath("default") then
|
||||
old_chest_def = table.copy(minetest.registered_items["default:chest"])
|
||||
old_chest_open_def = table.copy(minetest.registered_items["default:chest_open"])
|
||||
old_chest_locked_def = table.copy(minetest.registered_items["default:chest_locked"])
|
||||
old_chest_locked_open_def = table.copy(minetest.registered_items["default:chest_locked_open"])
|
||||
elseif minetest.get_modpath("hades_chests") then
|
||||
old_chest_def = table.copy(minetest.registered_items["hades_chests:chest"])
|
||||
old_chest_open_def = table.copy(minetest.registered_items["hades_chests:chest"])
|
||||
old_chest_locked_def = table.copy(minetest.registered_items["hades_chests:chest_locked"])
|
||||
old_chest_locked_open_def = table.copy(minetest.registered_items["hades_chests:chest_locked"])
|
||||
end
|
||||
|
||||
-- Override Construction
|
||||
local override_protected, override, override_open, override_protected_open
|
||||
@ -116,9 +165,11 @@ override_protected = {
|
||||
minetest.sound_play(old_chest_locked_def.sound_open, {gain = 0.3,
|
||||
pos = pos, max_hear_distance = 10})
|
||||
if not chest_lid_obstructed(pos) then
|
||||
minetest.swap_node(pos,
|
||||
{ name = "default:" .. "chest_locked" .. "_open",
|
||||
param2 = node.param2 })
|
||||
if minetest.get_modpath("default") then
|
||||
minetest.swap_node(pos,
|
||||
{ name = "default:" .. "chest_locked" .. "_open",
|
||||
param2 = node.param2 })
|
||||
end
|
||||
end
|
||||
minetest.after(0.2, minetest.show_formspec,
|
||||
clicker:get_player_name(),
|
||||
@ -160,9 +211,11 @@ override = {
|
||||
minetest.sound_play(old_chest_def.sound_open, {gain = 0.3, pos = pos,
|
||||
max_hear_distance = 10})
|
||||
if not chest_lid_obstructed(pos) then
|
||||
minetest.swap_node(pos, {
|
||||
name = "default:" .. "chest" .. "_open",
|
||||
param2 = node.param2 })
|
||||
if minetest.get_modpath("default") then
|
||||
minetest.swap_node(pos, {
|
||||
name = "default:" .. "chest" .. "_open",
|
||||
param2 = node.param2 })
|
||||
end
|
||||
end
|
||||
minetest.after(0.2, minetest.show_formspec,
|
||||
clicker:get_player_name(),
|
||||
@ -230,14 +283,21 @@ override.tiles = {
|
||||
}
|
||||
|
||||
-- Add the extra groups
|
||||
for i,v in ipairs({override_protected, override, override_open, override_protected_open}) do
|
||||
for _,v in ipairs({override_protected, override, override_open, override_protected_open}) do
|
||||
v.groups.tubedevice = 1
|
||||
v.groups.tubedevice_receiver = 1
|
||||
end
|
||||
|
||||
-- Override with the new modifications.
|
||||
minetest.override_item("default:chest", override)
|
||||
minetest.override_item("default:chest_open", override_open)
|
||||
minetest.override_item("default:chest_locked", override_protected)
|
||||
minetest.override_item("default:chest_locked_open", override_protected_open)
|
||||
if minetest.get_modpath("default") then
|
||||
minetest.override_item("default:chest", override)
|
||||
minetest.override_item("default:chest_open", override_open)
|
||||
minetest.override_item("default:chest_locked", override_protected)
|
||||
minetest.override_item("default:chest_locked_open", override_protected_open)
|
||||
elseif minetest.get_modpath("hades_chests") then
|
||||
minetest.override_item("hades_chests:chest", override)
|
||||
--minetest.override_item("hades_chests:chest_open", override_open)
|
||||
minetest.override_item("hades_chests:chest_locked", override_protected)
|
||||
--minetest.override_item("hades_chests:chest_locked_open", override_protected_open)
|
||||
end
|
||||
|
||||
|
@ -1,280 +1,28 @@
|
||||
-- this file is basically a modified copy of
|
||||
-- minetest_game/mods/default/furnaces.lua
|
||||
|
||||
-- translation support
|
||||
local S = minetest.get_translator("pipeworks")
|
||||
local DS = minetest.get_translator("default")
|
||||
|
||||
local fs_helpers = pipeworks.fs_helpers
|
||||
|
||||
tube_entry = "^pipeworks_tube_connection_stony.png"
|
||||
|
||||
local function active_formspec(fuel_percent, item_percent, pos, meta)
|
||||
local formspec =
|
||||
"size[8,8.5]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
"list[current_name;src;2.75,0.5;1,1;]"..
|
||||
"list[current_name;fuel;2.75,2.5;1,1;]"..
|
||||
"image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:"..
|
||||
(100-fuel_percent)..":default_furnace_fire_fg.png]"..
|
||||
"image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:"..
|
||||
(item_percent)..":gui_furnace_arrow_fg.png^[transformR270]"..
|
||||
"list[current_name;dst;4.75,0.96;2,2;]"..
|
||||
"list[current_player;main;0,4.25;8,1;]"..
|
||||
"list[current_player;main;0,5.5;8,3;8]"..
|
||||
"listring[current_name;dst]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[current_name;src]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[current_name;fuel]"..
|
||||
"listring[current_player;main]"..
|
||||
default.get_hotbar_bg(0, 4.25) ..
|
||||
fs_helpers.cycling_button(
|
||||
meta,
|
||||
"image_button[0,3.5;1,0.6",
|
||||
"split_material_stacks",
|
||||
{
|
||||
pipeworks.button_off,
|
||||
pipeworks.button_on
|
||||
}
|
||||
).."label[0.9,3.51;"..S("Allow splitting incoming material (not fuel) stacks from tubes").."]"
|
||||
return formspec
|
||||
local def--, def_active
|
||||
if minetest.get_modpath("default") then
|
||||
def = table.copy(minetest.registered_nodes["default:furnace"])
|
||||
--def_active = table.copy(minetest.registered_nodes["default:furnace_active"])
|
||||
elseif minetest.get_modpath("hades_furnaces") then
|
||||
def = table.copy(minetest.registered_nodes["hades_furnaces:furnace"])
|
||||
--def_active = table.copy(minetest.registered_nodes["hades_furnaces:furnace_active"])
|
||||
end
|
||||
|
||||
local function inactive_formspec(pos, meta)
|
||||
local formspec = "size[8,8.5]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
"list[current_name;src;2.75,0.5;1,1;]"..
|
||||
"list[current_name;fuel;2.75,2.5;1,1;]"..
|
||||
"image[2.75,1.5;1,1;default_furnace_fire_bg.png]"..
|
||||
"image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]"..
|
||||
"list[current_name;dst;4.75,0.96;2,2;]"..
|
||||
"list[current_player;main;0,4.25;8,1;]"..
|
||||
"list[current_player;main;0,5.5;8,3;8]"..
|
||||
"listring[current_name;dst]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[current_name;src]"..
|
||||
"listring[current_player;main]"..
|
||||
"listring[current_name;fuel]"..
|
||||
"listring[current_player;main]"..
|
||||
default.get_hotbar_bg(0, 4.25) ..
|
||||
fs_helpers.cycling_button(
|
||||
meta,
|
||||
"image_button[0,3.5;1,0.6",
|
||||
"split_material_stacks",
|
||||
{
|
||||
pipeworks.button_off,
|
||||
pipeworks.button_on
|
||||
}
|
||||
).."label[0.9,3.51;"..S("Allow splitting incoming material (not fuel) stacks from tubes").."]"
|
||||
return formspec
|
||||
end
|
||||
local tube_entry = "^pipeworks_tube_connection_stony.png"
|
||||
|
||||
--
|
||||
-- Node callback functions that are the same for active and inactive furnace
|
||||
--
|
||||
|
||||
local function can_dig(pos, player)
|
||||
local meta = minetest.get_meta(pos);
|
||||
local inv = meta:get_inventory()
|
||||
return inv:is_empty("fuel") and inv:is_empty("dst") and inv:is_empty("src")
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_put(pos, listname, index, stack, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return 0
|
||||
end
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
if listname == "fuel" then
|
||||
if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then
|
||||
if inv:is_empty("src") then
|
||||
meta:set_string("infotext", DS("Furnace is empty"))
|
||||
end
|
||||
return stack:get_count()
|
||||
else
|
||||
return 0
|
||||
end
|
||||
elseif listname == "src" then
|
||||
return stack:get_count()
|
||||
elseif listname == "dst" then
|
||||
return 0
|
||||
end
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
local stack = inv:get_stack(from_list, from_index)
|
||||
return allow_metadata_inventory_put(pos, to_list, to_index, stack, player)
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory_take(pos, listname, index, stack, player)
|
||||
if minetest.is_protected(pos, player:get_player_name()) then
|
||||
return 0
|
||||
end
|
||||
return stack:get_count()
|
||||
end
|
||||
|
||||
local function swap_node(pos, name)
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name == name then
|
||||
return
|
||||
end
|
||||
node.name = name
|
||||
minetest.swap_node(pos, node)
|
||||
end
|
||||
|
||||
local function furnace_node_timer(pos, elapsed)
|
||||
--
|
||||
-- Inizialize metadata
|
||||
--
|
||||
local meta = minetest.get_meta(pos)
|
||||
local fuel_time = meta:get_float("fuel_time") or 0
|
||||
local src_time = meta:get_float("src_time") or 0
|
||||
local fuel_totaltime = meta:get_float("fuel_totaltime") or 0
|
||||
|
||||
local inv = meta:get_inventory()
|
||||
local srclist, fuellist
|
||||
|
||||
local cookable, cooked
|
||||
local fuel
|
||||
|
||||
local update = true
|
||||
while update do
|
||||
update = false
|
||||
|
||||
srclist = inv:get_list("src")
|
||||
fuellist = inv:get_list("fuel")
|
||||
|
||||
--
|
||||
-- Cooking
|
||||
--
|
||||
|
||||
-- Check if we have cookable content
|
||||
local aftercooked
|
||||
cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
|
||||
cookable = cooked.time ~= 0
|
||||
|
||||
-- Check if we have enough fuel to burn
|
||||
if fuel_time < fuel_totaltime then
|
||||
-- The furnace is currently active and has enough fuel
|
||||
fuel_time = fuel_time + elapsed
|
||||
-- If there is a cookable item then check if it is ready yet
|
||||
if cookable then
|
||||
src_time = src_time + elapsed
|
||||
if src_time >= cooked.time then
|
||||
-- Place result in dst list if possible
|
||||
if inv:room_for_item("dst", cooked.item) then
|
||||
inv:add_item("dst", cooked.item)
|
||||
inv:set_stack("src", 1, aftercooked.items[1])
|
||||
src_time = src_time - cooked.time
|
||||
update = true
|
||||
end
|
||||
end
|
||||
end
|
||||
else
|
||||
-- Furnace ran out of fuel
|
||||
if cookable then
|
||||
-- We need to get new fuel
|
||||
local afterfuel
|
||||
fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
|
||||
|
||||
if fuel.time == 0 then
|
||||
-- No valid fuel in fuel list
|
||||
fuel_totaltime = 0
|
||||
src_time = 0
|
||||
else
|
||||
-- Take fuel from fuel list
|
||||
inv:set_stack("fuel", 1, afterfuel.items[1])
|
||||
update = true
|
||||
fuel_totaltime = fuel.time + (fuel_time - fuel_totaltime)
|
||||
src_time = src_time + elapsed
|
||||
end
|
||||
else
|
||||
-- We don't need to get new fuel since there is no cookable item
|
||||
fuel_totaltime = 0
|
||||
src_time = 0
|
||||
end
|
||||
fuel_time = 0
|
||||
end
|
||||
|
||||
elapsed = 0
|
||||
end
|
||||
|
||||
if fuel and fuel_totaltime > fuel.time then
|
||||
fuel_totaltime = fuel.time
|
||||
end
|
||||
if srclist[1]:is_empty() then
|
||||
src_time = 0
|
||||
end
|
||||
|
||||
--
|
||||
-- Update formspec, infotext and node
|
||||
--
|
||||
local formspec = inactive_formspec(pos, meta)
|
||||
local item_state
|
||||
local item_percent = 0
|
||||
if cookable then
|
||||
item_percent = math.floor(src_time / cooked.time * 100)
|
||||
if item_percent > 100 then
|
||||
item_state = DS("100% (output full)")
|
||||
else
|
||||
item_state = DS("@1%", item_percent)
|
||||
end
|
||||
else
|
||||
if srclist[1]:is_empty() then
|
||||
item_state = DS("Empty")
|
||||
else
|
||||
item_state = DS("Not cookable")
|
||||
end
|
||||
end
|
||||
|
||||
local fuel_state = DS("Empty")
|
||||
local active = DS("Furnace inactive")
|
||||
local result = false
|
||||
|
||||
if fuel_totaltime ~= 0 then
|
||||
active = DS("Furnace active")
|
||||
local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100)
|
||||
fuel_state = DS("@1%", fuel_percent)
|
||||
formspec = active_formspec(fuel_percent, item_percent, pos, meta)
|
||||
swap_node(pos, "default:furnace_active")
|
||||
-- make sure timer restarts automatically
|
||||
result = true
|
||||
else
|
||||
if not fuellist[1]:is_empty() then
|
||||
fuel_state = DS("@1%", "0")
|
||||
end
|
||||
swap_node(pos, "default:furnace")
|
||||
-- stop timer on the inactive furnace
|
||||
minetest.get_node_timer(pos):stop()
|
||||
end
|
||||
|
||||
local infotext = active.." "..DS("(Item: @1; Fuel: @2)", item_state, fuel_state)
|
||||
|
||||
--
|
||||
-- Set meta values
|
||||
--
|
||||
meta:set_float("fuel_totaltime", fuel_totaltime)
|
||||
meta:set_float("fuel_time", fuel_time)
|
||||
meta:set_float("src_time", src_time)
|
||||
meta:set_string("formspec", formspec)
|
||||
meta:set_string("infotext", infotext)
|
||||
|
||||
return result
|
||||
end
|
||||
local groups = def.groups
|
||||
groups["tubedevice"] = 1
|
||||
groups["tubedevice_receiver"] = 1
|
||||
local groups_active = table.copy(groups)
|
||||
groups_active["not_in_creative_inventory"] = 1
|
||||
|
||||
--
|
||||
-- Node definitions
|
||||
--
|
||||
|
||||
minetest.register_node(":default:furnace", {
|
||||
description = DS("Furnace"),
|
||||
local override = {
|
||||
tiles = {
|
||||
"default_furnace_top.png"..tube_entry,
|
||||
"default_furnace_bottom.png"..tube_entry,
|
||||
@ -283,7 +31,7 @@ minetest.register_node(":default:furnace", {
|
||||
"default_furnace_side.png"..tube_entry,
|
||||
"default_furnace_front.png"
|
||||
},
|
||||
groups = {cracky = 2, tubedevice = 1, tubedevice_receiver = 1},
|
||||
groups = groups,
|
||||
tube = {
|
||||
insert_object = function(pos, node, stack, direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
@ -311,59 +59,15 @@ minetest.register_node(":default:furnace", {
|
||||
end
|
||||
end,
|
||||
input_inventory = "dst",
|
||||
connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1}
|
||||
connect_sides = {left = 1, right = 1, back = 1, bottom = 1, top = 1}
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
legacy_facedir_simple = true,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
|
||||
can_dig = can_dig,
|
||||
|
||||
on_timer = furnace_node_timer,
|
||||
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec", inactive_formspec(pos, meta))
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size('src', 1)
|
||||
inv:set_size('fuel', 1)
|
||||
inv:set_size('dst', 4)
|
||||
end,
|
||||
|
||||
on_metadata_inventory_move = function(pos)
|
||||
minetest.get_node_timer(pos):start(1.0)
|
||||
end,
|
||||
on_metadata_inventory_put = function(pos)
|
||||
-- start timer function, it will sort out whether furnace can burn or not.
|
||||
minetest.get_node_timer(pos):start(1.0)
|
||||
end,
|
||||
on_blast = function(pos)
|
||||
local drops = {}
|
||||
default.get_inventory_drops(pos, "src", drops)
|
||||
default.get_inventory_drops(pos, "fuel", drops)
|
||||
default.get_inventory_drops(pos, "dst", drops)
|
||||
drops[#drops+1] = "default:furnace"
|
||||
minetest.remove_node(pos)
|
||||
return drops
|
||||
end,
|
||||
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
||||
allow_metadata_inventory_move = allow_metadata_inventory_move,
|
||||
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
if not pipeworks.may_configure(pos, sender) then return end
|
||||
fs_helpers.on_receive_fields(pos, fields)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local formspec = inactive_formspec(pos, meta)
|
||||
meta:set_string("formspec", formspec)
|
||||
end,
|
||||
after_place_node = pipeworks.after_place,
|
||||
after_dig_node = pipeworks.after_dig,
|
||||
on_rotate = pipeworks.on_rotate
|
||||
})
|
||||
}
|
||||
|
||||
minetest.register_node(":default:furnace_active", {
|
||||
description = DS("Furnace"),
|
||||
local override_active = {
|
||||
tiles = {
|
||||
"default_furnace_top.png"..tube_entry,
|
||||
"default_furnace_bottom.png"..tube_entry,
|
||||
@ -381,7 +85,7 @@ minetest.register_node(":default:furnace_active", {
|
||||
},
|
||||
}
|
||||
},
|
||||
groups = {cracky = 2, tubedevice = 1, tubedevice_receiver = 1, not_in_creative_inventory = 1},
|
||||
groups = groups_active,
|
||||
tube = {
|
||||
insert_object = function(pos,node,stack,direction)
|
||||
local meta = minetest.get_meta(pos)
|
||||
@ -402,37 +106,23 @@ minetest.register_node(":default:furnace_active", {
|
||||
if direction.y == 1 then
|
||||
return inv:room_for_item("fuel", stack)
|
||||
else
|
||||
if meta:get_int("split_material_stacks") == 1 then
|
||||
stack = stack:peek_item(1)
|
||||
end
|
||||
return inv:room_for_item("src", stack)
|
||||
end
|
||||
end,
|
||||
input_inventory = "dst",
|
||||
connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1}
|
||||
connect_sides = {left = 1, right = 1, back = 1, bottom = 1, top = 1}
|
||||
},
|
||||
paramtype2 = "facedir",
|
||||
light_source = 8,
|
||||
drop = "default:furnace",
|
||||
legacy_facedir_simple = true,
|
||||
is_ground_content = false,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
on_timer = furnace_node_timer,
|
||||
|
||||
can_dig = can_dig,
|
||||
|
||||
allow_metadata_inventory_put = allow_metadata_inventory_put,
|
||||
allow_metadata_inventory_move = allow_metadata_inventory_move,
|
||||
allow_metadata_inventory_take = allow_metadata_inventory_take,
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
if not pipeworks.may_configure(pos, sender) then return end
|
||||
fs_helpers.on_receive_fields(pos, fields)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local formspec = active_formspec(0, 0, pos, meta)
|
||||
meta:set_string("formspec", formspec)
|
||||
end,
|
||||
after_place_node = pipeworks.after_place,
|
||||
after_dig_node = pipeworks.after_dig,
|
||||
on_rotate = pipeworks.on_rotate
|
||||
})
|
||||
}
|
||||
|
||||
if minetest.get_modpath("default") then
|
||||
minetest.override_item("default:furnace", override)
|
||||
minetest.override_item("default:furnace_active", override_active)
|
||||
elseif minetest.get_modpath("hades_furnaces") then
|
||||
minetest.override_item("hades_furnaces:furnace", override)
|
||||
minetest.override_item("hades_furnaces:furnace_active", override_active)
|
||||
end
|
||||
|
||||
|
390
crafts.lua
390
crafts.lua
@ -1,87 +1,355 @@
|
||||
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:sandstone2",
|
||||
desert_sand = "mcl_core:sand",
|
||||
chest = "mcl_chests:chest_small",
|
||||
steel_ingot = "mcl_core:iron_ingot",
|
||||
gold_ingot = "mcl_core:gold_ingot",
|
||||
mese = "default:mese",
|
||||
mese_crystal = "default:mese_crystal",
|
||||
mese_crystal_fragment = "mesecons:redstone",
|
||||
teleporter = "default:mese",
|
||||
-- Use iron where no equivalent
|
||||
copper_ingot = "mcl_core:iron_ingot",
|
||||
glass = "default: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
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:pipe_1_empty 12",
|
||||
recipe = {
|
||||
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" },
|
||||
{ "", "", "" },
|
||||
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:straight_pipe_empty 3",
|
||||
recipe = {
|
||||
{ "pipeworks:pipe_1_empty", "pipeworks:pipe_1_empty", "pipeworks:pipe_1_empty" },
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:spigot 3",
|
||||
recipe = {
|
||||
{ "pipeworks:pipe_1_empty", "" },
|
||||
{ "", "pipeworks:pipe_1_empty" },
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:entry_panel_empty 2",
|
||||
output = "pipeworks:pipe_1_empty 12",
|
||||
recipe = {
|
||||
{ "", "default:steel_ingot", "" },
|
||||
{ "", "pipeworks:pipe_1_empty", "" },
|
||||
{ "", "default:steel_ingot", "" },
|
||||
{ materials.steel_ingot, materials.steel_ingot, materials.steel_ingot },
|
||||
{ "", "", "" },
|
||||
{ materials.steel_ingot, materials.steel_ingot, materials.steel_ingot }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:straight_pipe_empty 3",
|
||||
recipe = {
|
||||
{ "pipeworks:pipe_1_empty", "pipeworks:pipe_1_empty", "pipeworks:pipe_1_empty" },
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:spigot 3",
|
||||
recipe = {
|
||||
{ "pipeworks:pipe_1_empty", "" },
|
||||
{ "", "pipeworks:pipe_1_empty" },
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:entry_panel_empty 2",
|
||||
recipe = {
|
||||
{ "", materials.steel_ingot, "" },
|
||||
{ "", "pipeworks:pipe_1_empty", "" },
|
||||
{ "", materials.steel_ingot, "" },
|
||||
},
|
||||
})
|
||||
|
||||
-- Various ancillary pipe devices
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:pump_off 2",
|
||||
recipe = {
|
||||
{ "default:stone", "default:steel_ingot", "default:stone" },
|
||||
{ "default:copper_ingot", "default:mese_crystal_fragment", "default:copper_ingot" },
|
||||
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
|
||||
},
|
||||
output = "pipeworks:pump_off 2",
|
||||
recipe = {
|
||||
{ materials.stone, materials.steel_ingot, materials.stone },
|
||||
{ materials.copper_ingot, materials.mese_crystal_fragment, materials.copper_ingot },
|
||||
{ materials.steel_ingot, materials.steel_ingot, materials.steel_ingot }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:valve_off_empty 2",
|
||||
recipe = {
|
||||
{ "", "group:stick", "" },
|
||||
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" },
|
||||
{ "", "default:steel_ingot", "" }
|
||||
},
|
||||
output = "pipeworks:valve_off_empty 2",
|
||||
recipe = {
|
||||
{ "", "group:stick", "" },
|
||||
{ materials.steel_ingot, materials.steel_ingot, materials.steel_ingot },
|
||||
{ "", materials.steel_ingot, "" }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:storage_tank_0 2",
|
||||
recipe = {
|
||||
{ "", "default:steel_ingot", "default:steel_ingot" },
|
||||
{ "default:steel_ingot", "default:glass", "default:steel_ingot" },
|
||||
{ "default:steel_ingot", "default:steel_ingot", "" }
|
||||
},
|
||||
output = "pipeworks:storage_tank_0 2",
|
||||
recipe = {
|
||||
{ "", materials.steel_ingot, materials.steel_ingot },
|
||||
{ materials.steel_ingot, materials.glass, materials.steel_ingot },
|
||||
{ materials.steel_ingot, materials.steel_ingot, "" }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:grating 2",
|
||||
recipe = {
|
||||
{ "default:steel_ingot", "", "default:steel_ingot" },
|
||||
{ "", "pipeworks:pipe_1_empty", "" },
|
||||
{ "default:steel_ingot", "", "default:steel_ingot" }
|
||||
},
|
||||
output = "pipeworks:grating 2",
|
||||
recipe = {
|
||||
{ materials.steel_ingot, "", materials.steel_ingot },
|
||||
{ "", "pipeworks:pipe_1_empty", "" },
|
||||
{ materials.steel_ingot, "", materials.steel_ingot }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:flow_sensor_empty 2",
|
||||
recipe = {
|
||||
{ "pipeworks:pipe_1_empty", "mesecons:mesecon", "pipeworks:pipe_1_empty" },
|
||||
},
|
||||
output = "pipeworks:flow_sensor_empty 2",
|
||||
recipe = {
|
||||
{ "pipeworks:pipe_1_empty", "mesecons:mesecon", "pipeworks:pipe_1_empty" },
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:fountainhead 2",
|
||||
recipe = {
|
||||
{ "pipeworks:pipe_1_empty" },
|
||||
{ "pipeworks:pipe_1_empty" }
|
||||
},
|
||||
output = "pipeworks:fountainhead 2",
|
||||
recipe = {
|
||||
{ "pipeworks:pipe_1_empty" },
|
||||
{ "pipeworks:pipe_1_empty" }
|
||||
},
|
||||
})
|
||||
|
||||
-- injectors
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:filter 2",
|
||||
recipe = {
|
||||
{ materials.steel_ingot, materials.steel_ingot, "basic_materials:plastic_sheet" },
|
||||
{ "group:stick", materials.mese_crystal, "basic_materials:plastic_sheet" },
|
||||
{ materials.steel_ingot, materials.steel_ingot, "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:mese_filter 2",
|
||||
recipe = {
|
||||
{ materials.steel_ingot, materials.steel_ingot, "basic_materials:plastic_sheet" },
|
||||
{ "group:stick", materials.mese, "basic_materials:plastic_sheet" },
|
||||
{ materials.steel_ingot, materials.steel_ingot, "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
|
||||
if minetest.get_modpath("digilines") then
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:digiline_filter 2",
|
||||
recipe = {
|
||||
{ materials.steel_ingot, materials.steel_ingot, "basic_materials:plastic_sheet" },
|
||||
{ "group:stick", "digilines:wire_std_00000000", "basic_materials:plastic_sheet" },
|
||||
{ materials.steel_ingot, materials.steel_ingot, "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
-- other
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:autocrafter 2",
|
||||
recipe = {
|
||||
{ materials.steel_ingot, materials.mese_crystal, materials.steel_ingot },
|
||||
{ "basic_materials:plastic_sheet", materials.steel_ingot, "basic_materials:plastic_sheet" },
|
||||
{ materials.steel_ingot, materials.mese_crystal, materials.steel_ingot }
|
||||
},
|
||||
})
|
||||
|
||||
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 = {
|
||||
{ "", materials.steel_ingot, "" },
|
||||
{ "", "pipeworks:tube_1", "" },
|
||||
{ "", materials.steel_ingot, "" }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "pipeworks:trashcan",
|
||||
recipe = {
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{ materials.steel_ingot, "", materials.steel_ingot },
|
||||
{ materials.steel_ingot, materials.steel_ingot, materials.steel_ingot },
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:teleport_tube_1 2",
|
||||
recipe = {
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{ materials.desert_stone, materials.teleporter, materials.desert_stone },
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
|
||||
if pipeworks.enable_priority_tube then
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:priority_tube_1 6",
|
||||
recipe = {
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{ materials.gold_ingot, "", materials.gold_ingot },
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
if pipeworks.enable_accelerator_tube then
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:accelerator_tube_1 2",
|
||||
recipe = {
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{ materials.mese_crystal_fragment, materials.steel_ingot, materials.mese_crystal_fragment },
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
if pipeworks.enable_crossing_tube then
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:crossing_tube_1 5",
|
||||
recipe = {
|
||||
{ "", "pipeworks:tube_1", "" },
|
||||
{ "pipeworks:tube_1", "pipeworks:tube_1", "pipeworks:tube_1" },
|
||||
{ "", "pipeworks:tube_1", "" }
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
if pipeworks.enable_one_way_tube then
|
||||
minetest.register_craft({
|
||||
output = "pipeworks:one_way_tube 2",
|
||||
recipe = {
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{ "group:stick", materials.mese_crystal, "basic_materials:plastic_sheet" },
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
if pipeworks.enable_mese_tube then
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:mese_tube_000000 2",
|
||||
recipe = {
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{ "", materials.mese_crystal, "" },
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
type = "shapeless",
|
||||
output = "pipeworks:mese_tube_000000",
|
||||
recipe = {
|
||||
"pipeworks:tube_1",
|
||||
materials.mese_crystal_fragment,
|
||||
materials.mese_crystal_fragment,
|
||||
materials.mese_crystal_fragment,
|
||||
materials.mese_crystal_fragment,
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
if pipeworks.enable_mese_sand_tube then
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:mese_sand_tube_1 2",
|
||||
recipe = {
|
||||
{"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{"group:sand", materials.mese_crystal, "group:sand" },
|
||||
{"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
type = "shapeless",
|
||||
output = "pipeworks:mese_sand_tube_1",
|
||||
recipe = {
|
||||
"pipeworks:sand_tube_1",
|
||||
materials.mese_crystal_fragment,
|
||||
materials.mese_crystal_fragment,
|
||||
materials.mese_crystal_fragment,
|
||||
materials.mese_crystal_fragment,
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
if pipeworks.enable_deployer then
|
||||
minetest.register_craft({
|
||||
output = "pipeworks:deployer_off",
|
||||
recipe = {
|
||||
{ "group:wood", materials.chest, "group:wood" },
|
||||
{ materials.stone, "mesecons:piston", materials.stone },
|
||||
{ materials.stone, "mesecons:mesecon", materials.stone },
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
if pipeworks.enable_dispenser then
|
||||
minetest.register_craft({
|
||||
output = "pipeworks:dispenser_off",
|
||||
recipe = {
|
||||
{ materials.desert_sand, materials.chest, materials.desert_sand },
|
||||
{ materials.stone, "mesecons:piston", materials.stone },
|
||||
{ materials.stone, "mesecons:mesecon", materials.stone },
|
||||
}
|
||||
})
|
||||
end
|
||||
|
||||
if pipeworks.enable_node_breaker then
|
||||
minetest.register_craft({
|
||||
output = "pipeworks:nodebreaker_off",
|
||||
recipe = {
|
||||
{ "basic_materials:gear_steel", "basic_materials:gear_steel", "basic_materials:gear_steel" },
|
||||
{ materials.stone, "mesecons:piston", materials.stone },
|
||||
{ "group:wood", "mesecons:mesecon", "group:wood" },
|
||||
}
|
||||
})
|
||||
end
|
||||
|
@ -1,20 +1,24 @@
|
||||
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 = {
|
||||
"default_steel_block.png", "default_steel_block.png",
|
||||
"default_steel_block.png", "default_steel_block.png",
|
||||
"default_steel_block.png^pipeworks_tube_connection_metallic.png",
|
||||
"default_steel_block.png^pipeworks_tube_connection_metallic.png",
|
||||
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},
|
||||
groups = {cracky=1, oddly_breakable_by_hand = 1, tubedevice = 1, dig_glass = 2},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_stone_defaults",
|
||||
},
|
||||
tube = {
|
||||
connect_sides = {front = 1, back = 1,},
|
||||
priority = 50,
|
||||
@ -28,15 +32,7 @@ minetest.register_node("pipeworks:steel_block_embedded_tube", {
|
||||
after_dig_node = pipeworks.after_dig,
|
||||
on_rotate = pipeworks.on_rotate,
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:steel_block_embedded_tube 1",
|
||||
recipe = {
|
||||
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" },
|
||||
{ "default:steel_ingot", "pipeworks:tube_1", "default:steel_ingot" },
|
||||
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }
|
||||
},
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:steel_block_embedded_tube"
|
||||
|
||||
local pane_box = {
|
||||
type = "fixed",
|
||||
@ -45,24 +41,32 @@ local pane_box = {
|
||||
{ -8/16, -8/16, -1/16, 8/16, 8/16, 1/16 } -- pane
|
||||
}
|
||||
}
|
||||
|
||||
local texture_alpha_mode = minetest.features.use_texture_alpha_string_modes
|
||||
and "clip" or true
|
||||
|
||||
minetest.register_node("pipeworks:steel_pane_embedded_tube", {
|
||||
drawtype = "nodebox",
|
||||
description = S("Airtight panel embedded tube"),
|
||||
tiles = {
|
||||
"pipeworks_pane_embedded_tube_sides.png^[transformR90",
|
||||
"pipeworks_pane_embedded_tube_sides.png^[transformR90",
|
||||
"pipeworks_pane_embedded_tube_sides.png",
|
||||
"pipeworks_pane_embedded_tube_sides.png",
|
||||
"pipeworks_pane_embedded_tube_ends.png", "pipeworks_pane_embedded_tube_ends.png",
|
||||
},
|
||||
pipeworks.make_tube_tile("pipeworks_pane_embedded_tube_sides.png^[transformR90"),
|
||||
pipeworks.make_tube_tile("pipeworks_pane_embedded_tube_sides.png^[transformR90"),
|
||||
pipeworks.make_tube_tile("pipeworks_pane_embedded_tube_sides.png"),
|
||||
pipeworks.make_tube_tile("pipeworks_pane_embedded_tube_sides.png"),
|
||||
pipeworks.make_tube_tile("pipeworks_pane_embedded_tube_ends.png"),
|
||||
pipeworks.make_tube_tile("pipeworks_pane_embedded_tube_ends.png"),
|
||||
},
|
||||
use_texture_alpha = texture_alpha_mode,
|
||||
node_box = pane_box,
|
||||
selection_box = pane_box,
|
||||
collision_box = pane_box,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = {cracky=1, oddly_breakable_by_hand = 1, tubedevice = 1},
|
||||
groups = {cracky=1, oddly_breakable_by_hand = 1, tubedevice = 1, dig_glass = 2},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_stone_defaults",
|
||||
},
|
||||
tube = {
|
||||
connect_sides = {front = 1, back = 1,},
|
||||
priority = 50,
|
||||
@ -76,12 +80,4 @@ minetest.register_node("pipeworks:steel_pane_embedded_tube", {
|
||||
after_dig_node = pipeworks.after_dig,
|
||||
on_rotate = pipeworks.on_rotate,
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:steel_pane_embedded_tube 1",
|
||||
recipe = {
|
||||
{ "", "default:steel_ingot", "" },
|
||||
{ "", "pipeworks:tube_1", "" },
|
||||
{ "", "default:steel_ingot", "" }
|
||||
},
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:steel_pane_embedded_tube"
|
||||
|
@ -27,6 +27,8 @@ local settings = {
|
||||
enable_cyclic_mode = true,
|
||||
drop_on_routing_fail = false,
|
||||
delete_item_on_clearobject = true,
|
||||
use_real_entities = true,
|
||||
entity_update_interval = 0,
|
||||
}
|
||||
|
||||
pipeworks.toggles = {}
|
||||
@ -62,10 +64,9 @@ pipeworks.toggles.finite_water = nil
|
||||
for name, value in pairs(settings) do
|
||||
local setting_type = type(value)
|
||||
if setting_type == "boolean" then
|
||||
pipeworks[name] = minetest.settings:get_bool(prefix..name)
|
||||
if pipeworks[name] == nil then
|
||||
pipeworks[name] = value
|
||||
end
|
||||
pipeworks[name] = minetest.settings:get_bool(prefix..name, value)
|
||||
elseif setting_type == "number" then
|
||||
pipeworks[name] = tonumber(minetest.settings:get(prefix..name) or value)
|
||||
else
|
||||
pipeworks[name] = value
|
||||
end
|
||||
|
158
devices.lua
158
devices.lua
@ -1,6 +1,8 @@
|
||||
local S = minetest.get_translator("pipeworks")
|
||||
local new_flow_logic_register = pipeworks.flowables.register
|
||||
|
||||
local texture_alpha_mode = minetest.features.use_texture_alpha_string_modes
|
||||
|
||||
local polys = ""
|
||||
if pipeworks.enable_lowpoly then polys = "_lowpoly" end
|
||||
|
||||
@ -10,7 +12,7 @@ function pipeworks.fix_after_rotation(pos, node, user, mode, new_param2)
|
||||
|
||||
if string.find(node.name, "spigot") then new_param2 = new_param2 % 4 end
|
||||
|
||||
newnode = string.gsub(node.name, "_on", "_off")
|
||||
local newnode = string.gsub(node.name, "_on", "_off")
|
||||
minetest.swap_node(pos, { name = newnode, param2 = new_param2 })
|
||||
pipeworks.scan_for_pipe_objects(pos)
|
||||
|
||||
@ -20,7 +22,7 @@ end
|
||||
function pipeworks.rotate_on_place(itemstack, placer, pointed_thing)
|
||||
|
||||
local playername = placer:get_player_name()
|
||||
if not minetest.is_protected(pointed_thing.under, playername)
|
||||
if not minetest.is_protected(pointed_thing.under, playername)
|
||||
and not minetest.is_protected(pointed_thing.above, playername) then
|
||||
|
||||
local node = minetest.get_node(pointed_thing.under)
|
||||
@ -28,7 +30,9 @@ function pipeworks.rotate_on_place(itemstack, placer, pointed_thing)
|
||||
if (not placer:get_player_control().sneak)
|
||||
and minetest.registered_nodes[node.name]
|
||||
and minetest.registered_nodes[node.name].on_rightclick then
|
||||
minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack)
|
||||
minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under,
|
||||
node, placer, itemstack, pointed_thing)
|
||||
|
||||
else
|
||||
|
||||
local pitch = placer:get_look_pitch()
|
||||
@ -36,9 +40,7 @@ function pipeworks.rotate_on_place(itemstack, placer, pointed_thing)
|
||||
local under = pointed_thing.under
|
||||
local fdir = minetest.dir_to_facedir(placer:get_look_dir())
|
||||
local undernode = minetest.get_node(under)
|
||||
local abovenode = minetest.get_node(above)
|
||||
local uname = undernode.name
|
||||
local aname = abovenode.name
|
||||
local isabove = (above.x == under.x) and (above.z == under.z) and (pitch > 0)
|
||||
local pos1 = above
|
||||
|
||||
@ -105,6 +107,7 @@ if minetest.get_modpath("mesecons") then
|
||||
}
|
||||
end
|
||||
|
||||
--[[
|
||||
local pipes_devicelist = {
|
||||
"pump",
|
||||
"valve",
|
||||
@ -120,18 +123,19 @@ local pipes_devicelist = {
|
||||
"storage_tank_9",
|
||||
"storage_tank_10"
|
||||
}
|
||||
--]]
|
||||
|
||||
-- Now define the nodes.
|
||||
|
||||
local states = { "on", "off" }
|
||||
local dgroups = ""
|
||||
|
||||
for s in ipairs(states) do
|
||||
|
||||
local dgroups
|
||||
if states[s] == "off" then
|
||||
dgroups = {snappy=3, pipe=1}
|
||||
dgroups = {snappy=3, pipe=1, dig_generic = 4}
|
||||
else
|
||||
dgroups = {snappy=3, pipe=1, not_in_creative_inventory=1}
|
||||
dgroups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4}
|
||||
end
|
||||
|
||||
local pumpname = "pipeworks:pump_"..states[s]
|
||||
@ -140,10 +144,13 @@ for s in ipairs(states) do
|
||||
drawtype = "mesh",
|
||||
mesh = "pipeworks_pump"..polys..".obj",
|
||||
tiles = { "pipeworks_pump_"..states[s]..".png" },
|
||||
use_texture_alpha = texture_alpha_mode and "clip" or true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = dgroups,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
pipe_connections = { top = 1 },
|
||||
after_place_node = function(pos)
|
||||
@ -165,7 +172,7 @@ for s in ipairs(states) do
|
||||
local fdir = node.param2
|
||||
minetest.swap_node(pos, { name = "pipeworks:pump_"..states[3-s], param2 = fdir })
|
||||
end,
|
||||
on_rotate = screwdriver.rotate_simple
|
||||
on_rotate = screwdriver and screwdriver.rotate_simple or nil
|
||||
})
|
||||
|
||||
-- FIXME: this currently assumes that pumps can only rotate around the fixed axis pointing Y+.
|
||||
@ -187,15 +194,17 @@ for s in ipairs(states) do
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
type = "fixed",
|
||||
fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 }
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
type = "fixed",
|
||||
fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 }
|
||||
},
|
||||
groups = dgroups,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
on_place = pipeworks.rotate_on_place,
|
||||
after_dig_node = function(pos)
|
||||
@ -222,6 +231,8 @@ for s in ipairs(states) do
|
||||
new_flow_logic_register.directional_horizonal_rotate(nodename_valve_empty, true)
|
||||
end
|
||||
end
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:pump_off"
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:valve_off_empty"
|
||||
|
||||
local nodename_valve_loaded = "pipeworks:valve_on_loaded"
|
||||
minetest.register_node(nodename_valve_loaded, {
|
||||
@ -233,15 +244,17 @@ minetest.register_node(nodename_valve_loaded, {
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
selection_box = {
|
||||
type = "fixed",
|
||||
type = "fixed",
|
||||
fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 }
|
||||
},
|
||||
collision_box = {
|
||||
type = "fixed",
|
||||
type = "fixed",
|
||||
fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 }
|
||||
},
|
||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
on_place = pipeworks.rotate_on_place,
|
||||
after_dig_node = function(pos)
|
||||
@ -282,6 +295,7 @@ minetest.register_node("pipeworks:grating", {
|
||||
"pipeworks_grating_sides.png",
|
||||
"pipeworks_grating_sides.png"
|
||||
},
|
||||
use_texture_alpha = texture_alpha_mode and "clip" or true,
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
@ -289,8 +303,10 @@ minetest.register_node("pipeworks:grating", {
|
||||
},
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
groups = {snappy=3, pipe=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
pipe_connections = { top = 1 },
|
||||
after_place_node = function(pos)
|
||||
@ -301,6 +317,7 @@ minetest.register_node("pipeworks:grating", {
|
||||
end,
|
||||
on_rotate = false
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:grating"
|
||||
|
||||
-- outlet spigot
|
||||
|
||||
@ -313,8 +330,10 @@ minetest.register_node(nodename_spigot_empty, {
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=3, pipe=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
pipe_connections = { left=1, right=1, front=1, back=1,
|
||||
left_param2 = 3, right_param2 = 1, front_param2 = 2, back_param2 = 0 },
|
||||
@ -341,22 +360,17 @@ minetest.register_node(nodename_spigot_loaded, {
|
||||
drawtype = "mesh",
|
||||
mesh = "pipeworks_spigot_pouring"..polys..".obj",
|
||||
tiles = {
|
||||
{
|
||||
name = "default_water_flowing_animated.png",
|
||||
animation = {
|
||||
type = "vertical_frames",
|
||||
aspect_w = 16,
|
||||
aspect_h = 16,
|
||||
length = 0.8,
|
||||
},
|
||||
},
|
||||
minetest.registered_nodes[pipeworks.liquids.water.source].tiles[1],
|
||||
{ name = "pipeworks_spigot.png" }
|
||||
},
|
||||
use_texture_alpha = texture_alpha_mode and "blend" or true,
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
pipe_connections = { left=1, right=1, front=1, back=1,
|
||||
left_param2 = 3, right_param2 = 1, front_param2 = 2, back_param2 = 0 },
|
||||
@ -378,6 +392,8 @@ minetest.register_node(nodename_spigot_loaded, {
|
||||
drop = "pipeworks:spigot",
|
||||
on_rotate = pipeworks.fix_after_rotation
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:spigot"
|
||||
|
||||
-- new flow logic does not currently distinguish between these two visual states.
|
||||
-- register both so existing flowing spigots continue to work (even if the visual doesn't match the spigot's behaviour).
|
||||
new_flow_logic_register.directional_horizonal_rotate(nodename_spigot_empty, false)
|
||||
@ -409,8 +425,10 @@ minetest.register_node(nodename_panel_empty, {
|
||||
tiles = { "pipeworks_entry_panel.png" },
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=3, pipe=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
on_place = pipeworks.rotate_on_place,
|
||||
after_dig_node = function(pos)
|
||||
@ -429,8 +447,10 @@ minetest.register_node(nodename_panel_loaded, {
|
||||
tiles = { "pipeworks_entry_panel.png" },
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
on_place = pipeworks.rotate_on_place,
|
||||
after_dig_node = function(pos)
|
||||
@ -441,6 +461,9 @@ minetest.register_node(nodename_panel_loaded, {
|
||||
drop = "pipeworks:entry_panel_empty",
|
||||
on_rotate = pipeworks.fix_after_rotation
|
||||
})
|
||||
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:entry_panel_empty"
|
||||
|
||||
-- TODO: AFAIK the two panels have no visual difference, so are redundant under new flow logic - alias?
|
||||
new_flow_logic_register.directional_horizonal_rotate(nodename_panel_empty, true)
|
||||
new_flow_logic_register.directional_horizonal_rotate(nodename_panel_loaded, true)
|
||||
@ -456,8 +479,10 @@ minetest.register_node(nodename_sensor_empty, {
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=3, pipe=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
on_place = pipeworks.rotate_on_place,
|
||||
after_dig_node = function(pos)
|
||||
@ -465,7 +490,7 @@ minetest.register_node(nodename_sensor_empty, {
|
||||
end,
|
||||
on_construct = function(pos)
|
||||
if mesecon then
|
||||
mesecon.receptor_off(pos, rules)
|
||||
mesecon.receptor_off(pos, pipeworks.mesecons_rules)
|
||||
end
|
||||
end,
|
||||
selection_box = {
|
||||
@ -495,8 +520,10 @@ minetest.register_node(nodename_sensor_loaded, {
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
on_place = pipeworks.rotate_on_place,
|
||||
after_dig_node = function(pos)
|
||||
@ -504,7 +531,7 @@ minetest.register_node(nodename_sensor_loaded, {
|
||||
end,
|
||||
on_construct = function(pos)
|
||||
if mesecon then
|
||||
mesecon.receptor_on(pos, rules)
|
||||
mesecon.receptor_on(pos, pipeworks.mesecons_rules)
|
||||
end
|
||||
end,
|
||||
selection_box = {
|
||||
@ -525,6 +552,8 @@ minetest.register_node(nodename_sensor_loaded, {
|
||||
mesecons = pipereceptor_on,
|
||||
on_rotate = pipeworks.fix_after_rotation
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:flow_sensor_empty"
|
||||
|
||||
new_flow_logic_register.directional_horizonal_rotate(nodename_sensor_empty, true)
|
||||
new_flow_logic_register.directional_horizonal_rotate(nodename_sensor_loaded, true)
|
||||
-- activate flow sensor at roughly half the pressure pumps drive pipes
|
||||
@ -538,12 +567,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.
|
||||
for fill = 0, 10 do
|
||||
local filldesc=S("empty")
|
||||
local sgroups = {snappy=3, pipe=1, tankfill=fill+1}
|
||||
local sgroups = {snappy=3, pipe=1, tankfill=fill+1, dig_generic = 4}
|
||||
local image = nil
|
||||
|
||||
if fill ~= 0 then
|
||||
filldesc=S("@1% full", 10*fill)
|
||||
sgroups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1}
|
||||
sgroups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1, dig_generic = 4}
|
||||
image = "pipeworks_storage_tank_fittings.png"
|
||||
end
|
||||
|
||||
@ -560,8 +589,10 @@ for fill = 0, 10 do
|
||||
inventory_image = image,
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
drop = "pipeworks:storage_tank_0",
|
||||
pipe_connections = { top = 1, bottom = 1},
|
||||
@ -589,7 +620,9 @@ for fill = 0, 10 do
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = sgroups,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
drop = "pipeworks:storage_tank_0",
|
||||
pipe_connections = { top = 1, bottom = 1},
|
||||
@ -603,6 +636,7 @@ for fill = 0, 10 do
|
||||
on_rotate = false
|
||||
})
|
||||
end
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:storage_tank_0"
|
||||
|
||||
-- fountainhead
|
||||
|
||||
@ -614,8 +648,10 @@ minetest.register_node(nodename_fountain_empty, {
|
||||
tiles = { "pipeworks_fountainhead.png" },
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
groups = {snappy=3, pipe=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
pipe_connections = { bottom = 1 },
|
||||
after_place_node = function(pos)
|
||||
@ -626,7 +662,7 @@ minetest.register_node(nodename_fountain_empty, {
|
||||
end,
|
||||
on_construct = function(pos)
|
||||
if mesecon then
|
||||
mesecon.receptor_on(pos, rules)
|
||||
mesecon.receptor_on(pos, pipeworks.mesecons_rules)
|
||||
end
|
||||
end,
|
||||
selection_box = {
|
||||
@ -639,6 +675,7 @@ minetest.register_node(nodename_fountain_empty, {
|
||||
},
|
||||
on_rotate = false
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:fountainhead"
|
||||
|
||||
local nodename_fountain_loaded = "pipeworks:fountainhead_pouring"
|
||||
minetest.register_node(nodename_fountain_loaded, {
|
||||
@ -648,8 +685,10 @@ minetest.register_node(nodename_fountain_loaded, {
|
||||
tiles = { "pipeworks_fountainhead.png" },
|
||||
sunlight_propagates = true,
|
||||
paramtype = "light",
|
||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
pipe_connections = { bottom = 1 },
|
||||
after_place_node = function(pos)
|
||||
@ -661,7 +700,7 @@ minetest.register_node(nodename_fountain_loaded, {
|
||||
end,
|
||||
on_construct = function(pos)
|
||||
if mesecon then
|
||||
mesecon.receptor_on(pos, rules)
|
||||
mesecon.receptor_on(pos, pipeworks.mesecons_rules)
|
||||
end
|
||||
end,
|
||||
selection_box = {
|
||||
@ -698,8 +737,10 @@ minetest.register_node(nodename_sp_empty, {
|
||||
tiles = { "pipeworks_straight_pipe_empty.png" },
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=3, pipe=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
on_place = pipeworks.rotate_on_place,
|
||||
after_dig_node = function(pos)
|
||||
@ -720,8 +761,10 @@ minetest.register_node(nodename_sp_loaded, {
|
||||
tiles = { "pipeworks_straight_pipe_loaded.png" },
|
||||
paramtype = "light",
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1},
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
groups = {snappy=3, pipe=1, not_in_creative_inventory=1, dig_generic = 4},
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
on_place = pipeworks.rotate_on_place,
|
||||
after_dig_node = function(pos)
|
||||
@ -734,6 +777,7 @@ minetest.register_node(nodename_sp_loaded, {
|
||||
check_for_pole = pipeworks.check_for_vert_pipe,
|
||||
check_for_horiz_pole = pipeworks.check_for_horiz_pipe
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:straight_pipe_empty"
|
||||
|
||||
new_flow_logic_register.directional_horizonal_rotate(nodename_sp_empty, true)
|
||||
new_flow_logic_register.directional_horizonal_rotate(nodename_sp_loaded, true)
|
||||
|
@ -1,10 +1,6 @@
|
||||
local S = minetest.get_translator("pipeworks")
|
||||
local fs_helpers = pipeworks.fs_helpers
|
||||
|
||||
local function delay(x)
|
||||
return (function() return x end)
|
||||
end
|
||||
|
||||
local function set_filter_infotext(data, meta)
|
||||
local infotext = S("@1 Filter-Injector", data.wise_desc)
|
||||
if meta:get_int("slotseq_mode") == 2 then
|
||||
@ -18,37 +14,53 @@ local function set_filter_formspec(data, meta)
|
||||
|
||||
local formspec
|
||||
if data.digiline then
|
||||
formspec = "size[8,2.7]"..
|
||||
"item_image[0,0;1,1;pipeworks:"..data.name.."]"..
|
||||
"label[1,0;"..minetest.formspec_escape(itemname).."]"..
|
||||
"field[0.3,1.5;8.0,1;channel;"..S("Channel")..";${channel}]"..
|
||||
fs_helpers.cycling_button(meta, "button[0,2;4,1", "slotseq_mode",
|
||||
formspec =
|
||||
"size[8.5,3]"..
|
||||
"item_image[0.2,0;1,1;pipeworks:"..data.name.."]"..
|
||||
"label[1.2,0.2;"..minetest.formspec_escape(itemname).."]"..
|
||||
"field[0.5,1.6;4.6,1;channel;"..S("Channel")..";${channel}]"..
|
||||
"button[4.8,1.3;1.5,1;set_channel;"..S("Set").."]"..
|
||||
fs_helpers.cycling_button(meta, "button[0.2,2.3;4.05,1", "slotseq_mode",
|
||||
{S("Sequence slots by Priority"),
|
||||
S("Sequence slots Randomly"),
|
||||
S("Sequence slots by Rotation")})..
|
||||
fs_helpers.cycling_button(meta, "button[4,2;4,1", "exmatch_mode",
|
||||
fs_helpers.cycling_button(meta, "button[4.25,2.3;4.05,1", "exmatch_mode",
|
||||
{S("Exact match - off"),
|
||||
S("Exact match - on")})
|
||||
S("Exact match - on")})..
|
||||
"button_exit[6.3,1.3;2,1;close;"..S("Close").."]"
|
||||
else
|
||||
local exmatch_button = ""
|
||||
if data.stackwise then
|
||||
exmatch_button =
|
||||
fs_helpers.cycling_button(meta, "button[4,3.5;4,1", "exmatch_mode",
|
||||
fs_helpers.cycling_button(meta, "button["..(10.2-(0.22)-4)..",4.5;4,1", "exmatch_mode",
|
||||
{S("Exact match - off"),
|
||||
S("Exact match - on")})
|
||||
end
|
||||
|
||||
formspec = "size[8,8.5]"..
|
||||
"item_image[0,0;1,1;pipeworks:"..data.name.."]"..
|
||||
"label[1,0;"..minetest.formspec_escape(itemname).."]"..
|
||||
"label[0,1;"..S("Prefer item types:").."]"..
|
||||
"list[context;main;0,1.5;8,2;]"..
|
||||
fs_helpers.cycling_button(meta, "button[0,3.5;4,1", "slotseq_mode",
|
||||
local size = "10.2,11"
|
||||
local list_backgrounds = ""
|
||||
if minetest.get_modpath("i3") then
|
||||
list_backgrounds = "style_type[box;colors=#666]"
|
||||
for i=0, 7 do
|
||||
for j=0, 1 do
|
||||
list_backgrounds = list_backgrounds .. "box[".. 0.22+(i*1.25) ..",".. 1.75+(j*1.25) ..";1,1;]"
|
||||
end
|
||||
end
|
||||
end
|
||||
formspec =
|
||||
"formspec_version[2]"..
|
||||
"size["..size.."]"..
|
||||
pipeworks.fs_helpers.get_prepends(size)..
|
||||
"item_image[0.22,0.22;1,1;pipeworks:"..data.name.."]"..
|
||||
"label[1.22,0.72;"..minetest.formspec_escape(itemname).."]"..
|
||||
"label[0.22,1.5;"..S("Prefer item types:").."]"..
|
||||
list_backgrounds..
|
||||
"list[context;main;0.22,1.75;8,2;]"..
|
||||
fs_helpers.cycling_button(meta, "button[0.22,4.5;4,1", "slotseq_mode",
|
||||
{S("Sequence slots by Priority"),
|
||||
S("Sequence slots Randomly"),
|
||||
S("Sequence slots by Rotation")})..
|
||||
exmatch_button..
|
||||
"list[current_player;main;0,4.5;8,4;]" ..
|
||||
pipeworks.fs_helpers.get_inv(6)..
|
||||
"listring[]"
|
||||
end
|
||||
meta:set_string("formspec", formspec)
|
||||
@ -66,8 +78,8 @@ local function punch_filter(data, filtpos, filtnode, msg)
|
||||
local fromnode = minetest.get_node(frompos)
|
||||
if not fromnode then return end
|
||||
local fromdef = minetest.registered_nodes[fromnode.name]
|
||||
if not fromdef then return end
|
||||
local fromtube = fromdef.tube
|
||||
if not fromdef or not fromdef.tube then return end
|
||||
local fromtube = table.copy(fromdef.tube)
|
||||
local input_special_cases = {
|
||||
["technic:mv_electric_furnace"] = "dst",
|
||||
["technic:mv_electric_furnace_active"] = "dst",
|
||||
@ -326,7 +338,8 @@ local function punch_filter(data, filtpos, filtnode, msg)
|
||||
end
|
||||
local pos = vector.add(frompos, vector.multiply(dir, 1.4))
|
||||
local start_pos = vector.add(frompos, dir)
|
||||
local item1 = pipeworks.tube_inject_item(pos, start_pos, dir, item, fakePlayer:get_player_name())
|
||||
pipeworks.tube_inject_item(pos, start_pos, dir, item,
|
||||
fakePlayer:get_player_name())
|
||||
return true -- only fire one item, please
|
||||
end
|
||||
end
|
||||
@ -377,7 +390,9 @@ for _, data in ipairs({
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, mesecon = 2},
|
||||
legacy_facedir_simple = true,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_wood_defaults",
|
||||
},
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
set_filter_formspec(data, meta)
|
||||
@ -428,10 +443,14 @@ for _, data in ipairs({
|
||||
end
|
||||
|
||||
node.on_receive_fields = function(pos, formname, fields, sender)
|
||||
if not pipeworks.may_configure(pos, sender) then return end
|
||||
if (fields.quit and not fields.key_enter_field)
|
||||
or not pipeworks.may_configure(pos, sender) then
|
||||
return
|
||||
end
|
||||
|
||||
fs_helpers.on_receive_fields(pos, fields)
|
||||
|
||||
if fields.channel then
|
||||
if fields.channel and (fields.key_enter_field == "channel" or fields.set_channel) then
|
||||
minetest.get_meta(pos):set_string("channel", fields.channel)
|
||||
end
|
||||
|
||||
@ -475,35 +494,7 @@ for _, data in ipairs({
|
||||
|
||||
|
||||
minetest.register_node("pipeworks:"..data.name, node)
|
||||
end
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:filter 2",
|
||||
recipe = {
|
||||
{ "default:steel_ingot", "default:steel_ingot", "basic_materials:plastic_sheet" },
|
||||
{ "group:stick", "default:mese_crystal", "basic_materials:plastic_sheet" },
|
||||
{ "default:steel_ingot", "default:steel_ingot", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:mese_filter 2",
|
||||
recipe = {
|
||||
{ "default:steel_ingot", "default:steel_ingot", "basic_materials:plastic_sheet" },
|
||||
{ "group:stick", "default:mese", "basic_materials:plastic_sheet" },
|
||||
{ "default:steel_ingot", "default:steel_ingot", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
|
||||
if minetest.get_modpath("digilines") then
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:digiline_filter 2",
|
||||
recipe = {
|
||||
{ "default:steel_ingot", "default:steel_ingot", "basic_materials:plastic_sheet" },
|
||||
{ "group:stick", "digilines:wire_std_00000000", "basic_materials:plastic_sheet" },
|
||||
{ "default:steel_ingot", "default:steel_ingot", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:"..data.name
|
||||
end
|
||||
|
||||
--[[
|
||||
|
@ -60,8 +60,8 @@ pipeworks.check_for_inflows = function(pos,node)
|
||||
end
|
||||
end
|
||||
end
|
||||
if newnode then
|
||||
minetest.add_node(pos,{name=newnode, param2 = node.param2})
|
||||
if newnode then
|
||||
minetest.add_node(pos,{name=newnode, param2 = node.param2})
|
||||
minetest.get_meta(pos):set_string("source",minetest.pos_to_string(source))
|
||||
end
|
||||
end
|
||||
@ -75,15 +75,15 @@ pipeworks.check_sources = function(pos,node)
|
||||
newnode = string.gsub(node.name,"loaded","empty")
|
||||
end
|
||||
|
||||
if newnode then
|
||||
minetest.add_node(pos,{name=newnode, param2 = node.param2})
|
||||
if newnode then
|
||||
minetest.add_node(pos,{name=newnode, param2 = node.param2})
|
||||
minetest.get_meta(pos):set_string("source","")
|
||||
end
|
||||
end
|
||||
|
||||
pipeworks.spigot_check = function(pos, node)
|
||||
local belowname = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}).name
|
||||
if belowname and (belowname == "air" or belowname == "default:water_flowing" or belowname == "default:water_source") then
|
||||
if belowname and (belowname == "air" or belowname == pipeworks.liquids.water.flowing or belowname == pipeworks.liquids.water.source) then
|
||||
local spigotname = minetest.get_node(pos).name
|
||||
local fdir=node.param2 % 4
|
||||
local check = {
|
||||
@ -96,14 +96,14 @@ pipeworks.spigot_check = function(pos, node)
|
||||
if near_node and string.find(near_node.name, "_loaded") then
|
||||
if spigotname and spigotname == "pipeworks:spigot" then
|
||||
minetest.add_node(pos,{name = "pipeworks:spigot_pouring", param2 = fdir})
|
||||
if finitewater or belowname ~= "default:water_source" then
|
||||
minetest.add_node({x=pos.x,y=pos.y-1,z=pos.z},{name = "default:water_source"})
|
||||
if finitewater or belowname ~= pipeworks.liquids.water.source then
|
||||
minetest.add_node({x=pos.x,y=pos.y-1,z=pos.z},{name = pipeworks.liquids.water.source})
|
||||
end
|
||||
end
|
||||
else
|
||||
if spigotname == "pipeworks:spigot_pouring" then
|
||||
minetest.add_node({x=pos.x,y=pos.y,z=pos.z},{name = "pipeworks:spigot", param2 = fdir})
|
||||
if belowname == "default:water_source" and not finitewater then
|
||||
if belowname == pipeworks.liquids.water.source and not finitewater then
|
||||
minetest.remove_node({x=pos.x,y=pos.y-1,z=pos.z})
|
||||
end
|
||||
end
|
||||
@ -113,20 +113,20 @@ end
|
||||
|
||||
pipeworks.fountainhead_check = function(pos, node)
|
||||
local abovename = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name
|
||||
if abovename and (abovename == "air" or abovename == "default:water_flowing" or abovename == "default:water_source") then
|
||||
if abovename and (abovename == "air" or abovename == pipeworks.liquids.water.flowing or abovename == pipeworks.liquids.water.source) then
|
||||
local fountainhead_name = minetest.get_node(pos).name
|
||||
local near_node = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z})
|
||||
if near_node and string.find(near_node.name, "_loaded") then
|
||||
if fountainhead_name and fountainhead_name == "pipeworks:fountainhead" then
|
||||
minetest.add_node(pos,{name = "pipeworks:fountainhead_pouring"})
|
||||
if finitewater or abovename ~= "default:water_source" then
|
||||
minetest.add_node({x=pos.x,y=pos.y+1,z=pos.z},{name = "default:water_source"})
|
||||
if finitewater or abovename ~= pipeworks.liquids.water.source then
|
||||
minetest.add_node({x=pos.x,y=pos.y+1,z=pos.z},{name = pipeworks.liquids.water.source})
|
||||
end
|
||||
end
|
||||
else
|
||||
if fountainhead_name == "pipeworks:fountainhead_pouring" then
|
||||
minetest.add_node({x=pos.x,y=pos.y,z=pos.z},{name = "pipeworks:fountainhead"})
|
||||
if abovename == "default:water_source" and not finitewater then
|
||||
if abovename == pipeworks.liquids.water.source and not finitewater then
|
||||
minetest.remove_node({x=pos.x,y=pos.y+1,z=pos.z})
|
||||
end
|
||||
end
|
||||
|
61
init.lua
61
init.lua
@ -5,13 +5,22 @@
|
||||
--
|
||||
|
||||
pipeworks = {}
|
||||
|
||||
local DEBUG = false
|
||||
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
|
||||
}
|
||||
|
||||
dofile(pipeworks.modpath.."/default_settings.lua")
|
||||
-- Read the external config file if it exists.
|
||||
local worldsettingspath = pipeworks.worldpath.."/pipeworks_settings.txt"
|
||||
@ -23,6 +32,9 @@ end
|
||||
if pipeworks.toggles.pipe_mode == "pressure" then
|
||||
minetest.log("warning", "pipeworks pressure logic mode comes with caveats and differences in behaviour, you have been warned!")
|
||||
end
|
||||
if pipeworks.entity_update_interval >= 0.2 and pipeworks.enable_accelerator_tube then
|
||||
minetest.log("warning", "pipeworks accelerator tubes will not entirely work with an entity update interval 0.2 or above.")
|
||||
end
|
||||
|
||||
-- Random variables
|
||||
|
||||
@ -41,7 +53,8 @@ pipeworks.rules_all = {{x=0, y=0, z=1},{x=0, y=0, z=-1},{x=1, y=0, z=0},{x=-1, y
|
||||
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 = "default_water.png"
|
||||
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"}
|
||||
@ -59,6 +72,29 @@ function pipeworks.fix_image_names(table, replacement)
|
||||
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)
|
||||
@ -92,7 +128,7 @@ function pipeworks.replace_name(tbl,tr,name)
|
||||
end
|
||||
|
||||
pipeworks.logger = function(msg)
|
||||
print("[pipeworks] "..msg)
|
||||
minetest.log("action", "[pipeworks] "..msg)
|
||||
end
|
||||
|
||||
-------------------------------------------
|
||||
@ -114,7 +150,6 @@ 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.."/crafts.lua")
|
||||
dofile(pipeworks.modpath.."/tube_registration.lua")
|
||||
dofile(pipeworks.modpath.."/routing_tubes.lua")
|
||||
dofile(pipeworks.modpath.."/sorting_tubes.lua")
|
||||
@ -138,7 +173,7 @@ 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
|
||||
if pipeworks.enable_redefines 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-furnaces.lua")
|
||||
end
|
||||
@ -148,6 +183,20 @@ if pipeworks.enable_lua_tube and
|
||||
dofile(pipeworks.modpath.."/lua_tube.lua")
|
||||
end
|
||||
|
||||
dofile(pipeworks.modpath.."/crafts.lua")
|
||||
|
||||
minetest.register_alias("pipeworks:pipe", "pipeworks:pipe_110000_empty")
|
||||
|
||||
-- Unified Inventory categories integration
|
||||
|
||||
if minetest.global_exists("unified_inventory") and unified_inventory.registered_categories then
|
||||
if not unified_inventory.registered_categories["automation"] then
|
||||
unified_inventory.register_category("automation", {
|
||||
symbol = "pipeworks:lua_tube000000",
|
||||
label = "Automation components"
|
||||
})
|
||||
end
|
||||
unified_inventory.add_category_items("automation", pipeworks.ui_cat_tube_list)
|
||||
end
|
||||
|
||||
minetest.log("info", "Pipeworks loaded!")
|
||||
|
@ -1,5 +1,5 @@
|
||||
local luaentity = pipeworks.luaentity
|
||||
local enable_max_limit = minetest.settings:get("pipeworks_enable_items_per_tube_limit")
|
||||
local enable_max_limit = minetest.settings:get_bool("pipeworks_enable_items_per_tube_limit")
|
||||
local max_tube_limit = tonumber(minetest.settings:get("pipeworks_max_items_per_tube")) or 30
|
||||
if enable_max_limit == nil then enable_max_limit = true end
|
||||
|
||||
@ -42,7 +42,7 @@ minetest.register_globalstep(function(dtime)
|
||||
return
|
||||
end
|
||||
tube_item_count = {}
|
||||
for id, entity in pairs(luaentity.entities) do
|
||||
for _, entity in pairs(luaentity.entities) do
|
||||
if entity.name == "pipeworks:tubed_item" then
|
||||
local h = minetest.hash_node_position(vector.round(entity._pos))
|
||||
tube_item_count[h] = (tube_item_count[h] or 0) + 1
|
||||
@ -55,15 +55,22 @@ end)
|
||||
-- tube overload mechanism:
|
||||
-- when the tube's item count (tracked in the above tube_item_count table)
|
||||
-- exceeds the limit configured per tube, replace it with a broken one.
|
||||
|
||||
function pipeworks.break_tube(pos)
|
||||
local node = minetest.get_node(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("the_tube_was", minetest.serialize(node))
|
||||
minetest.swap_node(pos, {name = "pipeworks:broken_tube_1"})
|
||||
pipeworks.scan_for_tube_objects(pos)
|
||||
end
|
||||
|
||||
local crunch_tube = function(pos, cnode, cmeta)
|
||||
if enable_max_limit then
|
||||
local h = minetest.hash_node_position(pos)
|
||||
local itemcount = tube_item_count[h] or 0
|
||||
if itemcount > max_tube_limit then
|
||||
cmeta:set_string("the_tube_was", minetest.serialize(cnode))
|
||||
pipeworks.logger("Warning - a tube at "..minetest.pos_to_string(pos).." broke due to too many items ("..itemcount..")")
|
||||
minetest.swap_node(pos, {name = "pipeworks:broken_tube_1"})
|
||||
pipeworks.scan_for_tube_objects(pos)
|
||||
pipeworks.break_tube(pos)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -194,6 +201,7 @@ minetest.register_entity("pipeworks:tubed_item", {
|
||||
|
||||
from_data = function(self, itemstring)
|
||||
local stack = ItemStack(itemstring)
|
||||
--[[
|
||||
local itemtable = stack:to_table()
|
||||
local itemname = nil
|
||||
if itemtable then
|
||||
@ -205,6 +213,7 @@ minetest.register_entity("pipeworks:tubed_item", {
|
||||
item_texture = minetest.registered_items[itemname].inventory_image
|
||||
item_type = minetest.registered_items[itemname].type
|
||||
end
|
||||
--]]
|
||||
self.object:set_properties({
|
||||
is_visible = true,
|
||||
textures = {stack:get_name()}
|
||||
@ -302,8 +311,6 @@ luaentity.register_entity("pipeworks:tubed_item", {
|
||||
self:set_pos(pos)
|
||||
end
|
||||
|
||||
local stack = ItemStack(self.itemstring)
|
||||
|
||||
local velocity = self:get_velocity()
|
||||
|
||||
local moved = false
|
||||
@ -320,9 +327,15 @@ luaentity.register_entity("pipeworks:tubed_item", {
|
||||
moved = true
|
||||
end
|
||||
|
||||
if not moved then
|
||||
return
|
||||
end
|
||||
|
||||
local stack = ItemStack(self.itemstring)
|
||||
|
||||
pipeworks.load_position(self.start_pos)
|
||||
local node = minetest.get_node(self.start_pos)
|
||||
if moved and minetest.get_item_group(node.name, "tubedevice_receiver") == 1 then
|
||||
if minetest.get_item_group(node.name, "tubedevice_receiver") == 1 then
|
||||
local leftover
|
||||
if minetest.registered_nodes[node.name].tube and minetest.registered_nodes[node.name].tube.insert_object then
|
||||
leftover = minetest.registered_nodes[node.name].tube.insert_object(self.start_pos, node, stack, vel, self.owner)
|
||||
@ -340,45 +353,43 @@ luaentity.register_entity("pipeworks:tubed_item", {
|
||||
return
|
||||
end
|
||||
|
||||
if moved then
|
||||
local found_next, new_velocity, multimode = go_next(self.start_pos, velocity, stack, self.owner) -- todo: color
|
||||
local rev_vel = vector.multiply(velocity, -1)
|
||||
local rev_dir = vector.direction(self.start_pos,vector.add(self.start_pos,rev_vel))
|
||||
local rev_node = minetest.get_node(vector.round(vector.add(self.start_pos,rev_dir)))
|
||||
local tube_present = minetest.get_item_group(rev_node.name,"tubedevice") == 1
|
||||
if not found_next then
|
||||
if pipeworks.drop_on_routing_fail or not tube_present or
|
||||
minetest.get_item_group(rev_node.name,"tube") ~= 1 then
|
||||
-- Using add_item instead of item_drop since this makes pipeworks backward
|
||||
-- compatible with Minetest 0.4.13.
|
||||
-- Using item_drop here makes Minetest 0.4.13 crash.
|
||||
local dropped_item = minetest.add_item(self.start_pos, stack)
|
||||
if dropped_item then
|
||||
dropped_item:set_velocity(vector.multiply(velocity, 5))
|
||||
self:remove()
|
||||
end
|
||||
return
|
||||
else
|
||||
velocity = vector.multiply(velocity, -1)
|
||||
self:set_pos(vector.subtract(self.start_pos, vector.multiply(vel, moved_by - 1)))
|
||||
self:set_velocity(velocity)
|
||||
local found_next, new_velocity, multimode = go_next(self.start_pos, velocity, stack, self.owner) -- todo: color
|
||||
local rev_vel = vector.multiply(velocity, -1)
|
||||
local rev_dir = vector.direction(self.start_pos,vector.add(self.start_pos,rev_vel))
|
||||
local rev_node = minetest.get_node(vector.round(vector.add(self.start_pos,rev_dir)))
|
||||
local tube_present = minetest.get_item_group(rev_node.name,"tubedevice") == 1
|
||||
if not found_next then
|
||||
if pipeworks.drop_on_routing_fail or not tube_present or
|
||||
minetest.get_item_group(rev_node.name,"tube") ~= 1 then
|
||||
-- Using add_item instead of item_drop since this makes pipeworks backward
|
||||
-- compatible with Minetest 0.4.13.
|
||||
-- Using item_drop here makes Minetest 0.4.13 crash.
|
||||
local dropped_item = minetest.add_item(self.start_pos, stack)
|
||||
if dropped_item then
|
||||
dropped_item:set_velocity(vector.multiply(velocity, 5))
|
||||
self:remove()
|
||||
end
|
||||
elseif is_multimode(multimode) then
|
||||
-- create new stacks according to returned data.
|
||||
local s = self.start_pos
|
||||
for _, split in ipairs(multimode) do
|
||||
pipeworks.tube_inject_item(s, s, split.velocity, split.itemstack, self.owner)
|
||||
end
|
||||
-- remove ourself now the splits are sent
|
||||
self:remove()
|
||||
return
|
||||
else
|
||||
velocity = vector.multiply(velocity, -1)
|
||||
self:set_pos(vector.subtract(self.start_pos, vector.multiply(vel, moved_by - 1)))
|
||||
self:set_velocity(velocity)
|
||||
end
|
||||
elseif is_multimode(multimode) then
|
||||
-- create new stacks according to returned data.
|
||||
local s = self.start_pos
|
||||
for _, split in ipairs(multimode) do
|
||||
pipeworks.tube_inject_item(s, s, split.velocity, split.itemstack, self.owner)
|
||||
end
|
||||
-- remove ourself now the splits are sent
|
||||
self:remove()
|
||||
return
|
||||
end
|
||||
|
||||
if new_velocity and not vector.equals(velocity, new_velocity) then
|
||||
local nvelr = math.abs(new_velocity.x + new_velocity.y + new_velocity.z)
|
||||
self:set_pos(vector.add(self.start_pos, vector.multiply(new_velocity, (moved_by - 1) / nvelr)))
|
||||
self:set_velocity(new_velocity)
|
||||
end
|
||||
if new_velocity and not vector.equals(velocity, new_velocity) then
|
||||
local nvelr = math.abs(new_velocity.x + new_velocity.y + new_velocity.z)
|
||||
self:set_pos(vector.add(self.start_pos, vector.multiply(new_velocity, (moved_by - 1) / nvelr)))
|
||||
self:set_velocity(new_velocity)
|
||||
end
|
||||
end
|
||||
})
|
||||
@ -391,7 +402,7 @@ if minetest.get_modpath("mesecons_mvps") then
|
||||
for _, n in ipairs(moved_nodes) do
|
||||
moved[minetest.hash_node_position(n.oldpos)] = vector.subtract(n.pos, n.oldpos)
|
||||
end
|
||||
for id, entity in pairs(luaentity.entities) do
|
||||
for _, entity in pairs(luaentity.entities) do
|
||||
if entity.name == "pipeworks:tubed_item" then
|
||||
local pos = entity:get_pos()
|
||||
local rpos = vector.round(pos)
|
||||
|
10
legacy.lua
10
legacy.lua
@ -1,6 +1,6 @@
|
||||
local S = minetest.get_translator("pipeworks")
|
||||
|
||||
if not minetest.get_modpath("auto_tree_tap") and
|
||||
if not minetest.get_modpath("auto_tree_tap") and
|
||||
minetest.get_modpath("technic") then
|
||||
|
||||
minetest.register_abm({
|
||||
@ -27,7 +27,9 @@ if not minetest.get_modpath("auto_tree_tap") and
|
||||
is_ground_content = true,
|
||||
paramtype2 = "facedir",
|
||||
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1, not_in_creative_inventory=1 },
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_stone_defaults",
|
||||
},
|
||||
tube = {connect_sides={back=1}},
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
@ -38,10 +40,10 @@ if not minetest.get_modpath("auto_tree_tap") and
|
||||
after_place_node = function (pos, placer)
|
||||
pipeworks.scan_for_tube_objects(pos, placer)
|
||||
local placer_pos = placer:get_pos()
|
||||
|
||||
|
||||
--correct for the player's height
|
||||
if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end
|
||||
|
||||
|
||||
--correct for 6d facedir
|
||||
if placer_pos then
|
||||
local dir = {
|
||||
|
@ -3,6 +3,10 @@
|
||||
# License: CC-by-SA 4.0
|
||||
# Author: Louis Royer <4259825-lroyer@users.noreply.gitlab.com>
|
||||
|
||||
## generic interaction
|
||||
Set=Fixer
|
||||
Close=Fermer
|
||||
|
||||
## digilines interfacing
|
||||
Channel=Canal
|
||||
|
||||
@ -86,11 +90,12 @@ Sorting pneumatic tube=Tuyau pneumatique triant
|
||||
|
||||
## teleport tube
|
||||
Receive=Reception
|
||||
channels are public by default=Les canaux sont publics par défaut
|
||||
use <player>:<channel> for fully private channels=Utilisez <joueur>:<canal> pour un canal entièrement privé
|
||||
use <player>;<channel> for private receivers=Utilisez <joueur>;<canal> pour une réception privée
|
||||
Channels are public by default=Les canaux sont publics par défaut
|
||||
Use <player>:<channel> for fully private channels=Utilisez <joueur>:<canal> pour un canal entièrement privé
|
||||
Use <player>;<channel> for private receivers=Utilisez <joueur>;<canal> pour une réception privée
|
||||
Teleporting Pneumatic Tube Segment=Segment de tuyau pneumatique téléporteur
|
||||
unconfigured Teleportation Tube=Tuyau téléporteur non-configuré
|
||||
Teleporting Tube=Tuyau pneumatique téléporteur
|
||||
Unconfigured Teleportation Tube=Tuyau téléporteur non-configuré
|
||||
Sorry, channel '@1' is reserved for exclusive use by @2=Désolé, le canal '@1' est réservé exclusivement à l’utilisateur @2.
|
||||
Sorry, receiving from channel '@1' is reserved for @2=Désolé, la réception depuis le canal '@1' est réservée pour @2.
|
||||
Teleportation Tube @1 on '@2'=Tuyau de téléportation @1 sur '@2'
|
||||
@ -102,7 +107,9 @@ Trash Can=Poubelle
|
||||
Pneumatic tube segment (legacy)=Segment de tuyau pneumatique (obsolète)
|
||||
|
||||
## vacuum tubes
|
||||
Radius=Rayon
|
||||
Vacuuming Pneumatic Tube Segment=Segment de tuyau pneumatique aspirant
|
||||
Adjustable Vacuuming Tube=Tuyau pneumatique aspirant réglable
|
||||
Adjustable Vacuuming Pneumatic Tube Segment=Segment de tuyau pneumatique aspirant réglable
|
||||
Adjustable Vacuuming Pneumatic Tube Segment (@1m)=Segment de tuyau pneumatique aspirant réglable (@1 m)
|
||||
|
||||
|
@ -2,6 +2,10 @@
|
||||
# License: CC-by-SA 4.0
|
||||
# Author: pevernow <3450354617@qq.com>
|
||||
|
||||
## generic interaction
|
||||
Set=
|
||||
Cancel=
|
||||
|
||||
## digilines interfacing
|
||||
Channel=频道
|
||||
|
||||
@ -84,11 +88,12 @@ Sorting pneumatic tube=分类管道
|
||||
|
||||
## teleport tube
|
||||
Receive=接收
|
||||
channels are public by default=频道默认为公开
|
||||
use <player>:<channel> for fully private channels=将<player>:<channel>用于完全私人的频道
|
||||
use <player>;<channel> for private receivers=使用<player>;<channel>作为私人接收器
|
||||
Channels are public by default=频道默认为公开
|
||||
Use <player>:<channel> for fully private channels=将<player>:<channel>用于完全私人的频道
|
||||
Use <player>;<channel> for private receivers=使用<player>;<channel>作为私人接收器
|
||||
Teleporting Pneumatic Tube Segment=传送管道
|
||||
unconfigured Teleportation Tube=未配置的传送管道
|
||||
Teleporting Tube=
|
||||
Unconfigured Teleportation Tube=未配置的传送管道
|
||||
Sorry, channel '@1' is reserved for exclusive use by @2=抱歉,频道‘@1’保留供‘@2’专用
|
||||
Sorry, receiving from channel '@1' is reserved for @2=抱歉,从频道'@1'接收的内容已保留给'@2'
|
||||
Teleportation Tube @1 on '@2'=传送管'@1'在'@2'上
|
||||
@ -100,7 +105,9 @@ Trash Can=垃圾箱
|
||||
Pneumatic tube segment (legacy)=普通管道(旧式)
|
||||
|
||||
## vacuum tubes
|
||||
Radius=
|
||||
Vacuuming Pneumatic Tube Segment=拾取管道
|
||||
Adjustable Vacuuming Tube=
|
||||
Adjustable Vacuuming Pneumatic Tube Segment=高级拾取管道
|
||||
Adjustable Vacuuming Pneumatic Tube Segment (@1m)=高级拾取管道(@1m)
|
||||
|
||||
|
@ -3,6 +3,10 @@
|
||||
# License: CC-by-SA 4.0
|
||||
# Author:
|
||||
|
||||
## generic interaction
|
||||
Set=
|
||||
Cancel=
|
||||
|
||||
## digilines interfacing
|
||||
Channel=
|
||||
|
||||
@ -86,11 +90,12 @@ Sorting pneumatic tube=
|
||||
|
||||
## teleport tube
|
||||
Receive=
|
||||
channels are public by default=
|
||||
use <player>:<channel> for fully private channels=
|
||||
use <player>;<channel> for private receivers=
|
||||
Channels are public by default=
|
||||
Use <player>:<channel> for fully private channels=
|
||||
Use <player>;<channel> for private receivers=
|
||||
Teleporting Pneumatic Tube Segment=
|
||||
unconfigured Teleportation Tube=
|
||||
Teleporting Tube=
|
||||
Unconfigured Teleportation Tube=
|
||||
Sorry, channel '@1' is reserved for exclusive use by @2=
|
||||
Sorry, receiving from channel '@1' is reserved for @2=
|
||||
Teleportation Tube @1 on '@2'=
|
||||
@ -102,7 +107,9 @@ Trash Can=
|
||||
Pneumatic tube segment (legacy)=
|
||||
|
||||
## vacuum tubes
|
||||
Radius=
|
||||
Vacuuming Pneumatic Tube Segment=
|
||||
Adjustable Vacuuming Tube=
|
||||
Adjustable Vacuuming Pneumatic Tube Segment=
|
||||
Adjustable Vacuuming Pneumatic Tube Segment (@1m)=
|
||||
|
||||
|
135
lua_tube.lua
135
lua_tube.lua
@ -666,6 +666,7 @@ local function reset_formspec(meta, code, errmsg)
|
||||
code = minetest.formspec_escape(code or "")
|
||||
errmsg = minetest.formspec_escape(tostring(errmsg or ""))
|
||||
meta:set_string("formspec", "size[12,10]"
|
||||
.."style_type[label,textarea;font=mono]"
|
||||
.."background[-0.2,-0.25;12.4,10.75;jeija_luac_background.png]"
|
||||
.."label[0.1,8.3;"..errmsg.."]"
|
||||
.."textarea[0.2,0.2;12.2,9.5;code;;"..code.."]"
|
||||
@ -813,84 +814,58 @@ local tiles_base = {
|
||||
"pipeworks_mese_tube_plain_2.png", "pipeworks_mese_tube_plain_1.png",
|
||||
"pipeworks_mese_tube_plain_6.png", "pipeworks_mese_tube_plain_5.png"}
|
||||
|
||||
local tiles_on_off = {
|
||||
R__0 = "^pipeworks_lua_tube_port_%s.png",
|
||||
R_90 = "^(pipeworks_lua_tube_port_%s.png^[transformR90)",
|
||||
R180 = "^(pipeworks_lua_tube_port_%s.png^[transformR180)",
|
||||
R270 = "^(pipeworks_lua_tube_port_%s.png^[transformR270)"
|
||||
}
|
||||
|
||||
local texture_alpha_mode = minetest.features.use_texture_alpha_string_modes
|
||||
and "clip" or true
|
||||
|
||||
for red = 0, 1 do -- 0 = off 1 = on
|
||||
for blue = 0, 1 do
|
||||
for yellow = 0, 1 do
|
||||
for green = 0, 1 do
|
||||
for black = 0, 1 do
|
||||
for white = 0, 1 do
|
||||
local cid = tostring(white)..tostring(black)..tostring(green)..
|
||||
tostring(yellow)..tostring(blue)..tostring(red)
|
||||
local cid = white..black..green..yellow..blue..red
|
||||
local node_name = BASENAME..cid
|
||||
local tiles = table.copy(tiles_base)
|
||||
if red == 1 then
|
||||
tiles[1] = tiles[1].."^(pipeworks_lua_tube_port_on.png^[transformR90)"
|
||||
tiles[2] = tiles[2].."^(pipeworks_lua_tube_port_on.png^[transformR90)"
|
||||
tiles[5] = tiles[5].."^(pipeworks_lua_tube_port_on.png^[transformR270)"
|
||||
tiles[6] = tiles[6].."^(pipeworks_lua_tube_port_on.png^[transformR90)"
|
||||
else
|
||||
tiles[1] = tiles[1].."^(pipeworks_lua_tube_port_off.png^[transformR90)"
|
||||
tiles[2] = tiles[2].."^(pipeworks_lua_tube_port_off.png^[transformR90)"
|
||||
tiles[5] = tiles[5].."^(pipeworks_lua_tube_port_off.png^[transformR270)"
|
||||
tiles[6] = tiles[6].."^(pipeworks_lua_tube_port_off.png^[transformR90)"
|
||||
end
|
||||
if blue == 1 then
|
||||
tiles[1] = tiles[1].."^(pipeworks_lua_tube_port_on.png^[transformR270)"
|
||||
tiles[2] = tiles[2].."^(pipeworks_lua_tube_port_on.png^[transformR270)"
|
||||
tiles[5] = tiles[5].."^(pipeworks_lua_tube_port_on.png^[transformR90)"
|
||||
tiles[6] = tiles[6].."^(pipeworks_lua_tube_port_on.png^[transformR270)"
|
||||
else
|
||||
tiles[1] = tiles[1].."^(pipeworks_lua_tube_port_off.png^[transformR270)"
|
||||
tiles[2] = tiles[2].."^(pipeworks_lua_tube_port_off.png^[transformR270)"
|
||||
tiles[5] = tiles[5].."^(pipeworks_lua_tube_port_off.png^[transformR90)"
|
||||
tiles[6] = tiles[6].."^(pipeworks_lua_tube_port_off.png^[transformR270)"
|
||||
end
|
||||
if yellow == 1 then
|
||||
tiles[3] = tiles[3].."^(pipeworks_lua_tube_port_on.png^[transformR180)"
|
||||
tiles[4] = tiles[4].."^(pipeworks_lua_tube_port_on.png^[transformR180)"
|
||||
tiles[5] = tiles[5].."^(pipeworks_lua_tube_port_on.png^[transformR180)"
|
||||
tiles[6] = tiles[6].."^(pipeworks_lua_tube_port_on.png^[transformR180)"
|
||||
else
|
||||
tiles[3] = tiles[3].."^(pipeworks_lua_tube_port_off.png^[transformR180)"
|
||||
tiles[4] = tiles[4].."^(pipeworks_lua_tube_port_off.png^[transformR180)"
|
||||
tiles[5] = tiles[5].."^(pipeworks_lua_tube_port_off.png^[transformR180)"
|
||||
tiles[6] = tiles[6].."^(pipeworks_lua_tube_port_off.png^[transformR180)"
|
||||
end
|
||||
if green == 1 then
|
||||
tiles[3] = tiles[3].."^pipeworks_lua_tube_port_on.png"
|
||||
tiles[4] = tiles[4].."^pipeworks_lua_tube_port_on.png"
|
||||
tiles[5] = tiles[5].."^pipeworks_lua_tube_port_on.png"
|
||||
tiles[6] = tiles[6].."^pipeworks_lua_tube_port_on.png"
|
||||
else
|
||||
tiles[3] = tiles[3].."^pipeworks_lua_tube_port_off.png"
|
||||
tiles[4] = tiles[4].."^pipeworks_lua_tube_port_off.png"
|
||||
tiles[5] = tiles[5].."^pipeworks_lua_tube_port_off.png"
|
||||
tiles[6] = tiles[6].."^pipeworks_lua_tube_port_off.png"
|
||||
end
|
||||
if black == 1 then
|
||||
tiles[1] = tiles[1].."^(pipeworks_lua_tube_port_on.png^[transformR180)"
|
||||
tiles[2] = tiles[2].."^pipeworks_lua_tube_port_on.png"
|
||||
tiles[3] = tiles[3].."^(pipeworks_lua_tube_port_on.png^[transformR90)"
|
||||
tiles[4] = tiles[4].."^(pipeworks_lua_tube_port_on.png^[transformR270)"
|
||||
else
|
||||
tiles[1] = tiles[1].."^(pipeworks_lua_tube_port_off.png^[transformR180)"
|
||||
tiles[2] = tiles[2].."^pipeworks_lua_tube_port_off.png"
|
||||
tiles[3] = tiles[3].."^(pipeworks_lua_tube_port_off.png^[transformR90)"
|
||||
tiles[4] = tiles[4].."^(pipeworks_lua_tube_port_off.png^[transformR270)"
|
||||
end
|
||||
if white == 1 then
|
||||
tiles[1] = tiles[1].."^pipeworks_lua_tube_port_on.png"
|
||||
tiles[2] = tiles[2].."^(pipeworks_lua_tube_port_on.png^[transformR180)"
|
||||
tiles[3] = tiles[3].."^(pipeworks_lua_tube_port_on.png^[transformR270)"
|
||||
tiles[4] = tiles[4].."^(pipeworks_lua_tube_port_on.png^[transformR90)"
|
||||
else
|
||||
tiles[1] = tiles[1].."^pipeworks_lua_tube_port_off.png"
|
||||
tiles[2] = tiles[2].."^(pipeworks_lua_tube_port_off.png^[transformR180)"
|
||||
tiles[3] = tiles[3].."^(pipeworks_lua_tube_port_off.png^[transformR270)"
|
||||
tiles[4] = tiles[4].."^(pipeworks_lua_tube_port_off.png^[transformR90)"
|
||||
end
|
||||
|
||||
local groups = {snappy = 3, tube = 1, tubedevice = 1, overheat = 1}
|
||||
local tiles = table.copy(tiles_base)
|
||||
-- Red
|
||||
tiles[1] = tiles[1]..tiles_on_off.R_90:format(red == 1 and "on" or "off");
|
||||
tiles[2] = tiles[2]..tiles_on_off.R_90:format(red == 1 and "on" or "off");
|
||||
tiles[5] = tiles[5]..tiles_on_off.R270:format(red == 1 and "on" or "off");
|
||||
tiles[6] = tiles[6]..tiles_on_off.R_90:format(red == 1 and "on" or "off");
|
||||
-- Blue
|
||||
tiles[1] = tiles[1]..tiles_on_off.R270:format(blue == 1 and "on" or "off");
|
||||
tiles[2] = tiles[2]..tiles_on_off.R270:format(blue == 1 and "on" or "off");
|
||||
tiles[5] = tiles[5]..tiles_on_off.R_90:format(blue == 1 and "on" or "off");
|
||||
tiles[6] = tiles[6]..tiles_on_off.R270:format(blue == 1 and "on" or "off");
|
||||
-- Yellow
|
||||
tiles[1] = tiles[1]..tiles_on_off.R180:format(yellow == 1 and "on" or "off");
|
||||
tiles[2] = tiles[2]..tiles_on_off.R180:format(yellow == 1 and "on" or "off");
|
||||
tiles[5] = tiles[5]..tiles_on_off.R180:format(yellow == 1 and "on" or "off");
|
||||
tiles[6] = tiles[6]..tiles_on_off.R180:format(yellow == 1 and "on" or "off");
|
||||
-- Green
|
||||
tiles[3] = tiles[3]..tiles_on_off.R__0:format(green == 1 and "on" or "off");
|
||||
tiles[4] = tiles[4]..tiles_on_off.R__0:format(green == 1 and "on" or "off");
|
||||
tiles[5] = tiles[5]..tiles_on_off.R__0:format(green == 1 and "on" or "off");
|
||||
tiles[6] = tiles[6]..tiles_on_off.R__0:format(green == 1 and "on" or "off");
|
||||
-- Black
|
||||
tiles[1] = tiles[1]..tiles_on_off.R180:format(black == 1 and "on" or "off");
|
||||
tiles[2] = tiles[2]..tiles_on_off.R__0:format(black == 1 and "on" or "off");
|
||||
tiles[3] = tiles[3]..tiles_on_off.R_90:format(black == 1 and "on" or "off");
|
||||
tiles[4] = tiles[4]..tiles_on_off.R270:format(black == 1 and "on" or "off");
|
||||
-- White
|
||||
tiles[1] = tiles[1]..tiles_on_off.R__0:format(white == 1 and "on" or "off");
|
||||
tiles[2] = tiles[2]..tiles_on_off.R180: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");
|
||||
|
||||
local groups = {snappy = 3, tube = 1, tubedevice = 1, overheat = 1, dig_generic = 4}
|
||||
if red + blue + yellow + green + black + white ~= 0 then
|
||||
groups.not_in_creative_inventory = 1
|
||||
end
|
||||
@ -933,6 +908,7 @@ for white = 0, 1 do
|
||||
description = "Lua controlled Tube",
|
||||
drawtype = "nodebox",
|
||||
tiles = tiles,
|
||||
use_texture_alpha = texture_alpha_mode,
|
||||
paramtype = "light",
|
||||
is_ground_content = false,
|
||||
groups = groups,
|
||||
@ -942,7 +918,9 @@ for white = 0, 1 do
|
||||
node_box = node_box,
|
||||
on_construct = reset_meta,
|
||||
on_receive_fields = on_receive_fields,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_wood_defaults",
|
||||
},
|
||||
mesecons = mesecons,
|
||||
digiline = digiline,
|
||||
-- Virtual portstates are the ports that
|
||||
@ -969,7 +947,7 @@ for white = 0, 1 do
|
||||
can_go = function(pos, node, velocity, stack)
|
||||
local src = {name = nil}
|
||||
-- add color of the incoming tube explicitly; referring to rules, in case they change later
|
||||
for color, rule in pairs(rules) do
|
||||
for _, rule in pairs(rules) do
|
||||
if (-velocity.x == rule.x and -velocity.y == rule.y and -velocity.z == rule.z) then
|
||||
src.name = rule.name
|
||||
break
|
||||
@ -993,7 +971,7 @@ for white = 0, 1 do
|
||||
on_blast = function(pos, intensity)
|
||||
if not intensity or intensity > 1 + 3^0.5 then
|
||||
minetest.remove_node(pos)
|
||||
return {string.format("%s_%s", name, dropname)}
|
||||
return
|
||||
end
|
||||
minetest.swap_node(pos, {name = "pipeworks:broken_tube_1"})
|
||||
pipeworks.scan_for_tube_objects(pos)
|
||||
@ -1006,6 +984,8 @@ end
|
||||
end
|
||||
end
|
||||
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = BASENAME.."000000"
|
||||
|
||||
------------------------------------
|
||||
-- Overheated Lua controlled Tube --
|
||||
------------------------------------
|
||||
@ -1039,17 +1019,20 @@ tiles_burnt[4] = tiles_burnt[4].."^(pipeworks_lua_tube_port_burnt.png^[transform
|
||||
minetest.register_node(BASENAME .. "_burnt", {
|
||||
drawtype = "nodebox",
|
||||
tiles = tiles_burnt,
|
||||
use_texture_alpha = texture_alpha_mode,
|
||||
is_burnt = true,
|
||||
paramtype = "light",
|
||||
is_ground_content = false,
|
||||
groups = {snappy = 3, tube = 1, tubedevice = 1, not_in_creative_inventory=1},
|
||||
groups = {snappy = 3, tube = 1, tubedevice = 1, not_in_creative_inventory=1, dig_generic = 4},
|
||||
drop = BASENAME.."000000",
|
||||
sunlight_propagates = true,
|
||||
selection_box = selection_box,
|
||||
node_box = node_box,
|
||||
on_construct = reset_meta,
|
||||
on_receive_fields = on_receive_fields,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_wood_defaults",
|
||||
},
|
||||
virtual_portstates = {red = false, blue = false, yellow = false,
|
||||
green = false, black = false, white = false},
|
||||
mesecons = {
|
||||
@ -1070,7 +1053,7 @@ minetest.register_node(BASENAME .. "_burnt", {
|
||||
on_blast = function(pos, intensity)
|
||||
if not intensity or intensity > 1 + 3^0.5 then
|
||||
minetest.remove_node(pos)
|
||||
return {string.format("%s_%s", name, dropname)}
|
||||
return
|
||||
end
|
||||
minetest.swap_node(pos, {name = "pipeworks:broken_tube_1"})
|
||||
pipeworks.scan_for_tube_objects(pos)
|
||||
|
106
luaentity.lua
106
luaentity.lua
@ -9,16 +9,16 @@ local filename = minetest.get_worldpath().."/luaentities"
|
||||
local function read_file()
|
||||
local f = io.open(filename, "r")
|
||||
if f == nil then return {} end
|
||||
local t = f:read("*all")
|
||||
f:close()
|
||||
local t = f:read("*all")
|
||||
f:close()
|
||||
if t == "" or t == nil then return {} end
|
||||
return minetest.deserialize(t) or {}
|
||||
end
|
||||
|
||||
local function write_file(tbl)
|
||||
local f = io.open(filename, "w")
|
||||
f:write(minetest.serialize(tbl))
|
||||
f:close()
|
||||
f:write(minetest.serialize(tbl))
|
||||
f:close()
|
||||
end
|
||||
|
||||
local function read_entities()
|
||||
@ -36,7 +36,7 @@ local function read_entities()
|
||||
y=math.min(30927,y)
|
||||
z=math.min(30927,z)
|
||||
|
||||
entity.start_pos.x = x
|
||||
entity.start_pos.x = x
|
||||
entity.start_pos.y = y
|
||||
entity.start_pos.z = z
|
||||
|
||||
@ -73,31 +73,43 @@ local function get_blockpos(pos)
|
||||
z = math.floor(pos.z / 16)}
|
||||
end
|
||||
|
||||
local active_blocks = {} -- These only contain active blocks near players (i.e., not forceloaded ones)
|
||||
local move_entities_globalstep_part1
|
||||
local is_active
|
||||
|
||||
local move_entities_globalstep_part1 = function(dtime)
|
||||
local active_block_range = tonumber(minetest.settings:get("active_block_range")) or 2
|
||||
local new_active_blocks = {}
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local blockpos = get_blockpos(player:get_pos())
|
||||
local minp = vector.subtract(blockpos, active_block_range)
|
||||
local maxp = vector.add(blockpos, active_block_range)
|
||||
if pipeworks.use_real_entities then
|
||||
local active_blocks = {} -- These only contain active blocks near players (i.e., not forceloaded ones)
|
||||
|
||||
for x = minp.x, maxp.x do
|
||||
for y = minp.y, maxp.y do
|
||||
for z = minp.z, maxp.z do
|
||||
local pos = {x = x, y = y, z = z}
|
||||
new_active_blocks[minetest.hash_node_position(pos)] = pos
|
||||
end
|
||||
end
|
||||
move_entities_globalstep_part1 = function(dtime)
|
||||
local active_block_range = tonumber(minetest.settings:get("active_block_range")) or 2
|
||||
local new_active_blocks = {}
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
local blockpos = get_blockpos(player:get_pos())
|
||||
local minp = vector.subtract(blockpos, active_block_range)
|
||||
local maxp = vector.add(blockpos, active_block_range)
|
||||
|
||||
for x = minp.x, maxp.x do
|
||||
for y = minp.y, maxp.y do
|
||||
for z = minp.z, maxp.z do
|
||||
local pos = {x = x, y = y, z = z}
|
||||
new_active_blocks[minetest.hash_node_position(pos)] = pos
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
active_blocks = new_active_blocks
|
||||
-- todo: callbacks on block load/unload
|
||||
end
|
||||
active_blocks = new_active_blocks
|
||||
-- todo: callbacks on block load/unload
|
||||
end
|
||||
|
||||
local function is_active(pos)
|
||||
return active_blocks[minetest.hash_node_position(get_blockpos(pos))] ~= nil
|
||||
is_active = function(pos)
|
||||
return active_blocks[minetest.hash_node_position(get_blockpos(pos))] ~= nil
|
||||
end
|
||||
else
|
||||
move_entities_globalstep_part1 = function()
|
||||
end
|
||||
|
||||
is_active = function()
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
local entitydef_default = {
|
||||
@ -211,7 +223,7 @@ local entitydef_default = {
|
||||
end
|
||||
end,
|
||||
get_velocity = function(self)
|
||||
return vector.new(self._velocity)
|
||||
return vector.new(self._velocity)
|
||||
end,
|
||||
set_velocity = function(self, velocity)
|
||||
self._velocity = vector.new(velocity)
|
||||
@ -289,7 +301,7 @@ function luaentity.add_entity(pos, name)
|
||||
_acceleration = {x = 0, y = 0, z = 0},
|
||||
_attached_entities = {},
|
||||
}
|
||||
|
||||
|
||||
local prototype = luaentity.registered_entities[name]
|
||||
setmetatable(entity, prototype) -- Default to prototype for other methods
|
||||
luaentity.entities[index] = entity
|
||||
@ -318,19 +330,20 @@ end
|
||||
function luaentity.get_objects_inside_radius(pos, radius)
|
||||
local objects = {}
|
||||
local index = 1
|
||||
for id, entity in pairs(luaentity.entities) do
|
||||
for _, entity in pairs(luaentity.entities) do
|
||||
if vector.distance(pos, entity:get_pos()) <= radius then
|
||||
objects[index] = entity
|
||||
index = index + 1
|
||||
end
|
||||
end
|
||||
return objects
|
||||
end
|
||||
|
||||
local move_entities_globalstep_part2 = function(dtime)
|
||||
if not luaentity.entities then
|
||||
luaentity.entities = read_entities()
|
||||
end
|
||||
for id, entity in pairs(luaentity.entities) do
|
||||
for _, entity in pairs(luaentity.entities) do
|
||||
local master = entity._attached_entities_master
|
||||
local master_def = master and entity._attached_entities[master]
|
||||
local master_entity = master_def and master_def.entity
|
||||
@ -369,13 +382,36 @@ local move_entities_globalstep_part2 = function(dtime)
|
||||
end
|
||||
end
|
||||
|
||||
local handle_active_blocks_timer = 0.1
|
||||
-- dtime after which there is an update (or skip).
|
||||
local dtime_threshold = pipeworks.entity_update_interval
|
||||
-- Accumulated dtime since last update (or skip).
|
||||
local dtime_accum = 0
|
||||
-- Delayed dtime accumulated due to skipped updates.
|
||||
local dtime_delayed = 0
|
||||
local skip_update = false
|
||||
|
||||
minetest.register_globalstep(function(dtime)
|
||||
handle_active_blocks_timer = handle_active_blocks_timer + dtime
|
||||
if dtime < 0.2 or handle_active_blocks_timer >= (dtime * 3) then
|
||||
handle_active_blocks_timer = 0.1
|
||||
move_entities_globalstep_part1(dtime)
|
||||
move_entities_globalstep_part2(dtime)
|
||||
if dtime >= 0.2 and dtime_delayed < 1 then
|
||||
-- Reduce activity when the server is lagging.
|
||||
skip_update = true
|
||||
end
|
||||
|
||||
dtime_accum = dtime_accum + dtime
|
||||
if dtime_accum < dtime_threshold then
|
||||
return
|
||||
end
|
||||
|
||||
if skip_update then
|
||||
dtime_delayed = dtime_delayed + dtime_accum
|
||||
skip_update = false
|
||||
else
|
||||
move_entities_globalstep_part1(dtime_accum + dtime_delayed)
|
||||
move_entities_globalstep_part2(dtime_accum + dtime_delayed)
|
||||
dtime_delayed = 0
|
||||
end
|
||||
|
||||
-- Tune the threshold so that the average interval is pipeworks.entity_update_interval.
|
||||
dtime_threshold = math.max(dtime_threshold + (pipeworks.entity_update_interval - dtime_accum) / 10, 0)
|
||||
|
||||
dtime_accum = 0
|
||||
end)
|
||||
|
4
mod.conf
4
mod.conf
@ -1,5 +1,5 @@
|
||||
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.
|
||||
depends = default, basic_materials, screwdriver
|
||||
optional_depends = mesecons, mesecons_mvps, digilines, signs_lib
|
||||
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
|
||||
min_minetest_version = 5.2.0
|
||||
|
36
pipes.lua
36
pipes.lua
@ -11,11 +11,11 @@ local new_flow_logic_register = pipeworks.flowables.register
|
||||
local polys = ""
|
||||
if pipeworks.enable_lowpoly then polys = "_lowpoly" end
|
||||
|
||||
local vti = {4, 3, 2, 1, 6, 5}
|
||||
--~ local vti = {4, 3, 2, 1, 6, 5}
|
||||
local cconnects = {{}, {1}, {1, 2}, {1, 3}, {1, 3, 5}, {1, 2, 3}, {1, 2, 3, 5}, {1, 2, 3, 4}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5, 6}}
|
||||
for index, connects in ipairs(cconnects) do
|
||||
local outsel = {}
|
||||
|
||||
|
||||
local jx = 0
|
||||
local jy = 0
|
||||
local jz = 0
|
||||
@ -30,23 +30,25 @@ for index, connects in ipairs(cconnects) do
|
||||
table.insert(outsel, pipeworks.pipe_selectboxes[v])
|
||||
end
|
||||
|
||||
--[[
|
||||
if #connects == 1 then
|
||||
local v = connects[1]
|
||||
v = v-1 + 2*(v%2) -- Opposite side
|
||||
end
|
||||
|
||||
local pgroups = {snappy = 3, pipe = 1, not_in_creative_inventory = 1}
|
||||
--]]
|
||||
|
||||
local pgroups = {snappy = 3, pipe = 1, not_in_creative_inventory = 1, dig_generic = 4}
|
||||
local pipedesc = S("Pipe Segment").." "..dump(connects)
|
||||
|
||||
if #connects == 0 then
|
||||
pgroups = {snappy = 3, tube = 1}
|
||||
pgroups = {snappy = 3, tube = 1, dig_generic = 4}
|
||||
pipedesc = S("Pipe Segment")
|
||||
end
|
||||
|
||||
|
||||
local outimg_e = { "pipeworks_pipe_plain.png" }
|
||||
local outimg_l = { "pipeworks_pipe_plain.png" }
|
||||
|
||||
if index == 3 then
|
||||
if index == 3 then
|
||||
outimg_e = { "pipeworks_pipe_3_empty.png" }
|
||||
outimg_l = { "pipeworks_pipe_3_loaded.png" }
|
||||
end
|
||||
@ -74,7 +76,9 @@ for index, connects in ipairs(cconnects) do
|
||||
fixed = outsel
|
||||
},
|
||||
groups = pgroups,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
drop = "pipeworks:pipe_1_empty",
|
||||
after_place_node = function(pos)
|
||||
@ -88,8 +92,8 @@ for index, connects in ipairs(cconnects) do
|
||||
check_for_horiz_pole = pipeworks.check_for_horiz_pipe,
|
||||
pipenumber = index
|
||||
})
|
||||
|
||||
local pgroups = {snappy = 3, pipe = 1, not_in_creative_inventory = 1}
|
||||
|
||||
local pgroups = {snappy = 3, pipe = 1, not_in_creative_inventory = 1, dig_generic = 4}
|
||||
|
||||
minetest.register_node("pipeworks:pipe_"..index.."_loaded", {
|
||||
description = pipedesc,
|
||||
@ -108,7 +112,9 @@ for index, connects in ipairs(cconnects) do
|
||||
fixed = outsel
|
||||
},
|
||||
groups = pgroups,
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_metal_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
drop = "pipeworks:pipe_1_empty",
|
||||
after_place_node = function(pos)
|
||||
@ -123,7 +129,7 @@ for index, connects in ipairs(cconnects) do
|
||||
check_for_horiz_pole = pipeworks.check_for_horiz_pipe,
|
||||
pipenumber = index
|
||||
})
|
||||
|
||||
|
||||
local emptypipe = "pipeworks:pipe_"..index.."_empty"
|
||||
local fullpipe = "pipeworks:pipe_"..index.."_loaded"
|
||||
table.insert(pipes_empty_nodenames, emptypipe)
|
||||
@ -131,7 +137,7 @@ for index, connects in ipairs(cconnects) do
|
||||
new_flow_logic_register.simple(emptypipe)
|
||||
new_flow_logic_register.simple(fullpipe)
|
||||
end
|
||||
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:pipe_1_empty"
|
||||
|
||||
|
||||
if REGISTER_COMPATIBILITY then
|
||||
@ -239,7 +245,7 @@ minetest.register_abm({
|
||||
nodenames = {"pipeworks:spigot","pipeworks:spigot_pouring"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
pipeworks.spigot_check(pos,node)
|
||||
end
|
||||
})
|
||||
@ -248,7 +254,7 @@ minetest.register_abm({
|
||||
nodenames = {"pipeworks:fountainhead","pipeworks:fountainhead_pouring"},
|
||||
interval = 1,
|
||||
chance = 1,
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
action = function(pos, node, active_object_count, active_object_count_wider)
|
||||
pipeworks.fountainhead_check(pos,node)
|
||||
end
|
||||
})
|
||||
|
@ -29,7 +29,7 @@ end
|
||||
|
||||
|
||||
|
||||
local formatvec = function(vec) local sep="," return "("..tostring(vec.x)..sep..tostring(vec.y)..sep..tostring(vec.z)..")" end
|
||||
--~ local formatvec = function(vec) local sep="," return "("..tostring(vec.x)..sep..tostring(vec.y)..sep..tostring(vec.z)..")" end
|
||||
|
||||
|
||||
|
||||
@ -39,10 +39,10 @@ local formatvec = function(vec) local sep="," return "("..tostring(vec.x)..sep..
|
||||
local check_for_liquids_v2 = function(pos, limit)
|
||||
local coords = make_coords_offsets(pos, false)
|
||||
local total = 0
|
||||
for index, tpos in ipairs(coords) do
|
||||
for _, tpos in ipairs(coords) do
|
||||
if total >= limit then break end
|
||||
local name = minetest.get_node(tpos).name
|
||||
if name == "default:water_source" then
|
||||
if name == pipeworks.liquids.water.source then
|
||||
minetest.remove_node(tpos)
|
||||
total = total + 1
|
||||
end
|
||||
@ -69,11 +69,13 @@ end
|
||||
|
||||
|
||||
-- logging is unreliable when something is crashing...
|
||||
--[[
|
||||
local nilexplode = function(caller, label, value)
|
||||
if value == nil then
|
||||
error(caller..": "..label.." was nil")
|
||||
end
|
||||
end
|
||||
--]]
|
||||
|
||||
|
||||
|
||||
@ -151,7 +153,7 @@ local get_neighbour_positions = function(pos, node)
|
||||
|
||||
-- then, check each possible neighbour to see if they can be reached from this node.
|
||||
local connections = {}
|
||||
for index, offset in ipairs(candidates) do
|
||||
for _, offset in ipairs(candidates) do
|
||||
local npos = vector.add(pos, offset)
|
||||
local neighbour = minetest.get_node(npos)
|
||||
local nodename = neighbour.name
|
||||
@ -185,13 +187,12 @@ flowlogic.balance_pressure = function(pos, node, currentpressure)
|
||||
-- local dname = "flowlogic.balance_pressure()@"..formatvec(pos).." "
|
||||
-- check the pressure of all nearby flowable nodes, and average it out.
|
||||
|
||||
-- pressure handles to average over
|
||||
local connections = {}
|
||||
-- unconditionally include self in nodes to average over.
|
||||
-- result of averaging will be returned as new pressure for main flow logic callback
|
||||
local totalv = currentpressure
|
||||
local totalc = 1
|
||||
|
||||
-- pressure handles to average over
|
||||
local connections = get_neighbour_positions(pos, node)
|
||||
|
||||
-- for each neighbour, add neighbour's pressure to the total to balance out
|
||||
@ -246,9 +247,9 @@ flowlogic.helpers.make_neighbour_output_fixed = function(neighbours)
|
||||
-- in non-finite mode, pressure has to be sustained to keep the sources there.
|
||||
-- so in non-finite mode, placing water is dependent on the target node;
|
||||
-- draining pressure is not.
|
||||
local canplace = (name == "air") or (name == "default:water_flowing")
|
||||
local canplace = (name == "air") or (name == pipeworks.liquids.water.flowing)
|
||||
if canplace then
|
||||
minetest.swap_node(npos, {name="default:water_source"})
|
||||
minetest.swap_node(npos, {name=pipeworks.liquids.water.source})
|
||||
end
|
||||
if (not finitemode) or canplace then
|
||||
taken = taken + 1
|
||||
@ -267,7 +268,7 @@ flowlogic.helpers.make_neighbour_cleanup_fixed = function(neighbours)
|
||||
for _, offset in pairs(neighbours) do
|
||||
local npos = vector.add(pos, offset)
|
||||
local name = minetest.get_node(npos).name
|
||||
if (name == "default:water_source") then
|
||||
if (name == pipeworks.liquids.water.source) then
|
||||
--pipeworks.logger("neighbour_cleanup_fixed removing "..formatvec(npos))
|
||||
minetest.remove_node(npos)
|
||||
end
|
||||
@ -287,7 +288,7 @@ flowlogic.run_output = function(pos, node, currentpressure, oldpressure, outputd
|
||||
local upper = outputdef.upper
|
||||
local lower = outputdef.lower
|
||||
local result = currentpressure
|
||||
local threshold = nil
|
||||
local threshold
|
||||
if finitemode then threshold = lower else threshold = upper end
|
||||
if currentpressure > threshold then
|
||||
local takenpressure = outputdef.outputfn(pos, node, currentpressure, finitemode)
|
||||
@ -316,7 +317,7 @@ flowlogic.run_transition = function(node, currentpressure)
|
||||
local nodename_prev = simplesetdef[1].nodename
|
||||
local result_nodename = node.name
|
||||
|
||||
for index, element in ipairs(simplesetdef) do
|
||||
for _, element in ipairs(simplesetdef) do
|
||||
-- find the highest element that is below the current pressure.
|
||||
local threshold = element.threshold
|
||||
if threshold > currentpressure then
|
||||
@ -338,7 +339,9 @@ flowlogic.run_transition = function(node, currentpressure)
|
||||
end
|
||||
|
||||
if not found then
|
||||
pipeworks.logger("flowlogic.run_transition() BUG no transition definitions found! nodename="..nodename.." currentpressure="..tostring(currentpressure))
|
||||
pipeworks.logger("flowlogic.run_transition() BUG no transition " ..
|
||||
"definitions found! node.name=" .. node.name ..
|
||||
" currentpressure=" .. tostring(currentpressure))
|
||||
end
|
||||
|
||||
return result
|
||||
|
@ -26,8 +26,8 @@ local insertbase = function(nodename)
|
||||
end
|
||||
|
||||
local regwarning = function(kind, nodename)
|
||||
local tail = ""
|
||||
if pipeworks.toggles.pipe_mode ~= "pressure" then tail = " but pressure logic not enabled" end
|
||||
--~ local tail = ""
|
||||
--~ if pipeworks.toggles.pipe_mode ~= "pressure" then tail = " but pressure logic not enabled" end
|
||||
--pipeworks.logger(kind.." flow logic registry requested for "..nodename..tail)
|
||||
end
|
||||
|
||||
@ -106,7 +106,7 @@ register.directional_horizonal_rotate = function(nodename, doubleended)
|
||||
end
|
||||
local directionfn = function(node, direction)
|
||||
local result = false
|
||||
for index, endvec in ipairs(getends(node)) do
|
||||
for _, endvec in ipairs(getends(node)) do
|
||||
if vector.equals(direction, endvec) then result = true end
|
||||
end
|
||||
return result
|
||||
|
@ -10,6 +10,35 @@ minetest.register_craft( {
|
||||
},
|
||||
})
|
||||
|
||||
-- The hammers that can be used to break/repair tubes
|
||||
local allowed_hammers = {
|
||||
"anvil:hammer",
|
||||
"cottages:hammer",
|
||||
"glooptest:hammer_steel",
|
||||
"glooptest:hammer_bronze",
|
||||
"glooptest:hammer_diamond",
|
||||
"glooptest:hammer_mese",
|
||||
"glooptest:hammer_alatro",
|
||||
"glooptest:hammer_arol"
|
||||
}
|
||||
|
||||
-- Convert the above list to a format that's easier to look up
|
||||
for _,hammer in ipairs(allowed_hammers) do
|
||||
allowed_hammers[hammer] = true
|
||||
end
|
||||
|
||||
-- Check if the player is holding a suitable hammer or not - if they are, apply wear to it
|
||||
function pipeworks.check_and_wear_hammer(player)
|
||||
local itemstack = player:get_wielded_item()
|
||||
local wieldname = itemstack:get_name()
|
||||
if allowed_hammers[wieldname] then
|
||||
itemstack:add_wear(1000)
|
||||
player:set_wielded_item(itemstack)
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
local nodecolor = 0xffff3030
|
||||
|
||||
pipeworks.register_tube("pipeworks:broken_tube", {
|
||||
@ -35,29 +64,38 @@ pipeworks.register_tube("pipeworks:broken_tube", {
|
||||
local itemstack = puncher:get_wielded_item()
|
||||
local wieldname = itemstack:get_name()
|
||||
local playername = puncher:get_player_name()
|
||||
local log_msg = playername.." struck a broken tube at "..minetest.pos_to_string(pos).."\n"
|
||||
if wieldname == "anvil:hammer"
|
||||
or wieldname == "cottages:hammer"
|
||||
or wieldname == "glooptest:hammer_steel"
|
||||
or wieldname == "glooptest:hammer_bronze"
|
||||
or wieldname == "glooptest:hammer_diamond"
|
||||
or wieldname == "glooptest:hammer_mese"
|
||||
or wieldname == "glooptest:hammer_alatro"
|
||||
or wieldname == "glooptest:hammer_arol" then
|
||||
local meta = minetest.get_meta(pos)
|
||||
local was_node = minetest.deserialize(meta:get_string("the_tube_was"))
|
||||
if was_node and was_node ~= "" then
|
||||
pipeworks.logger(log_msg.." with "..wieldname.." to repair it.")
|
||||
local log_msg = playername.." struck a broken tube at "..minetest.pos_to_string(pos).."\n "
|
||||
local meta = minetest.get_meta(pos)
|
||||
local was_node = minetest.deserialize(meta:get_string("the_tube_was"))
|
||||
if not was_node then
|
||||
pipeworks.logger(log_msg.."but it can't be repaired.")
|
||||
return
|
||||
end
|
||||
if not pipeworks.check_and_wear_hammer(puncher) then
|
||||
if wieldname == "" then
|
||||
pipeworks.logger(log_msg.."by hand. It's not very effective.")
|
||||
if minetest.settings:get_bool("enable_damage") then
|
||||
minetest.chat_send_player(playername,S("Broken tubes may be a bit sharp. Perhaps try with a hammer?"))
|
||||
puncher:set_hp(puncher:get_hp()-1)
|
||||
end
|
||||
else
|
||||
pipeworks.logger(log_msg.."with "..wieldname.." but that tool is too weak.")
|
||||
end
|
||||
return
|
||||
end
|
||||
log_msg = log_msg.."with "..wieldname.." to repair it"
|
||||
local nodedef = minetest.registered_nodes[was_node.name]
|
||||
if nodedef then
|
||||
pipeworks.logger(log_msg..".")
|
||||
if nodedef.tube and nodedef.tube.on_repair then
|
||||
nodedef.tube.on_repair(pos, was_node)
|
||||
else
|
||||
minetest.swap_node(pos, { name = was_node.name, param2 = was_node.param2 })
|
||||
pipeworks.scan_for_tube_objects(pos)
|
||||
itemstack:add_wear(1000)
|
||||
puncher:set_wielded_item(itemstack)
|
||||
return itemstack
|
||||
else
|
||||
pipeworks.logger(log_msg.." but it can't be repaired.")
|
||||
end
|
||||
else
|
||||
pipeworks.logger(log_msg.." with "..wieldname.." but that tool is too weak.")
|
||||
pipeworks.logger(log_msg.." but original node "..was_node.name.." is not registered anymore.")
|
||||
minetest.chat_send_player(playername, S("This tube cannot be repaired."))
|
||||
end
|
||||
end
|
||||
}
|
||||
@ -79,14 +117,6 @@ if pipeworks.enable_priority_tube then
|
||||
tube = { priority = 150 } -- higher than tubedevices (100)
|
||||
},
|
||||
})
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:priority_tube_1 6",
|
||||
recipe = {
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{ "default:gold_ingot", "", "default:gold_ingot" },
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
if pipeworks.enable_accelerator_tube then
|
||||
@ -104,14 +134,6 @@ if pipeworks.enable_accelerator_tube then
|
||||
end}
|
||||
},
|
||||
})
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:accelerator_tube_1 2",
|
||||
recipe = {
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{ "default:mese_crystal_fragment", "default:steel_ingot", "default:mese_crystal_fragment" },
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
if pipeworks.enable_crossing_tube then
|
||||
@ -126,28 +148,30 @@ if pipeworks.enable_crossing_tube then
|
||||
tube = {can_go = function(pos, node, velocity, stack) return {velocity} end }
|
||||
},
|
||||
})
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:crossing_tube_1 5",
|
||||
recipe = {
|
||||
{ "", "pipeworks:tube_1", "" },
|
||||
{ "pipeworks:tube_1", "pipeworks:tube_1", "pipeworks:tube_1" },
|
||||
{ "", "pipeworks:tube_1", "" }
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
local texture_alpha_mode = minetest.features.use_texture_alpha_string_modes
|
||||
and "clip" or true
|
||||
|
||||
if pipeworks.enable_one_way_tube then
|
||||
local tiles = {"pipeworks_one_way_tube_top.png", "pipeworks_one_way_tube_top.png", "pipeworks_one_way_tube_output.png",
|
||||
"pipeworks_one_way_tube_input.png", "pipeworks_one_way_tube_side.png", "pipeworks_one_way_tube_top.png"}
|
||||
for i, tile in ipairs(tiles) do
|
||||
tiles[i] = pipeworks.make_tube_tile(tile)
|
||||
end
|
||||
minetest.register_node("pipeworks:one_way_tube", {
|
||||
description = S("One way tube"),
|
||||
tiles = {"pipeworks_one_way_tube_top.png", "pipeworks_one_way_tube_top.png", "pipeworks_one_way_tube_output.png",
|
||||
"pipeworks_one_way_tube_input.png", "pipeworks_one_way_tube_side.png", "pipeworks_one_way_tube_top.png"},
|
||||
tiles = tiles,
|
||||
use_texture_alpha = texture_alpha_mode,
|
||||
paramtype2 = "facedir",
|
||||
drawtype = "nodebox",
|
||||
paramtype = "light",
|
||||
node_box = {type = "fixed",
|
||||
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},
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_wood_defaults",
|
||||
},
|
||||
tube = {
|
||||
connect_sides = {left = 1, right = 1},
|
||||
can_go = function(pos, node, velocity, stack)
|
||||
@ -165,12 +189,5 @@ if pipeworks.enable_one_way_tube then
|
||||
check_for_pole = pipeworks.check_for_vert_tube,
|
||||
check_for_horiz_pole = pipeworks.check_for_horiz_tube
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "pipeworks:one_way_tube 2",
|
||||
recipe = {
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{ "group:stick", "default:mese_crystal", "basic_materials:plastic_sheet" },
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:one_way_tube"
|
||||
end
|
||||
|
@ -75,3 +75,12 @@ pipeworks_drop_on_routing_fail (Drop On Routing Fail) bool false
|
||||
|
||||
#Delete item on clearobject.
|
||||
pipeworks_delete_item_on_clearobject (Delete Item On Clearobject) bool true
|
||||
|
||||
#Use real visible entities in tubes within active areas.
|
||||
#When disabled, tubes are made opaque.
|
||||
pipeworks_use_real_entities (Use Real Entities) bool true
|
||||
|
||||
#Target interval between tube entity steps.
|
||||
#A high value may cause issues with tube entity visuals.
|
||||
#A value 0.2 or above may cause issues with accelerator tubes.
|
||||
pipeworks_entity_update_interval (Entity Update Interval) float 0 0 0.8
|
||||
|
@ -1,5 +1,17 @@
|
||||
local S = minetest.get_translator("pipeworks")
|
||||
if pipeworks.enable_detector_tube then
|
||||
|
||||
-- the minetest.after() calls below can sometimes trigger after a tube
|
||||
-- breaks, at which point item_exit() is no longer valid, so we have to make
|
||||
-- sure that there even IS a callback to run, first.
|
||||
|
||||
local function after_break(pos)
|
||||
local name = minetest.get_node(pos).name
|
||||
if minetest.registered_nodes[name].item_exit then
|
||||
minetest.registered_nodes[name].item_exit(pos)
|
||||
end
|
||||
end
|
||||
|
||||
if minetest.get_modpath("mesecons") and pipeworks.enable_detector_tube then
|
||||
local detector_tube_step = 5 * tonumber(minetest.settings:get("dedicated_server_step"))
|
||||
pipeworks.register_tube("pipeworks:detector_tube_on", {
|
||||
description = S("Detecting Pneumatic Tube Segment on"),
|
||||
@ -8,11 +20,10 @@ if pipeworks.enable_detector_tube then
|
||||
node_def = {
|
||||
tube = {can_go = function(pos, node, velocity, stack)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local name = minetest.get_node(pos).name
|
||||
local nitems = meta:get_int("nitems")+1
|
||||
meta:set_int("nitems", nitems)
|
||||
local saved_pos = vector.new(pos)
|
||||
minetest.after(detector_tube_step, minetest.registered_nodes[name].item_exit, saved_pos)
|
||||
minetest.after(detector_tube_step, after_break, saved_pos)
|
||||
return pipeworks.notvel(pipeworks.meseadjlist,velocity)
|
||||
end},
|
||||
groups = {mesecon = 2, not_in_creative_inventory = 1},
|
||||
@ -34,9 +45,7 @@ if pipeworks.enable_detector_tube then
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_int("nitems", 1)
|
||||
local name = minetest.get_node(pos).name
|
||||
local saved_pos = vector.new(pos)
|
||||
minetest.after(detector_tube_step, minetest.registered_nodes[name].item_exit, saved_pos)
|
||||
minetest.after(detector_tube_step, after_break, pos)
|
||||
end,
|
||||
},
|
||||
})
|
||||
@ -87,13 +96,20 @@ if digiline_enabled and pipeworks.enable_digiline_detector_tube then
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec",
|
||||
"size[8.6,2.2]"..
|
||||
"field[0.6,0.6;8,1;channel;"..S("Channel")..";${channel}]"..
|
||||
"image[0.3,1.3;1,1;pipeworks_digiline_detector_tube_inv.png]"..
|
||||
"label[1.6,1.2;"..S("Digiline Detecting Tube").."]"
|
||||
"size[8.5,2.2]"..
|
||||
"image[0.2,0;1,1;pipeworks_digiline_detector_tube_inv.png]"..
|
||||
"label[1.2,0.2;"..S("Digiline Detecting Tube").."]"..
|
||||
"field[0.5,1.6;4.6,1;channel;"..S("Channel")..";${channel}]"..
|
||||
"button[4.8,1.3;1.5,1;set_channel;"..S("Set").."]"..
|
||||
"button_exit[6.3,1.3;2,1;close;"..S("Close").."]"
|
||||
)
|
||||
end,
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
if (fields.quit and not fields.key_enter_field)
|
||||
or (fields.key_enter_field ~= "channel" and not fields.set_channel)
|
||||
or not pipeworks.may_configure(pos, sender) then
|
||||
return
|
||||
end
|
||||
if fields.channel then
|
||||
minetest.get_meta(pos):set_string("channel", fields.channel)
|
||||
end
|
||||
@ -121,7 +137,7 @@ if digiline_enabled and pipeworks.enable_digiline_detector_tube then
|
||||
})
|
||||
end
|
||||
|
||||
if pipeworks.enable_conductor_tube then
|
||||
if minetest.get_modpath("mesecons") and pipeworks.enable_conductor_tube then
|
||||
pipeworks.register_tube("pipeworks:conductor_tube_off", {
|
||||
description = S("Conducting Pneumatic Tube Segment"),
|
||||
inventory_image = "pipeworks_conductor_tube_inv.png",
|
||||
|
@ -16,29 +16,43 @@ if pipeworks.enable_mese_tube then
|
||||
local buttons_formspec = ""
|
||||
for i = 0, 5 do
|
||||
buttons_formspec = buttons_formspec .. fs_helpers.cycling_button(meta,
|
||||
"image_button[7,"..(i+0.2)..";1,0.6", "l"..(i+1).."s",
|
||||
"image_button[9,"..(i+(i*0.25)+0.5)..";1,0.6", "l"..(i+1).."s",
|
||||
{
|
||||
pipeworks.button_off,
|
||||
pipeworks.button_on
|
||||
}
|
||||
)
|
||||
end
|
||||
local list_backgrounds = ""
|
||||
if minetest.get_modpath("i3") then
|
||||
list_backgrounds = "style_type[box;colors=#666]"
|
||||
for i=0, 5 do
|
||||
for j=0, 5 do
|
||||
list_backgrounds = list_backgrounds .. "box[".. 1.5+(i*1.25) ..",".. 0.25+(j*1.25) ..";1,1;]"
|
||||
end
|
||||
end
|
||||
end
|
||||
local size = "10.2,13"
|
||||
meta:set_string("formspec",
|
||||
"size[8,11]"..
|
||||
"list[context;line1;1,0;6,1;]"..
|
||||
"list[context;line2;1,1;6,1;]"..
|
||||
"list[context;line3;1,2;6,1;]"..
|
||||
"list[context;line4;1,3;6,1;]"..
|
||||
"list[context;line5;1,4;6,1;]"..
|
||||
"list[context;line6;1,5;6,1;]"..
|
||||
"image[0,0;1,1;pipeworks_white.png]"..
|
||||
"image[0,1;1,1;pipeworks_black.png]"..
|
||||
"image[0,2;1,1;pipeworks_green.png]"..
|
||||
"image[0,3;1,1;pipeworks_yellow.png]"..
|
||||
"image[0,4;1,1;pipeworks_blue.png]"..
|
||||
"image[0,5;1,1;pipeworks_red.png]"..
|
||||
"formspec_version[2]"..
|
||||
"size["..size.."]"..
|
||||
pipeworks.fs_helpers.get_prepends(size)..
|
||||
"list[context;line1;1.5,0.25;6,1;]"..
|
||||
"list[context;line2;1.5,1.50;6,1;]"..
|
||||
"list[context;line3;1.5,2.75;6,1;]"..
|
||||
"list[context;line4;1.5,4.00;6,1;]"..
|
||||
"list[context;line5;1.5,5.25;6,1;]"..
|
||||
"list[context;line6;1.5,6.50;6,1;]"..
|
||||
list_backgrounds..
|
||||
"image[0.22,0.25;1,1;pipeworks_white.png]"..
|
||||
"image[0.22,1.50;1,1;pipeworks_black.png]"..
|
||||
"image[0.22,2.75;1,1;pipeworks_green.png]"..
|
||||
"image[0.22,4.00;1,1;pipeworks_yellow.png]"..
|
||||
"image[0.22,5.25;1,1;pipeworks_blue.png]"..
|
||||
"image[0.22,6.50;1,1;pipeworks_red.png]"..
|
||||
buttons_formspec..
|
||||
"list[current_player;main;0,7;8,4;]" ..
|
||||
--"list[current_player;main;0,8;8,4;]" ..
|
||||
pipeworks.fs_helpers.get_inv(8)..
|
||||
"listring[current_player;main]" ..
|
||||
"listring[current_player;main]" ..
|
||||
"listring[context;line1]" ..
|
||||
@ -110,9 +124,22 @@ if pipeworks.enable_mese_tube then
|
||||
update_formspec(pos)
|
||||
meta:set_string("infotext", S("Sorting pneumatic tube"))
|
||||
end,
|
||||
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||
if placer and placer:is_player() and placer:get_player_control().aux1 then
|
||||
local meta = minetest.get_meta(pos)
|
||||
for i = 1, 6 do
|
||||
meta:set_int("l"..tostring(i).."s", 0)
|
||||
end
|
||||
update_formspec(pos)
|
||||
end
|
||||
return pipeworks.after_place(pos, placer, itemstack, pointed_thing)
|
||||
end,
|
||||
on_punch = update_formspec,
|
||||
on_receive_fields = function(pos, formname, fields, sender)
|
||||
if not pipeworks.may_configure(pos, sender) then return end
|
||||
if (fields.quit and not fields.key_enter_field)
|
||||
or not pipeworks.may_configure(pos, sender) then
|
||||
return
|
||||
end
|
||||
fs_helpers.on_receive_fields(pos, fields)
|
||||
update_formspec(pos)
|
||||
end,
|
||||
@ -150,25 +177,4 @@ if pipeworks.enable_mese_tube then
|
||||
end,
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:mese_tube_000000 2",
|
||||
recipe = {
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{ "", "default:mese_crystal", "" },
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
type = "shapeless",
|
||||
output = "pipeworks:mese_tube_000000",
|
||||
recipe = {
|
||||
"pipeworks:tube_1",
|
||||
"default:mese_crystal_fragment",
|
||||
"default:mese_crystal_fragment",
|
||||
"default:mese_crystal_fragment",
|
||||
"default:mese_crystal_fragment"
|
||||
},
|
||||
})
|
||||
end
|
||||
|
@ -1,53 +1,90 @@
|
||||
local S = minetest.get_translator("pipeworks")
|
||||
local filename=minetest.get_worldpath() .. "/teleport_tubes"
|
||||
local filename=minetest.get_worldpath() .. "/teleport_tubes" -- Only used for backward-compat
|
||||
local storage=minetest.get_mod_storage()
|
||||
|
||||
local tp_tube_db = nil -- nil forces a read
|
||||
local tp_tube_db_version = 2.0
|
||||
local tp_tube_db_version = 3.0
|
||||
|
||||
-- cached rceiver list: hash(pos) => {receivers}
|
||||
local cache = {}
|
||||
|
||||
local function hash(pos)
|
||||
return string.format("%.30g", minetest.hash_node_position(pos))
|
||||
end
|
||||
|
||||
local function save_tube_db()
|
||||
local file, err = io.open(filename, "w")
|
||||
if file then
|
||||
tp_tube_db.version = tp_tube_db_version
|
||||
file:write(minetest.serialize(tp_tube_db))
|
||||
tp_tube_db.version = nil
|
||||
io.close(file)
|
||||
else
|
||||
error(err)
|
||||
-- reset tp-tube cache
|
||||
cache = {}
|
||||
|
||||
local fields = {version = tp_tube_db_version}
|
||||
for key, val in pairs(tp_tube_db) do
|
||||
fields[key] = minetest.serialize(val)
|
||||
end
|
||||
storage:from_table({fields = fields})
|
||||
end
|
||||
|
||||
local function save_tube_db_entry(hash)
|
||||
-- reset tp-tube cache
|
||||
cache = {}
|
||||
|
||||
local val = tp_tube_db[hash]
|
||||
storage:set_string(hash, val and minetest.serialize(val) or "")
|
||||
end
|
||||
|
||||
local function migrate_tube_db()
|
||||
local old_version = tp_tube_db.version or 0
|
||||
tp_tube_db.version = nil
|
||||
if old_version < 2.0 then
|
||||
local tmp_db = {}
|
||||
tp_tube_db.version = nil
|
||||
for key, val in pairs(tp_tube_db) do
|
||||
for _, val in pairs(tp_tube_db) do
|
||||
if(val.channel ~= "") then -- skip unconfigured tubes
|
||||
tmp_db[hash(val)] = val
|
||||
end
|
||||
end
|
||||
tp_tube_db = tmp_db
|
||||
save_tube_db()
|
||||
end
|
||||
save_tube_db()
|
||||
end
|
||||
|
||||
local function read_tube_db()
|
||||
local file = io.open(filename, "r")
|
||||
if file ~= nil then
|
||||
local file = not storage:contains("version") and io.open(filename, "r")
|
||||
if not file then
|
||||
tp_tube_db = {}
|
||||
|
||||
for key, val in pairs(storage:to_table().fields) do
|
||||
if tonumber(key) then
|
||||
tp_tube_db[key] = minetest.deserialize(val)
|
||||
elseif key == "version" then
|
||||
tp_tube_db.version = tonumber(val)
|
||||
else
|
||||
error("Unknown field in teleport tube DB: " .. key)
|
||||
end
|
||||
end
|
||||
|
||||
if tp_tube_db.version == nil then
|
||||
tp_tube_db.version = tp_tube_db_version
|
||||
storage:set_string("version", tp_tube_db.version)
|
||||
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)
|
||||
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 -- we add it back when saving
|
||||
return tp_tube_db -- we read sucessfully
|
||||
else
|
||||
tp_tube_db = {version = 2.0}
|
||||
end
|
||||
end
|
||||
tp_tube_db = {}
|
||||
|
||||
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
|
||||
|
||||
@ -64,7 +101,7 @@ local function set_tube(pos, channel, can_receive)
|
||||
if tube then
|
||||
tube.channel = channel
|
||||
tube.cr = can_receive
|
||||
save_tube_db()
|
||||
save_tube_db_entry(hash)
|
||||
return
|
||||
end
|
||||
|
||||
@ -83,13 +120,14 @@ local function set_tube(pos, channel, can_receive)
|
||||
end
|
||||
|
||||
tp_tube_db[hash] = {x=pos.x,y=pos.y,z=pos.z,channel=channel,cr=can_receive}
|
||||
save_tube_db()
|
||||
save_tube_db_entry(hash)
|
||||
end
|
||||
|
||||
local function remove_tube(pos)
|
||||
local tubes = tp_tube_db or read_tube_db()
|
||||
tubes[hash(pos)] = nil
|
||||
save_tube_db()
|
||||
local hash = hash(pos)
|
||||
tubes[hash] = nil
|
||||
save_tube_db_entry(hash)
|
||||
end
|
||||
|
||||
local function read_node_with_vm(pos)
|
||||
@ -101,9 +139,14 @@ local function read_node_with_vm(pos)
|
||||
end
|
||||
|
||||
local function get_receivers(pos, channel)
|
||||
local hash = minetest.hash_node_position(pos)
|
||||
if cache[hash] then
|
||||
-- re-use cached result
|
||||
return cache[hash]
|
||||
end
|
||||
|
||||
local tubes = tp_tube_db or read_tube_db()
|
||||
local receivers = {}
|
||||
local dirty = false
|
||||
for key, val in pairs(tubes) 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 (val.x ~= pos.x or val.y ~= pos.y or val.z ~= pos.z)) then
|
||||
@ -114,29 +157,34 @@ local function get_receivers(pos, channel)
|
||||
table.insert(receivers, val)
|
||||
else
|
||||
tp_tube_db[key] = nil
|
||||
dirty = true
|
||||
save_tube_db_entry(key)
|
||||
end
|
||||
end
|
||||
end
|
||||
if dirty then
|
||||
save_tube_db()
|
||||
end
|
||||
-- cache the result for next time
|
||||
cache[hash] = receivers
|
||||
return receivers
|
||||
end
|
||||
|
||||
local function update_meta(meta, can_receive)
|
||||
meta:set_int("can_receive", can_receive and 1 or 0)
|
||||
local cr_state = can_receive and "on" or "off"
|
||||
meta:set_string("formspec","size[8.6,2.2]"..
|
||||
"field[0.6,0.6;7,1;channel;"..S("Channel")..";${channel}]"..
|
||||
"label[7.3,0;"..S("Receive").."]"..
|
||||
"image_button[7.3,0.3;1,0.6;pipeworks_button_" .. cr_state .. ".png;cr" .. (can_receive and 0 or 1) .. ";;;false;pipeworks_button_interm.png]"..
|
||||
"image[0.3,1.3;1,1;pipeworks_teleport_tube_inv.png]"..
|
||||
"label[1.6,1.2;"..S("channels are public by default").."]" ..
|
||||
"label[1.6,1.5;"..S("use <player>:<channel> for fully private channels").."]" ..
|
||||
"label[1.6,1.8;"..S("use <player>\\;<channel> for private receivers").."]" ..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img)
|
||||
local itext = S("Channels are public by default").."\n"..
|
||||
S("Use <player>:<channel> for fully private channels").."\n"..
|
||||
S("Use <player>\\;<channel> for private receivers")
|
||||
local size = "8.5,4"
|
||||
meta:set_string("formspec",
|
||||
"formspec_version[2]"..
|
||||
"size["..size.."]"..
|
||||
pipeworks.fs_helpers.get_prepends(size) ..
|
||||
"image[0.5,o;1,1;pipeworks_teleport_tube_inv.png]"..
|
||||
"label[1.5,0.5;"..S("Teleporting Tube").."]"..
|
||||
"field[0.5,1.6;4.3,0.75;channel;"..S("Channel")..";${channel}]"..
|
||||
"button[4.8,1.6;1.5,0.75;set_channel;"..S("Set").."]"..
|
||||
"label[7.0,0.5;"..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]"..
|
||||
"button_exit[6.3,1.6;2,0.75;close;"..S("Close").."]"..
|
||||
"label[0.5,2.7;"..itext.."]")
|
||||
end
|
||||
|
||||
pipeworks.register_tube("pipeworks:teleport_tube", {
|
||||
@ -165,15 +213,28 @@ pipeworks.register_tube("pipeworks:teleport_tube", {
|
||||
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"))
|
||||
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
|
||||
@ -193,7 +254,7 @@ pipeworks.register_tube("pipeworks:teleport_tube", {
|
||||
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",
|
||||
@ -207,7 +268,7 @@ pipeworks.register_tube("pipeworks:teleport_tube", {
|
||||
|
||||
-- was the channel changed?
|
||||
local channel = meta:get_string("channel")
|
||||
if new_channel ~= channel then
|
||||
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
|
||||
@ -233,7 +294,7 @@ pipeworks.register_tube("pipeworks:teleport_tube", {
|
||||
else
|
||||
-- remove empty channel tubes, to not have to search through them
|
||||
remove_tube(pos)
|
||||
meta:set_string("infotext", S("unconfigured Teleportation Tube"))
|
||||
meta:set_string("infotext", S("Unconfigured Teleportation Tube"))
|
||||
end
|
||||
end
|
||||
end,
|
||||
@ -242,14 +303,6 @@ pipeworks.register_tube("pipeworks:teleport_tube", {
|
||||
end
|
||||
},
|
||||
})
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:teleport_tube_1 2",
|
||||
recipe = {
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{ "default:desert_stone", "default:mese", "default:desert_stone" },
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
|
||||
if minetest.get_modpath("mesecons_mvps") ~= nil then
|
||||
mesecon.register_on_mvps_move(function(moved_nodes)
|
||||
@ -266,6 +319,9 @@ end
|
||||
pipeworks.tptube = {
|
||||
hash = hash,
|
||||
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,
|
||||
update_meta = update_meta,
|
||||
tp_tube_db_version = tp_tube_db_version
|
||||
}
|
||||
|
49
trashcan.lua
49
trashcan.lua
@ -1,7 +1,7 @@
|
||||
local S = minetest.get_translator("pipeworks")
|
||||
minetest.register_node("pipeworks:trashcan", {
|
||||
description = S("Trash Can"),
|
||||
drawtype = "normal",
|
||||
description = S("Trash Can"),
|
||||
drawtype = "normal",
|
||||
tiles = {
|
||||
"pipeworks_trashcan_bottom.png",
|
||||
"pipeworks_trashcan_bottom.png",
|
||||
@ -9,43 +9,42 @@ minetest.register_node("pipeworks:trashcan", {
|
||||
"pipeworks_trashcan_side.png",
|
||||
"pipeworks_trashcan_side.png",
|
||||
"pipeworks_trashcan_side.png",
|
||||
},
|
||||
groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1},
|
||||
},
|
||||
groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1, dig_generic = 4},
|
||||
tube = {
|
||||
insert_object = function(pos, node, stack, direction)
|
||||
return ItemStack("")
|
||||
end,
|
||||
connect_sides = {left = 1, right = 1, front = 1, back = 1, top = 1, bottom = 1},
|
||||
priority = 1, -- Lower than anything else
|
||||
},
|
||||
},
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local size = "10.2,9"
|
||||
local list_background = ""
|
||||
if minetest.get_modpath("i3") then
|
||||
list_background = "style_type[box;colors=#666]box[4.5,2;1,1;]"
|
||||
end
|
||||
meta:set_string("formspec",
|
||||
"size[8,7]"..
|
||||
"item_image[0,0;1,1;pipeworks:trashcan]"..
|
||||
"label[1,0;"..S("Trash Can").."]"..
|
||||
"list[context;trash;3.5,1;1,1;]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
default.get_hotbar_bg(0,3) ..
|
||||
"list[current_player;main;0,3;8,4;]" ..
|
||||
"listring[]")
|
||||
"formspec_version[2]" ..
|
||||
"size["..size.."]"..
|
||||
pipeworks.fs_helpers.get_prepends(size) ..
|
||||
"item_image[0.5,0.5;1,1;pipeworks:trashcan]"..
|
||||
"label[1.5,1;"..S("Trash Can").."]"..
|
||||
list_background..
|
||||
"list[context;trash;4.5,2;1,1;]"..
|
||||
--"list[current_player;main;0,3;8,4;]" ..
|
||||
pipeworks.fs_helpers.get_inv(4)..
|
||||
"listring[context;trash]"..
|
||||
"listring[current_player;main]"
|
||||
)
|
||||
meta:set_string("infotext", S("Trash Can"))
|
||||
meta:get_inventory():set_size("trash", 1)
|
||||
end,
|
||||
end,
|
||||
after_place_node = pipeworks.after_place,
|
||||
after_dig_node = pipeworks.after_dig,
|
||||
on_metadata_inventory_put = function(pos, listname, index, stack, player)
|
||||
minetest.get_meta(pos):get_inventory():set_stack(listname, index, ItemStack(""))
|
||||
end,
|
||||
})
|
||||
|
||||
minetest.register_craft({
|
||||
output = "pipeworks:trashcan",
|
||||
recipe = {
|
||||
{ "basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{ "default:steel_ingot", "", "default:steel_ingot" },
|
||||
{ "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" },
|
||||
},
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:trashcan"
|
||||
|
@ -26,6 +26,11 @@ local texture_mt = {
|
||||
end
|
||||
}
|
||||
|
||||
-- This will remove any semi-transparent pixels
|
||||
-- because that is still buggy in Minetest, force this as default
|
||||
local texture_alpha_mode = minetest.features.use_texture_alpha_string_modes
|
||||
and "clip" or true
|
||||
|
||||
local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, ends, short, inv, special, connects, style)
|
||||
noctrs = noctrs or default_noctrs
|
||||
setmetatable(noctrs, texture_mt)
|
||||
@ -56,13 +61,13 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e
|
||||
outimgs[vti[v]] = ends[v]
|
||||
end
|
||||
|
||||
local tgroups = {snappy = 3, tube = 1, tubedevice = 1, not_in_creative_inventory = 1}
|
||||
local tgroups = {snappy = 3, tube = 1, tubedevice = 1, not_in_creative_inventory = 1, dig_generic = 4}
|
||||
local tubedesc = string.format("%s %s", desc, dump(connects))
|
||||
local iimg = type(plain[1]) == "table" and plain[1].name or plain[1]
|
||||
local wscale = {x = 1, y = 1, z = 1}
|
||||
|
||||
if #connects == 0 then
|
||||
tgroups = {snappy = 3, tube = 1, tubedevice = 1}
|
||||
tgroups = {snappy = 3, tube = 1, tubedevice = 1, dig_generic = 4}
|
||||
tubedesc = desc
|
||||
iimg=inv
|
||||
outimgs = {
|
||||
@ -75,6 +80,10 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e
|
||||
wscale = {x = 1, y = 1, z = 0.01}
|
||||
end
|
||||
|
||||
for i, tile in ipairs(outimgs) do
|
||||
outimgs[i] = pipeworks.make_tube_tile(tile)
|
||||
end
|
||||
|
||||
local rname = string.format("%s_%s", name, tname)
|
||||
table.insert(tubenodes, rname)
|
||||
|
||||
@ -82,6 +91,7 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e
|
||||
description = tubedesc,
|
||||
drawtype = "nodebox",
|
||||
tiles = outimgs,
|
||||
use_texture_alpha = texture_alpha_mode,
|
||||
sunlight_propagates = true,
|
||||
inventory_image = iimg,
|
||||
wield_image = iimg,
|
||||
@ -96,7 +106,9 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e
|
||||
fixed = outboxes
|
||||
},
|
||||
groups = tgroups,
|
||||
sounds = default.node_sound_wood_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_wood_defaults",
|
||||
},
|
||||
walkable = true,
|
||||
stack_max = 99,
|
||||
basename = name,
|
||||
@ -107,6 +119,18 @@ local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, e
|
||||
connect_sides = {front = 1, back = 1, left = 1, right = 1, top = 1, bottom = 1},
|
||||
priority = 50
|
||||
},
|
||||
on_punch = function(pos, node, player, pointed)
|
||||
local playername = player:get_player_name()
|
||||
if minetest.is_protected(pos, playername) and not minetest.check_player_privs(playername, {protection_bypass=true}) then
|
||||
return minetest.node_punch(pos, node, player, pointed)
|
||||
end
|
||||
if pipeworks.check_and_wear_hammer(player) then
|
||||
local wieldname = player:get_wielded_item():get_name()
|
||||
pipeworks.logger(string.format("%s struck a tube at %s with %s to break it.", playername, minetest.pos_to_string(pos), wieldname))
|
||||
pipeworks.break_tube(pos)
|
||||
end
|
||||
return minetest.node_punch(pos, node, player, pointed)
|
||||
end,
|
||||
after_place_node = pipeworks.after_place,
|
||||
after_dig_node = pipeworks.after_dig,
|
||||
on_rotate = false,
|
||||
@ -182,6 +206,7 @@ local register_all_tubes = function(name, desc, plain, noctrs, ends, short, inv,
|
||||
end
|
||||
end
|
||||
end
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = name.."_000000"
|
||||
else
|
||||
-- 6d tubes: uses only 10 nodes instead of 64, but the textures must be rotated
|
||||
local cconnects = {{}, {1}, {1, 2}, {1, 3}, {1, 3, 5}, {1, 2, 3}, {1, 2, 3, 5}, {1, 2, 3, 4}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5, 6}}
|
||||
@ -204,6 +229,7 @@ local register_all_tubes = function(name, desc, plain, noctrs, ends, short, inv,
|
||||
tube = {connect_sides = {front = 1, back = 1, left = 1, right = 1, top = 1, bottom = 1}},
|
||||
drop = name.."_1",
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = name.."_1"
|
||||
table.insert(tubenodes, cname)
|
||||
for xm = 0, 1 do
|
||||
for xp = 0, 1 do
|
||||
|
@ -39,48 +39,36 @@ if pipeworks.enable_mese_sand_tube then
|
||||
groups = {vacuum_tube = 1},
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local size = "6.0,2.4"
|
||||
meta:set_int("dist", 0)
|
||||
meta:set_string("formspec", "size[2.1,0.8]"..
|
||||
"image[0,0;1,1;pipeworks_mese_sand_tube_inv.png]"..
|
||||
"field[1.3,0.4;1,1;dist;radius;${dist}]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img)
|
||||
meta:set_string("formspec",
|
||||
"size["..size.."]"..
|
||||
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,
|
||||
on_receive_fields = function(pos,formname,fields,sender)
|
||||
if not pipeworks.may_configure(pos, sender) then return end
|
||||
if (fields.quit and not fields.key_enter_field)
|
||||
or (fields.key_enter_field ~= "dist" and not fields.set_dist)
|
||||
or not pipeworks.may_configure(pos, sender) then
|
||||
return
|
||||
end
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
local dist = tonumber(fields.dist)
|
||||
if dist then
|
||||
dist = math.max(0, dist)
|
||||
dist = math.min(8, 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 Pneumatic Tube Segment (@1m)", dist))
|
||||
end
|
||||
end,
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
output = "pipeworks:mese_sand_tube_1 2",
|
||||
recipe = {
|
||||
{"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" },
|
||||
{"group:sand", "default:mese_crystal", "group:sand" },
|
||||
{"basic_materials:plastic_sheet", "basic_materials:plastic_sheet", "basic_materials:plastic_sheet" }
|
||||
},
|
||||
})
|
||||
|
||||
minetest.register_craft( {
|
||||
type = "shapeless",
|
||||
output = "pipeworks:mese_sand_tube_1",
|
||||
recipe = {
|
||||
"pipeworks:sand_tube_1",
|
||||
"default:mese_crystal_fragment",
|
||||
"default:mese_crystal_fragment",
|
||||
"default:mese_crystal_fragment",
|
||||
"default:mese_crystal_fragment"
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
local function vacuum(pos, radius)
|
||||
|
64
wielder.lua
64
wielder.lua
@ -1,22 +1,33 @@
|
||||
local S = minetest.get_translator("pipeworks")
|
||||
local assumed_eye_pos = vector.new(0, 1.5, 0)
|
||||
|
||||
local function vector_copy(v)
|
||||
return { x = v.x, y = v.y, z = v.z }
|
||||
end
|
||||
|
||||
local function delay(x)
|
||||
return (function() return x end)
|
||||
end
|
||||
|
||||
local function set_wielder_formspec(data, meta)
|
||||
local size = "10.2,"..(7+data.wield_inv_height)
|
||||
local list_background = ""
|
||||
if minetest.get_modpath("i3") then
|
||||
list_background = "style_type[box;colors=#666]"
|
||||
for i=0, data.wield_inv_height-1 do
|
||||
for j=0, data.wield_inv_width-1 do
|
||||
list_background = list_background .. "box[".. ((10-data.wield_inv_width)*0.5)+(i*1.25) ..",".. 1+(j*1.25) ..";1,1;]"
|
||||
end
|
||||
end
|
||||
end
|
||||
meta:set_string("formspec",
|
||||
"invsize[8,"..(6+data.wield_inv_height)..";]"..
|
||||
"item_image[0,0;1,1;"..data.name_base.."_off]"..
|
||||
"label[1,0;"..minetest.formspec_escape(data.description).."]"..
|
||||
"list[current_name;"..minetest.formspec_escape(data.wield_inv_name)..";"..((8-data.wield_inv_width)*0.5)..",1;"..data.wield_inv_width..","..data.wield_inv_height..";]"..
|
||||
"list[current_player;main;0,"..(2+data.wield_inv_height)..";8,4;]" ..
|
||||
"listring[]")
|
||||
"formspec_version[2]" ..
|
||||
"size["..size.."]"..
|
||||
pipeworks.fs_helpers.get_prepends(size)..
|
||||
"item_image[0.5,0.5;1,1;"..data.name_base.."_off]"..
|
||||
"label[1.5,1;"..minetest.formspec_escape(data.description).."]"..
|
||||
list_background ..
|
||||
"list[context;"..minetest.formspec_escape(data.wield_inv_name)..";"..((10-data.wield_inv_width)*0.5)..",1;"..data.wield_inv_width..","..data.wield_inv_height..";]"..
|
||||
pipeworks.fs_helpers.get_inv((2+data.wield_inv_height)) ..
|
||||
"listring[context;"..minetest.formspec_escape(data.wield_inv_name).."]" ..
|
||||
"listring[current_player;main]"
|
||||
)
|
||||
meta:set_string("infotext", data.description)
|
||||
end
|
||||
|
||||
@ -188,7 +199,9 @@ local function register_wielder(data)
|
||||
paramtype2 = "facedir",
|
||||
tubelike = 1,
|
||||
groups = groups,
|
||||
sounds = default.node_sound_stone_defaults(),
|
||||
_sound_def = {
|
||||
key = "node_sound_stone_defaults",
|
||||
},
|
||||
drop = data.name_base.."_off",
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
@ -353,7 +366,7 @@ if pipeworks.enable_node_breaker then
|
||||
{pos=pointed_thing.under, gain=sound.gain})
|
||||
end
|
||||
wieldstack = virtplayer:get_wielded_item()
|
||||
else
|
||||
--~ else
|
||||
--pipeworks.logger(dname.."couldn't dig node!")
|
||||
end
|
||||
end
|
||||
@ -375,14 +388,7 @@ if pipeworks.enable_node_breaker then
|
||||
eject_drops = true,
|
||||
}
|
||||
register_wielder(data)
|
||||
minetest.register_craft({
|
||||
output = "pipeworks:nodebreaker_off",
|
||||
recipe = {
|
||||
{ "basic_materials:gear_steel", "basic_materials:gear_steel", "basic_materials:gear_steel" },
|
||||
{ "default:stone", "mesecons:piston", "default:stone" },
|
||||
{ "group:wood", "mesecons:mesecon", "group:wood" },
|
||||
}
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:nodebreaker_off"
|
||||
-- aliases for when someone had technic installed, but then uninstalled it but not pipeworks
|
||||
minetest.register_alias("technic:nodebreaker_off", "pipeworks:nodebreaker_off")
|
||||
minetest.register_alias("technic:nodebreaker_on", "pipeworks:nodebreaker_on")
|
||||
@ -426,14 +432,7 @@ if pipeworks.enable_deployer then
|
||||
end,
|
||||
eject_drops = false,
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "pipeworks:deployer_off",
|
||||
recipe = {
|
||||
{ "group:wood", "default:chest", "group:wood" },
|
||||
{ "default:stone", "mesecons:piston", "default:stone" },
|
||||
{ "default:stone", "mesecons:mesecon", "default:stone" },
|
||||
}
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:deployer_off"
|
||||
-- aliases for when someone had technic installed, but then uninstalled it but not pipeworks
|
||||
minetest.register_alias("technic:deployer_off", "pipeworks:deployer_off")
|
||||
minetest.register_alias("technic:deployer_on", "pipeworks:deployer_on")
|
||||
@ -461,12 +460,5 @@ if pipeworks.enable_dispenser then
|
||||
end,
|
||||
eject_drops = false,
|
||||
})
|
||||
minetest.register_craft({
|
||||
output = "pipeworks:dispenser_off",
|
||||
recipe = {
|
||||
{ "default:desert_sand", "default:chest", "default:desert_sand" },
|
||||
{ "default:stone", "mesecons:piston", "default:stone" },
|
||||
{ "default:stone", "mesecons:mesecon", "default:stone" },
|
||||
}
|
||||
})
|
||||
pipeworks.ui_cat_tube_list[#pipeworks.ui_cat_tube_list+1] = "pipeworks:dispenser_off"
|
||||
end
|
||||
|
Reference in New Issue
Block a user