xdecor/mechanisms.lua

102 lines
3.0 KiB
Lua
Raw Normal View History

2016-02-27 11:54:38 -08:00
-- Thanks to sofar for helping with that code.
local plate = {}
screwdriver = screwdriver or {}
2016-02-27 11:54:38 -08:00
2016-02-28 02:38:57 -08:00
local function door_toggle(pos_actuator, pos_door, player)
local actuator = minetest.get_node(pos_actuator)
2016-02-27 11:54:38 -08:00
local door = doors.get(pos_door)
2016-02-28 02:38:57 -08:00
minetest.set_node(pos_actuator, {name=actuator.name:gsub("_off", "_on"), param2=actuator.param2})
2016-02-27 11:54:38 -08:00
door:open(player)
minetest.after(2, function()
2016-02-28 02:38:57 -08:00
minetest.set_node(pos_actuator, {name=actuator.name, param2=actuator.param2})
2016-02-27 11:54:38 -08:00
door:close(player)
end)
end
2016-02-28 02:38:57 -08:00
function plate.construct(pos)
local timer = minetest.get_node_timer(pos)
timer:start(0.5)
end
2016-02-27 11:54:38 -08:00
function plate.timer(pos)
local objs = minetest.get_objects_inside_radius(pos, 0.8)
if objs == {} or not doors.get then return true end
2016-02-27 11:54:38 -08:00
local minp = {x=pos.x-2, y=pos.y, z=pos.z-2}
local maxp = {x=pos.x+2, y=pos.y, z=pos.z+2}
local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
for _, player in pairs(objs) do
if player:is_player() then
for i = 1, #doors do
2016-02-28 02:38:57 -08:00
door_toggle(pos, doors[i], player)
2016-02-27 11:54:38 -08:00
end
end
end
return true
end
for _, m in pairs({"wooden", "stone"}) do
2016-03-01 12:22:04 -08:00
local sound = default.node_sound_wood_defaults()
if m == "stone" then
sound = default.node_sound_stone_defaults()
end
2016-02-27 11:54:38 -08:00
xdecor.register("pressure_"..m.."_off", {
description = m:gsub("^%l", string.upper).." Pressure Plate",
tiles = {"xdecor_pressure_"..m..".png"},
drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 1, 14}}),
groups = {snappy=3},
2016-03-01 12:22:04 -08:00
sounds = sound,
2016-02-27 11:54:38 -08:00
sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple,
2016-02-27 11:54:38 -08:00
on_construct = plate.construct,
on_timer = plate.timer
})
xdecor.register("pressure_"..m.."_on", {
tiles = {"xdecor_pressure_"..m..".png"},
drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{1, 0, 1, 14, 0.4, 14}}),
groups = {snappy=3, not_in_creative_inventory=1},
2016-03-01 12:22:04 -08:00
sounds = sound,
2016-02-27 11:54:38 -08:00
drop = "xdecor:pressure_"..m.."_off",
sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple
2016-02-27 11:54:38 -08:00
})
end
2016-02-28 02:38:57 -08:00
2016-02-28 07:32:12 -08:00
xdecor.register("lever_off", {
description = "Lever",
tiles = {"xdecor_lever_off.png"},
2016-02-28 02:38:57 -08:00
drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
groups = {cracky=3, oddly_breakable_by_hand=2},
sounds = default.node_sound_stone_defaults(),
sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple,
on_rightclick = function(pos, node, clicker)
if not doors.get then return end
local minp = {x=pos.x-2, y=pos.y-1, z=pos.z-2}
local maxp = {x=pos.x+2, y=pos.y+1, z=pos.z+2}
local doors = minetest.find_nodes_in_area(minp, maxp, "group:door")
for i = 1, #doors do
door_toggle(pos, doors[i], clicker)
end
end
})
2016-02-28 07:32:12 -08:00
xdecor.register("lever_on", {
tiles = {"xdecor_lever_on.png"},
2016-02-28 02:38:57 -08:00
drawtype = "nodebox",
node_box = xdecor.pixelbox(16, {{2, 1, 15, 12, 14, 1}}),
groups = {cracky=3, oddly_breakable_by_hand=2, not_in_creative_inventory=1},
sounds = default.node_sound_stone_defaults(),
sunlight_propagates = true,
on_rotate = screwdriver.rotate_simple,
2016-02-28 07:32:12 -08:00
drop = "xdecor:lever_off"
2016-02-28 02:38:57 -08:00
})