]> git.lizzy.rs Git - xdecor.git/blob - src/mechanisms.lua
Final door toggle crash fix
[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         local minp = {x=pos.x-2, y=pos.y, z=pos.z-2}
39         local maxp = {x=pos.x+2, y=pos.y, z=pos.z+2}
40         local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
41
42         for _, player in pairs(objs) do
43                 if player:is_player() then
44                         for i=1, #doors do
45                                 door_toggle(pos, doors[i], player)
46                         end
47                         break
48                 end
49         end
50         return true
51 end
52
53 function plate.register(material, desc, def)
54         xdecor.register("pressure_"..material.."_off", {
55                 description = desc.." Pressure Plate",
56                 tiles = {"xdecor_pressure_"..material..".png"},
57                 drawtype = "nodebox",
58                 node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}),
59                 groups = def.groups,
60                 sounds = def.sounds,
61                 sunlight_propagates = true,
62                 on_rotate = screwdriver.rotate_simple,
63                 on_construct = plate.construct,
64                 on_timer = plate.timer
65         })
66         xdecor.register("pressure_"..material.."_on", {
67                 tiles = {"xdecor_pressure_"..material..".png"},
68                 drawtype = "nodebox",
69                 node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}),
70                 groups = def.groups,
71                 sounds = def.sounds,
72                 drop = "xdecor:pressure_"..material.."_off",
73                 sunlight_propagates = true,
74                 on_rotate = screwdriver.rotate_simple
75         })
76 end
77
78 plate.register("wood", "Wooden", {
79         sounds = default.node_sound_wood_defaults(),
80         groups = {choppy=3, oddly_breakable_by_hand=2, flammable=2}
81 })
82
83 plate.register("stone", "Stone", {
84         sounds = default.node_sound_stone_defaults(),
85         groups = {cracky=3, oddly_breakable_by_hand=2}
86 })
87
88 xdecor.register("lever_off", {
89         description = "Lever",
90         tiles = {"xdecor_lever_off.png"},
91         drawtype = "nodebox",
92         node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
93         groups = {cracky=3, oddly_breakable_by_hand=2},
94         sounds = default.node_sound_stone_defaults(),
95         sunlight_propagates = true,
96         on_rotate = screwdriver.rotate_simple,
97         on_rightclick = function(pos, node, clicker, itemstack)
98                 if not doors.get then return itemstack end
99                 local minp = {x=pos.x-2, y=pos.y-1, z=pos.z-2}
100                 local maxp = {x=pos.x+2, y=pos.y+1, z=pos.z+2}
101                 local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
102
103                 for i=1, #doors do
104                         door_toggle(pos, doors[i], clicker)
105                 end
106                 return itemstack
107         end
108 })
109
110 xdecor.register("lever_on", {
111         tiles = {"xdecor_lever_on.png"},
112         drawtype = "nodebox",
113         node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
114         groups = {cracky=3, oddly_breakable_by_hand=2, not_in_creative_inventory=1},
115         sounds = default.node_sound_stone_defaults(),
116         sunlight_propagates = true,
117         on_rotate = screwdriver.rotate_simple,
118         drop = "xdecor:lever_off"
119 })
120
121 -- Recipes
122
123 minetest.register_craft({
124         output = "xdecor:pressure_stone_off",
125         type = "shapeless",
126         recipe = {"group:stone", "group:stone"}
127 })
128
129 minetest.register_craft({
130         output = "xdecor:pressure_wood_off",
131         type = "shapeless",
132         recipe = {"group:wood", "group:wood"}
133 })
134
135 minetest.register_craft({
136         output = "xdecor:lever_off",
137         recipe = {
138                 {"group:stick"},
139                 {"group:stone"}
140         }
141 })