]> git.lizzy.rs Git - xdecor.git/blob - mechanisms.lua
Craftguide: Start item listing at index instead of skipping there.
[xdecor.git] / 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 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)
96                 if not doors.get then return 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         end
105 })
106
107 xdecor.register("lever_on", {
108         tiles = {"xdecor_lever_on.png"},
109         drawtype = "nodebox",
110         node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
111         groups = {cracky=3, oddly_breakable_by_hand=2, not_in_creative_inventory=1},
112         sounds = default.node_sound_stone_defaults(),
113         sunlight_propagates = true,
114         on_rotate = screwdriver.rotate_simple,
115         drop = "xdecor:lever_off"
116 })
117