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