diff options
Diffstat (limited to 'devices.lua')
-rw-r--r-- | devices.lua | 260 |
1 files changed, 163 insertions, 97 deletions
diff --git a/devices.lua b/devices.lua index e4c5f43..0121e2f 100644 --- a/devices.lua +++ b/devices.lua @@ -1,3 +1,84 @@ + +-- rotation handlers + +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") + minetest.swap_node(pos, { name = newnode, param2 = new_param2 }) + pipeworks.scan_for_pipe_objects(pos) + + return true +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) + and not minetest.is_protected(pointed_thing.above, playername) then + + local node = minetest.get_node(pointed_thing.under) + + 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) + else + + local pitch = placer:get_look_pitch() + local above = pointed_thing.above + 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 + + -- check if the object should be turned vertically + if above.x == under.x + and above.z == under.z + and ( + string.find(uname, "pipeworks:pipe_") + or string.find(uname, "pipeworks:storage_") + or string.find(uname, "pipeworks:expansion_") + or ( string.find(uname, "pipeworks:grating") and not isabove ) + or ( string.find(uname, "pipeworks:pump_") and not isabove ) + + or ( + ( string.find(uname, "pipeworks:valve") + or string.find(uname, "pipeworks:entry_panel") + or string.find(uname, "pipeworks:flow_sensor") ) + and minetest.facedir_to_dir(undernode.param2).y ~= 0 ) + ) + then + fdir = 17 + end + + if minetest.registered_nodes[uname] + and minetest.registered_nodes[uname]["buildable_to"] then + pos1 = under + end + + if minetest.registered_nodes[minetest.get_node(pos1).name] + and not minetest.registered_nodes[minetest.get_node(pos1).name]["buildable_to"] then return end + + local placednode = string.gsub(itemstack:get_name(), "_loaded", "_empty") + placednode = string.gsub(placednode, "_on", "_off") + + minetest.add_node(pos1, {name = placednode, param2 = fdir }) + pipeworks.scan_for_pipe_objects(pos1) + + if not pipeworks.expect_infinite_stacks then + itemstack:take_item() + end + end + end + return itemstack +end + -- List of devices that should participate in the autoplace algorithm local pipereceptor_on = nil @@ -58,6 +139,7 @@ for s in ipairs(states) do groups = dgroups, sounds = default.node_sound_wood_defaults(), walkable = true, + pipe_connections = { top = 1 }, after_place_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, @@ -73,10 +155,11 @@ for s in ipairs(states) do minetest.add_node(pos,{name="pipeworks:pump_off", param2 = node.param2}) end }}, - on_punch = function(pos, node, puncher) - local fdir = minetest.get_node(pos).param2 + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local fdir = node.param2 minetest.add_node(pos, { name = "pipeworks:pump_"..states[3-s], param2 = fdir }) - end + end, + on_rotate = screwdriver.rotate_simple }) minetest.register_node("pipeworks:valve_"..states[s].."_empty", { @@ -89,22 +172,20 @@ for s in ipairs(states) do paramtype2 = "facedir", selection_box = { type = "fixed", - fixed = { -8/16, -4/16, -5/16, 8/16, 5/16, 5/16 } + fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 } }, collision_box = { type = "fixed", - fixed = { -8/16, -4/16, -5/16, 8/16, 5/16, 5/16 } + fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 } }, groups = dgroups, sounds = default.node_sound_wood_defaults(), walkable = true, - after_place_node = function(pos) - pipeworks.scan_for_pipe_objects(pos) - end, + on_place = pipeworks.rotate_on_place, after_dig_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, - drop = "pipeworks:valve_off_empty", + drop = "pipeworks:valve_off_empty", mesecons = {effector = { action_on = function (pos, node) minetest.add_node(pos,{name="pipeworks:valve_on_empty", param2 = node.param2}) @@ -113,10 +194,11 @@ for s in ipairs(states) do minetest.add_node(pos,{name="pipeworks:valve_off_empty", param2 = node.param2}) end }}, - on_punch = function(pos, node, puncher) - local fdir = minetest.get_node(pos).param2 + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local fdir = node.param2 minetest.add_node(pos, { name = "pipeworks:valve_"..states[3-s].."_empty", param2 = fdir }) - end + end, + on_rotate = pipeworks.fix_after_rotation }) end @@ -130,18 +212,16 @@ minetest.register_node("pipeworks:valve_on_loaded", { paramtype2 = "facedir", selection_box = { type = "fixed", - fixed = { -8/16, -4/16, -5/16, 8/16, 5/16, 5/16 } + fixed = { -5/16, -4/16, -8/16, 5/16, 5/16, 8/16 } }, collision_box = { type = "fixed", - fixed = { -8/16, -4/16, -5/16, 8/16, 5/16, 5/16 } + 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_wood_defaults(), walkable = true, - after_place_node = function(pos) - pipeworks.scan_for_pipe_objects(pos) - end, + on_place = pipeworks.rotate_on_place, after_dig_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, @@ -154,10 +234,11 @@ minetest.register_node("pipeworks:valve_on_loaded", { minetest.add_node(pos,{name="pipeworks:valve_off_empty", param2 = node.param2}) end }}, - on_punch = function(pos, node, puncher) - local fdir = minetest.get_node(pos).param2 + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + local fdir = node.param2 minetest.add_node(pos, { name = "pipeworks:valve_off_empty", param2 = fdir }) - end + end, + on_rotate = pipeworks.fix_after_rotation }) -- grating @@ -172,17 +253,24 @@ minetest.register_node("pipeworks:grating", { "pipeworks_grating_sides.png", "pipeworks_grating_sides.png" }, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { -0.49, -0.49, -0.49, 0.49, 0.5, 0.49 } + }, sunlight_propagates = true, paramtype = "light", groups = {snappy=3, pipe=1}, sounds = default.node_sound_wood_defaults(), walkable = true, + pipe_connections = { top = 1 }, after_place_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, after_dig_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, + on_rotate = false }) -- outlet spigot @@ -198,6 +286,8 @@ minetest.register_node("pipeworks:spigot", { groups = {snappy=3, pipe=1}, sounds = default.node_sound_wood_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 }, after_place_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, @@ -211,7 +301,8 @@ minetest.register_node("pipeworks:spigot", { collision_box = { type = "fixed", fixed = { -2/16, -6/16, -2/16, 2/16, 2/16, 8/16 } - } + }, + on_rotate = pipeworks.fix_after_rotation }) minetest.register_node("pipeworks:spigot_pouring", { @@ -236,7 +327,10 @@ minetest.register_node("pipeworks:spigot_pouring", { groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, sounds = default.node_sound_wood_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 }, after_place_node = function(pos) + minetest.set_node(pos, { name = "pipeworks:spigot", param2 = minetest.get_node(pos).param2 }) pipeworks.scan_for_pipe_objects(pos) end, after_dig_node = function(pos) @@ -251,6 +345,7 @@ minetest.register_node("pipeworks:spigot_pouring", { fixed = { -2/16, -6/16, -2/16, 2/16, 2/16, 8/16 } }, drop = "pipeworks:spigot", + on_rotate = pipeworks.fix_after_rotation }) -- sealed pipe entry/exit (horizontal pipe passing through a metal @@ -274,66 +369,13 @@ minetest.register_node("pipeworks:entry_panel_empty", { groups = {snappy=3, pipe=1}, sounds = default.node_sound_wood_defaults(), walkable = true, - after_place_node = function(pos) - pipeworks.scan_for_pipe_objects(pos) - end, + on_place = pipeworks.rotate_on_place, after_dig_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, selection_box = panel_cbox, collision_box = panel_cbox, - on_place = function(itemstack, placer, pointed_thing) - local playername = placer:get_player_name() - 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) - - if not minetest.registered_nodes[node.name] - or not minetest.registered_nodes[node.name].on_rightclick then - local pitch = placer:get_look_pitch() - local above = pointed_thing.above - 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 - - if above.x == under.x - and above.z == under.z - and ( string.find(uname, "pipeworks:pipe_") - or string.find(uname, "pipeworks:storage_") - or string.find(uname, "pipeworks:expansion_") - or ( string.find(uname, "pipeworks:grating") and not isabove ) - or ( string.find(uname, "pipeworks:pump_") and not isabove ) - or ( string.find(uname, "pipeworks:entry_panel") - and undernode.param2 == 13 ) - ) - then - fdir = 13 - end - - if minetest.registered_nodes[uname]["buildable_to"] then - pos1 = under - end - - if not minetest.registered_nodes[minetest.get_node(pos1).name]["buildable_to"] then return end - - minetest.add_node(pos1, {name = "pipeworks:entry_panel_empty", param2 = fdir }) - pipeworks.scan_for_pipe_objects(pos1) - - if not pipeworks.expect_infinite_stacks then - itemstack:take_item() - end - - else - minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) - end - end - return itemstack - end + on_rotate = pipeworks.fix_after_rotation }) minetest.register_node("pipeworks:entry_panel_loaded", { @@ -346,15 +388,14 @@ minetest.register_node("pipeworks:entry_panel_loaded", { groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, sounds = default.node_sound_wood_defaults(), walkable = true, - after_place_node = function(pos) - pipeworks.scan_for_pipe_objects(pos) - end, + on_place = pipeworks.rotate_on_place, after_dig_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, selection_box = panel_cbox, collision_box = panel_cbox, - drop = "pipeworks:entry_panel_empty" + drop = "pipeworks:entry_panel_empty", + on_rotate = pipeworks.fix_after_rotation }) minetest.register_node("pipeworks:flow_sensor_empty", { @@ -368,9 +409,7 @@ minetest.register_node("pipeworks:flow_sensor_empty", { groups = {snappy=3, pipe=1}, sounds = default.node_sound_wood_defaults(), walkable = true, - after_place_node = function(pos) - pipeworks.scan_for_pipe_objects(pos) - end, + on_place = pipeworks.rotate_on_place, after_dig_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, @@ -382,18 +421,19 @@ minetest.register_node("pipeworks:flow_sensor_empty", { selection_box = { type = "fixed", fixed = { - { -8/16, -2/16, -2/16, 8/16, 2/16, 2/16 }, - { -4/16, -3/16, -3/16, 4/16, 3/16, 3/16 }, + { -2/16, -2/16, -8/16, 2/16, 2/16, 8/16 }, + { -3/16, -3/16, -4/16, 3/16, 3/16, 4/16 }, } }, collision_box = { type = "fixed", fixed = { - { -8/16, -2/16, -2/16, 8/16, 2/16, 2/16 }, - { -4/16, -3/16, -3/16, 4/16, 3/16, 3/16 }, + { -2/16, -2/16, -8/16, 2/16, 2/16, 8/16 }, + { -3/16, -3/16, -4/16, 3/16, 3/16, 4/16 }, } }, - mesecons = pipereceptor_off + mesecons = pipereceptor_off, + on_rotate = pipeworks.fix_after_rotation }) minetest.register_node("pipeworks:flow_sensor_loaded", { @@ -407,9 +447,7 @@ minetest.register_node("pipeworks:flow_sensor_loaded", { groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, sounds = default.node_sound_wood_defaults(), walkable = true, - after_place_node = function(pos) - pipeworks.scan_for_pipe_objects(pos) - end, + on_place = pipeworks.rotate_on_place, after_dig_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, @@ -421,19 +459,20 @@ minetest.register_node("pipeworks:flow_sensor_loaded", { selection_box = { type = "fixed", fixed = { - { -8/16, -2/16, -2/16, 8/16, 2/16, 2/16 }, - { -4/16, -3/16, -3/16, 4/16, 3/16, 3/16 }, + { -2/16, -2/16, -8/16, 2/16, 2/16, 8/16 }, + { -3/16, -3/16, -4/16, 3/16, 3/16, 4/16 }, } }, collision_box = { type = "fixed", fixed = { - { -8/16, -2/16, -2/16, 8/16, 2/16, 2/16 }, - { -4/16, -3/16, -3/16, 4/16, 3/16, 3/16 }, + { -2/16, -2/16, -8/16, 2/16, 2/16, 8/16 }, + { -3/16, -3/16, -4/16, 3/16, 3/16, 4/16 }, } }, drop = "pipeworks:flow_sensor_empty", - mesecons = pipereceptor_on + mesecons = pipereceptor_on, + on_rotate = pipeworks.fix_after_rotation }) -- tanks @@ -466,6 +505,7 @@ for fill = 0, 10 do sounds = default.node_sound_wood_defaults(), walkable = true, drop = "pipeworks:storage_tank_0", + pipe_connections = { top = 1, bottom = 1}, after_place_node = function(pos) pipeworks.look_for_stackable_tanks(pos) pipeworks.scan_for_pipe_objects(pos) @@ -473,6 +513,7 @@ for fill = 0, 10 do after_dig_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, + on_rotate = false }) minetest.register_node("pipeworks:storage_tank_"..fill, { @@ -492,6 +533,7 @@ for fill = 0, 10 do sounds = default.node_sound_wood_defaults(), walkable = true, drop = "pipeworks:storage_tank_0", + pipe_connections = { top = 1, bottom = 1}, after_place_node = function(pos) pipeworks.look_for_stackable_tanks(pos) pipeworks.scan_for_pipe_objects(pos) @@ -499,6 +541,7 @@ for fill = 0, 10 do after_dig_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, + on_rotate = false }) end @@ -514,6 +557,7 @@ minetest.register_node("pipeworks:fountainhead", { groups = {snappy=3, pipe=1}, sounds = default.node_sound_wood_defaults(), walkable = true, + pipe_connections = { bottom = 1 }, after_place_node = function(pos) pipeworks.scan_for_pipe_objects(pos) end, @@ -533,6 +577,7 @@ minetest.register_node("pipeworks:fountainhead", { type = "fixed", fixed = { -2/16, -8/16, -2/16, 2/16, 8/16, 2/16 } }, + on_rotate = false }) minetest.register_node("pipeworks:fountainhead_pouring", { @@ -545,7 +590,9 @@ minetest.register_node("pipeworks:fountainhead_pouring", { groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, sounds = default.node_sound_wood_defaults(), walkable = true, + pipe_connections = { bottom = 1 }, after_place_node = function(pos) + minetest.set_node(pos, { name = "pipeworks:fountainhead", param2 = minetest.get_node(pos).param2 }) pipeworks.scan_for_pipe_objects(pos) end, after_dig_node = function(pos) @@ -564,9 +611,28 @@ minetest.register_node("pipeworks:fountainhead_pouring", { type = "fixed", fixed = { -2/16, -8/16, -2/16, 2/16, 8/16, 2/16 } }, - drop = "pipeworks:fountainhead" + drop = "pipeworks:fountainhead", + on_rotate = false }) minetest.register_alias("pipeworks:valve_off_loaded", "pipeworks:valve_off_empty") minetest.register_alias("pipeworks:entry_panel", "pipeworks:entry_panel_empty") +minetest.register_lbm({ + name = "pipeworks:rotate_valves_flowsensors", + label = "Flip pipeworks valves and flow sensors around X/Z", + run_at_every_load = false, + nodenames = { + "pipeworks:flow_sensor_empty", + "pipeworks:flow_sensor_loaded", + "pipeworks:valve_off_empty", + "pipeworks:valve_on_empty", + "pipeworks:valve_off_loaded", + }, + action = function(pos, node) + local dir = minetest.facedir_to_dir(node.param2) + local newdir = { x=dir.z, y=dir.y, z=dir.x } + local newfdir = minetest.dir_to_facedir(newdir) + minetest.swap_node(pos, { name = node.name, param2 = newfdir }) + end +}) |