summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--depends.txt1
-rw-r--r--init.lua1
-rw-r--r--piston.lua190
-rw-r--r--sounds/digistuff_piston_extend.oggbin0 -> 6301 bytes
-rw-r--r--sounds/digistuff_piston_retract.oggbin0 -> 6214 bytes
-rw-r--r--textures/digistuff_piston_sides.pngbin0 -> 5179 bytes
6 files changed, 192 insertions, 0 deletions
diff --git a/depends.txt b/depends.txt
index a581a9b..cfb8465 100644
--- a/depends.txt
+++ b/depends.txt
@@ -1,3 +1,4 @@
default?
digilines
mesecons?
+mesecons_mvps?
diff --git a/init.lua b/init.lua
index 4fa7a2b..13786a6 100644
--- a/init.lua
+++ b/init.lua
@@ -11,6 +11,7 @@ local components = {
"piezo",
"detector",
"conductors",
+ "piston",
}
for _,name in ipairs(components) do
dofile(string.format("%s%s%s.lua",minetest.get_modpath(minetest.get_current_modname()),DIR_DELIM,name))
diff --git a/piston.lua b/piston.lua
new file mode 100644
index 0000000..cb3fc6b
--- /dev/null
+++ b/piston.lua
@@ -0,0 +1,190 @@
+if not minetest.get_modpath("mesecons_mvps") then
+ minetest.log("error","mesecons_mvps is not installed - digilines piston will not be available!")
+ return
+end
+
+local function extend(pos,node,max)
+ local meta = minetest.get_meta(pos):to_table()
+ local facedir = minetest.facedir_to_dir(node.param2)
+ local actiondir = vector.multiply(facedir,-1)
+ local ppos = vector.add(pos,actiondir)
+ local success,stack,oldstack = mesecon.mvps_push(ppos,actiondir,max)
+ if not success then return end
+ minetest.sound_play("digistuff_piston_extend",{pos = pos,max_hear_distance = 20,gain = 0.6})
+ minetest.swap_node(pos,{name = "digistuff:piston_ext",param2 = node.param2})
+ minetest.swap_node(ppos,{name = "digistuff:piston_pusher",param2 = node.param2})
+ mesecon.mvps_process_stack(stack)
+ mesecon.mvps_move_objects(ppos,actiondir,oldstack)
+ minetest.get_meta(pos):from_table(meta)
+end
+
+local function retract(pos,node,max,allsticky)
+ local facedir = minetest.facedir_to_dir(node.param2)
+ local actiondir = vector.multiply(facedir,-1)
+ local ppos = vector.add(pos,actiondir)
+ minetest.swap_node(pos,{name = "digistuff:piston",param2 = node.param2})
+ if minetest.get_node(ppos).name == "digistuff:piston_pusher" then
+ minetest.remove_node(ppos)
+ end
+ minetest.sound_play("digistuff_piston_retract",{pos = pos,max_hear_distance = 20,gain = 0.6})
+ minetest.check_for_falling(ppos)
+ if type(max) ~= "number" or max <= 0 then return end
+ local pullpos = vector.add(pos,vector.multiply(actiondir,2))
+ local success,stack,oldstack
+ if allsticky then
+ success,stack,oldstack = mesecon.mvps_pull_all(pullpos,facedir,max)
+ else
+ success,stack,oldstack = mesecon.mvps_pull_single(pullpos,facedir,max)
+ end
+ if success then
+ mesecon.mvps_move_objects(pullpos,actiondir,oldstack,-1)
+ end
+end
+
+minetest.register_node("digistuff:piston", {
+ description = "Digilines Piston",
+ groups = {cracky=3},
+ paramtype2 = "facedir",
+ on_construct = function(pos)
+ local meta = minetest.get_meta(pos)
+ meta:set_string("formspec","field[channel;Channel;${channel}")
+ end,
+ tiles = {
+ "digistuff_piston_sides.png^[transformR180",
+ "digistuff_piston_sides.png",
+ "digistuff_piston_sides.png^[transformR90",
+ "digistuff_piston_sides.png^[transformR270",
+ "digistuff_camera_pole.png",
+ "digistuff_camera_pole.png",
+ },
+ on_receive_fields = function(pos, formname, fields, sender)
+ local name = sender:get_player_name()
+ if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ minetest.record_protection_violation(pos,name)
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ if fields.channel then meta:set_string("channel",fields.channel) end
+ end,
+ digiline =
+ {
+ receptor = {},
+ effector = {
+ action = function(pos,node,channel,msg)
+ local meta = minetest.get_meta(pos)
+ local setchan = meta:get_string("channel")
+ if channel ~= setchan then return end
+ if msg == "extend" then
+ extend(pos,node,16)
+ elseif type(msg) == "table" and msg.action == "extend" then
+ local max = 16
+ if type(msg.max) == "number" then
+ max = math.max(0,math.min(16,math.floor(msg.max)))
+ end
+ extend(pos,node,max)
+ end
+ end
+ },
+ },
+})
+
+minetest.register_node("digistuff:piston_ext", {
+ description = "Digilines Piston (extended state - you hacker you!)",
+ groups = {cracky = 3,not_in_creative_inventory = 1},
+ paramtype2 = "facedir",
+ tiles = {
+ "digistuff_piston_sides.png^[transformR180",
+ "digistuff_piston_sides.png",
+ "digistuff_piston_sides.png^[transformR90",
+ "digistuff_piston_sides.png^[transformR270",
+ "digistuff_camera_pole.png",
+ "digistuff_camera_pole.png",
+ },
+ drop = "digistuff:piston",
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,-0.5,-0.3,0.5,0.5,0.5},
+ {-0.2,-0.2,-0.5,0.2,0.2,-0.3},
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,-0.5,-1.5,0.5,0.5,0.5},
+ }
+ },
+ on_rotate = function() return false end,
+ on_receive_fields = function(pos, formname, fields, sender)
+ local name = sender:get_player_name()
+ if minetest.is_protected(pos,name) and not minetest.check_player_privs(name,{protection_bypass=true}) then
+ minetest.record_protection_violation(pos,name)
+ return
+ end
+ local meta = minetest.get_meta(pos)
+ if fields.channel then meta:set_string("channel",fields.channel) end
+ end,
+ after_dig_node = function(pos,node)
+ local pdir = vector.multiply(minetest.facedir_to_dir(node.param2),-1)
+ local ppos = vector.add(pos,pdir)
+ if minetest.get_node(ppos).name == "digistuff:piston_pusher" then
+ minetest.remove_node(ppos)
+ end
+ end,
+ digiline =
+ {
+ receptor = {},
+ effector = {
+ action = function(pos,node,channel,msg)
+ local meta = minetest.get_meta(pos)
+ local setchan = meta:get_string("channel")
+ if channel ~= setchan then return end
+ if msg == "retract" then
+ retract(pos,node)
+ elseif msg == "retract_sticky" then
+ retract(pos,node,16)
+ elseif type(msg) == "table" and msg.action == "retract" then
+ local max = 16
+ if type(msg.max) == "number" then
+ max = math.max(0,math.min(16,math.floor(msg.max)))
+ elseif msg.max == nil then
+ max = 0
+ end
+ retract(pos,node,max,msg.allsticky)
+ end
+ end
+ },
+ },
+})
+
+minetest.register_node("digistuff:piston_pusher", {
+ description = "Digilines Piston Pusher (you hacker you!)",
+ groups = {not_in_creative_inventory=1},
+ paramtype2 = "facedir",
+ tiles = {
+ "digistuff_piston_sides.png^[transformR180",
+ "digistuff_piston_sides.png",
+ "digistuff_piston_sides.png^[transformR90",
+ "digistuff_piston_sides.png^[transformR270",
+ "digistuff_camera_pole.png",
+ "digistuff_camera_pole.png",
+ },
+ drawtype = "nodebox",
+ node_box = {
+ type = "fixed",
+ fixed = {
+ {-0.5,-0.5,-0.5,0.5,0.5,-0.3},
+ {-0.2,-0.2,-0.3,0.2,0.2,0.5},
+ }
+ },
+ selection_box = {
+ type = "fixed",
+ fixed = {
+ {0,0,0,0,0,0},
+ }
+ },
+})
+
+mesecon.register_mvps_stopper("digistuff:piston_ext")
+mesecon.register_mvps_stopper("digistuff:piston_pusher")
diff --git a/sounds/digistuff_piston_extend.ogg b/sounds/digistuff_piston_extend.ogg
new file mode 100644
index 0000000..2a855df
--- /dev/null
+++ b/sounds/digistuff_piston_extend.ogg
Binary files differ
diff --git a/sounds/digistuff_piston_retract.ogg b/sounds/digistuff_piston_retract.ogg
new file mode 100644
index 0000000..57f9342
--- /dev/null
+++ b/sounds/digistuff_piston_retract.ogg
Binary files differ
diff --git a/textures/digistuff_piston_sides.png b/textures/digistuff_piston_sides.png
new file mode 100644
index 0000000..5475f50
--- /dev/null
+++ b/textures/digistuff_piston_sides.png
Binary files differ