]> git.lizzy.rs Git - xdecor.git/blob - src/mechanisms.lua
Global code style cleaning
[xdecor.git] / src / mechanisms.lua
1 -- Thanks to sofar for helping with that code.
2
3 minetest.setting_set("nodetimer_interval", 0.1)
4
5 local plate = {}
6 screwdriver = screwdriver or {}
7
8 local function door_toggle(pos_actuator, pos_door, player)
9         local player_name = player:get_player_name()
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                 -- Re-get player object (or nil) because 'player' could
25                 -- be an invalid object at this time (player left)
26                 door:close(minetest.get_player_by_name(player_name))
27         end)
28 end
29
30 function plate.construct(pos)
31         local timer = minetest.get_node_timer(pos)
32         timer:start(0.1)
33 end
34
35 function plate.timer(pos)
36         local objs = minetest.get_objects_inside_radius(pos, 0.8)
37         if not next(objs) or not doors.get then return true end
38
39         local minp = {x = pos.x - 2, y = pos.y, z = pos.z - 2}
40         local maxp = {x = pos.x + 2, y = pos.y, z = pos.z + 2}
41         local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
42
43         for _, player in pairs(objs) do
44                 if player:is_player() then
45                         for i = 1, #doors do
46                                 door_toggle(pos, doors[i], player)
47                         end
48                         break
49                 end
50         end
51
52         return true
53 end
54
55 function plate.register(material, desc, def)
56         xdecor.register("pressure_" .. material .. "_off", {
57                 description = desc .. " Pressure Plate",
58                 tiles = {"xdecor_pressure_" .. material .. ".png"},
59                 drawtype = "nodebox",
60                 node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}),
61                 groups = def.groups,
62                 sounds = def.sounds,
63                 sunlight_propagates = true,
64                 on_rotate = screwdriver.rotate_simple,
65                 on_construct = plate.construct,
66                 on_timer = plate.timer
67         })
68         xdecor.register("pressure_" .. material .. "_on", {
69                 tiles = {"xdecor_pressure_" .. material .. ".png"},
70                 drawtype = "nodebox",
71                 node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}),
72                 groups = def.groups,
73                 sounds = def.sounds,
74                 drop = "xdecor:pressure_" .. material .. "_off",
75                 sunlight_propagates = true,
76                 on_rotate = screwdriver.rotate_simple
77         })
78 end
79
80 plate.register("wood", "Wooden", {
81         sounds = default.node_sound_wood_defaults(),
82         groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2}
83 })
84
85 plate.register("stone", "Stone", {
86         sounds = default.node_sound_stone_defaults(),
87         groups = {cracky = 3, oddly_breakable_by_hand = 2}
88 })
89
90 xdecor.register("lever_off", {
91         description = "Lever",
92         tiles = {"xdecor_lever_off.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},
96         sounds = default.node_sound_stone_defaults(),
97         sunlight_propagates = true,
98         on_rotate = screwdriver.rotate_simple,
99
100         on_rightclick = function(pos, node, clicker, itemstack)
101                 if not doors.get then return itemstack end
102                 local minp = {x = pos.x - 2, y = pos.y - 1, z = pos.z - 2}
103                 local maxp = {x = pos.x + 2, y = pos.y + 1, z = pos.z + 2}
104                 local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
105
106                 for i = 1, #doors do
107                         door_toggle(pos, doors[i], clicker)
108                 end
109
110                 return itemstack
111         end
112 })
113
114 xdecor.register("lever_on", {
115         tiles = {"xdecor_lever_on.png"},
116         drawtype = "nodebox",
117         node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
118         groups = {cracky = 3, oddly_breakable_by_hand = 2, not_in_creative_inventory = 1},
119         sounds = default.node_sound_stone_defaults(),
120         sunlight_propagates = true,
121         on_rotate = screwdriver.rotate_simple,
122         drop = "xdecor:lever_off"
123 })
124
125 -- Recipes
126
127 minetest.register_craft({
128         output = "xdecor:pressure_stone_off",
129         type = "shapeless",
130         recipe = {"group:stone", "group:stone"}
131 })
132
133 minetest.register_craft({
134         output = "xdecor:pressure_wood_off",
135         type = "shapeless",
136         recipe = {"group:wood", "group:wood"}
137 })
138
139 minetest.register_craft({
140         output = "xdecor:lever_off",
141         recipe = {
142                 {"group:stick"},
143                 {"group:stone"}
144         }
145 })