]> git.lizzy.rs Git - Crafter.git/blob - mods/redstone/pressure_plate.lua
Optimize and enable touch_hurt and hurt_inside collision detection
[Crafter.git] / mods / redstone / pressure_plate.lua
1 for level = 0,9 do
2 local subtracter = 0
3 if level > 0 then subtracter = 1 end
4 minetest.register_node("redstone:pressure_plate_"..level, {
5     description = "Pressure Plate",
6     tiles = {"stone.png"},
7     groups = {stone = 1, hard = 1, pickaxe = 1, hand = 4,attached_node = 1,redstone_torch=level, redstone_power=level,pressure_plate=level+1,pressure_plate_on=level},
8     sounds = main.stoneSound(),
9     paramtype = "light",
10         --paramtype2 = "facedir",
11         sunlight_propagates = true,
12         --walkable = false,
13         drawtype= "nodebox",
14         drop="redstone:pressure_plate_0",
15         node_box = {
16                 type = "fixed",
17                 fixed = {
18                                 --left  front  bottom right back top
19                                 {-0.5, -0.5,  -0.5, 0.5,  -0.4-(0.05*subtracter), 0.5}
20                         },
21                 },
22         on_rightclick = function(pos, node, clicker, itemstack, pointed_thing)
23         end,
24         redstone_activation = function(pos)
25         end,
26         redstone_deactivation = function(pos)
27         end,
28         on_timer = function(pos, elapsed)
29         end,
30         on_dig = function(pos, node, digger)
31                 redstone.collect_info(pos)
32                 minetest.node_dig(pos, node, digger)
33         end,
34         redstone_update = function(pos)
35         end,
36         after_place_node = function(pos, placer, itemstack, pointed_thing)
37         end,
38         on_construct = function(pos)
39         end,
40         after_destruct = function(pos)
41         end,
42 })
43 end
44
45
46 minetest.register_abm{
47     label = "Redstone Pressure Plate",
48         nodenames = {"group:pressure_plate"},
49         --neighbors = {"group:water"},
50         interval = 0.1,
51         chance = 1,
52         action = function(pos)
53                 local power_level = 0
54                 local level = minetest.get_item_group(minetest.get_node(pos).name, "pressure_plate_on")
55                 --detect players
56                 for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1.2)) do
57                         if object:is_player() and object:get_hp() > 0 then
58                                 local pos2 = object:get_pos()
59                                 local compare = vector.subtract(pos2,pos)
60                                 local real_y = compare.y
61                                 compare = vector.abs(compare)
62                                 if real_y <= -0.35 and real_y > -0.5 and compare.x < 0.8 and compare.z < 0.8 then
63                                         power_level = 9
64                                 end
65                         end
66                 end
67                 --detect items
68                 if power_level ~= 9 then
69                         for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1.2)) do
70                                 if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then
71                                         local pos2 = object:get_pos()
72                                         pos2.y = pos2.y + object:get_properties().collisionbox[2]
73                                         local compare = vector.subtract(pos2,pos)
74                                         local real_y = compare.y
75                                         compare = vector.abs(compare)
76                                         if real_y <= -0.35 and real_y > -0.5 and compare.x < 0.6 and compare.z < 0.6 then
77                                                 if power_level < 9 then
78                                                         power_level = power_level + 1
79                                                 else
80                                                         break
81                                                 end
82                                         end
83                                 end
84                         end     
85                 end
86                 if level ~= power_level then
87                         minetest.sound_play("lever", {pos=pos})
88                         minetest.swap_node(pos,{name="redstone:pressure_plate_"..power_level})
89                         redstone.collect_info(pos)
90                 end
91         end,
92 }