]> git.lizzy.rs Git - xdecor.git/blob - src/mechanisms.lua
5ca73a96e8c6759bcb15a94e7306464d35f9ec83
[xdecor.git] / src / mechanisms.lua
1 --[[ Thanks to sofar for helping with that code.
2 Recommended setting in minetest.conf (requires 0.4.14 or newer) :
3         nodetimer_interval = 0.1
4 ]]
5
6 local plate = {}
7 screwdriver = screwdriver or {}
8
9 local function door_toggle(pos_actuator, pos_door, player)
10         local actuator = minetest.get_node(pos_actuator)
11         local door = doors.get(pos_door)
12
13         if actuator.name:sub(-4) == "_off" then
14                 minetest.set_node(pos_actuator,
15                         {name=actuator.name:gsub("_off", "_on"), param2=actuator.param2})
16         end
17         door:open(player)
18
19         minetest.after(2, function()
20                 if minetest.get_node(pos_actuator).name:sub(-3) == "_on" then
21                         minetest.set_node(pos_actuator,
22                                 {name=actuator.name, param2=actuator.param2})
23                 end
24                 door:close(player)
25         end)
26 end
27
28 function plate.construct(pos)
29         local timer = minetest.get_node_timer(pos)
30         timer:start(0.1)
31 end
32
33 function plate.timer(pos)
34         local objs = minetest.get_objects_inside_radius(pos, 0.8)
35         if not next(objs) or not doors.get then return true end
36         local minp = {x=pos.x-2, y=pos.y, z=pos.z-2}
37         local maxp = {x=pos.x+2, y=pos.y, z=pos.z+2}
38         local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
39
40         for _, player in pairs(objs) do
41                 if player:is_player() then
42                         for i=1, #doors do
43                                 door_toggle(pos, doors[i], player)
44                         end
45                         break
46                 end
47         end
48         return true
49 end
50
51 function plate.register(material, desc, def)
52         xdecor.register("pressure_"..material.."_off", {
53                 description = desc.." Pressure Plate",
54                 tiles = {"xdecor_pressure_"..material..".png"},
55                 drawtype = "nodebox",
56                 node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}),
57                 groups = def.groups,
58                 sounds = def.sounds,
59                 sunlight_propagates = true,
60                 on_rotate = screwdriver.rotate_simple,
61                 on_construct = plate.construct,
62                 on_timer = plate.timer
63         })
64         xdecor.register("pressure_"..material.."_on", {
65                 tiles = {"xdecor_pressure_"..material..".png"},
66                 drawtype = "nodebox",
67                 node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}),
68                 groups = def.groups,
69                 sounds = def.sounds,
70                 drop = "xdecor:pressure_"..material.."_off",
71                 sunlight_propagates = true,
72                 on_rotate = screwdriver.rotate_simple
73         })
74 end
75
76 plate.register("wood", "Wooden", {
77         sounds = default.node_sound_wood_defaults(),
78         groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2}
79 })
80
81 plate.register("stone", "Stone", {
82         sounds = default.node_sound_stone_defaults(),
83         groups = {cracky=3, oddly_breakable_by_hand=2}
84 })
85
86 xdecor.register("lever_off", {
87         description = "Lever",
88         tiles = {"xdecor_lever_off.png"},
89         drawtype = "nodebox",
90         node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
91         groups = {cracky=3, oddly_breakable_by_hand=2},
92         sounds = default.node_sound_stone_defaults(),
93         sunlight_propagates = true,
94         on_rotate = screwdriver.rotate_simple,
95         on_rightclick = function(pos, node, clicker, itemstack)
96                 if not doors.get then return itemstack end
97                 local minp = {x=pos.x-2, y=pos.y-1, z=pos.z-2}
98                 local maxp = {x=pos.x+2, y=pos.y+1, z=pos.z+2}
99                 local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
100
101                 for i=1, #doors do
102                         door_toggle(pos, doors[i], clicker)
103                 end
104                 return itemstack
105         end
106 })
107
108 xdecor.register("lever_on", {
109         tiles = {"xdecor_lever_on.png"},
110         drawtype = "nodebox",
111         node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
112         groups = {cracky=3, oddly_breakable_by_hand=2, not_in_creative_inventory=1},
113         sounds = default.node_sound_stone_defaults(),
114         sunlight_propagates = true,
115         on_rotate = screwdriver.rotate_simple,
116         drop = "xdecor:lever_off"
117 })
118