basic_machines-cd2025/control_doors.lua
waxtatect f9431c5e09 c the commit
interact directly with machine blocks when marks displayed
hold sneak and punch a block to abort interactive setup
allow removing keypad password
add place sounds for mover in normal, dig and transport modes
somewhat rework player punch in space
code maintenance
2024-04-23 15:54:59 +02:00

178 lines
5.6 KiB
Lua

-- Make doors open/close with signal
-- (c) 2015-2016 rnd
-- Copyright (C) 2022-2024 мтест
-- See README.md for license details
-- local S = basic_machines.S
local use_doors = minetest.global_exists("doors")
local use_xpanes = minetest.get_modpath("xpanes")
local function door_signal_overwrite(name)
local def = minetest.registered_nodes[name]
if not def or def.effector or def.mesecons then return end -- already exists, don't change
local door_on_rightclick = def.on_rightclick
if door_on_rightclick then -- safety if it doesn't exist
minetest.override_item(name, {
effector = {
action_on = function(pos, _)
-- create virtual player
local clicker = {
get_wielded_item = function() return ItemStack("") end,
-- method needed for mods that check this: like denaid areas mod
is_player = function() return true end,
-- define method get_player_name() returning owner name so that we can call on_rightclick function in door
get_player_name = function() return minetest.get_meta(pos):get_string("owner") end
}
door_on_rightclick(pos, nil, clicker, ItemStack(""), {})
-- more direct approach ?, need to set param2 then too
-- minetest.swap_node(pos, {name = "protector:trapdoor", param1 = node.param1, param2 = node.param2})
end
}
})
end
end
local function make_it_noclip(name)
minetest.override_item(name, {walkable = false}) -- can't be walked on
end
-- doors
local doors = {}
-- cool_trees
if minetest.global_exists("birch") then
table.insert(doors, "doors:door_birch_wood")
end
if minetest.get_modpath("chestnuttree") then
table.insert(doors, "doors:door_chestnut_wood")
end
if minetest.get_modpath("clementinetree") then
table.insert(doors, "doors:door_clementinetree_wood")
end
if minetest.get_modpath("larch") then
table.insert(doors, "doors:door_larch_wood")
end
if minetest.get_modpath("maple") then
table.insert(doors, "doors:door_maple_wood")
end
if minetest.get_modpath("oak") then
table.insert(doors, "doors:door_oak_wood")
end
if minetest.get_modpath("palm") then
table.insert(doors, "doors:door_palm")
end
--
if use_doors then
table.insert(doors, "doors:door_glass")
table.insert(doors, "doors:door_obsidian_glass")
table.insert(doors, "doors:door_steel")
table.insert(doors, "doors:door_wood")
end
if minetest.get_modpath("extra_doors") then
table.insert(doors, "doors:door_barn1")
table.insert(doors, "doors:door_barn2")
table.insert(doors, "doors:door_castle1")
table.insert(doors, "doors:door_castle2")
table.insert(doors, "doors:door_cottage1")
table.insert(doors, "doors:door_cottage2")
table.insert(doors, "doors:door_dungeon1")
table.insert(doors, "doors:door_dungeon2")
table.insert(doors, "doors:door_french")
table.insert(doors, "doors:door_japanese")
table.insert(doors, "doors:door_mansion1")
table.insert(doors, "doors:door_mansion2")
table.insert(doors, "doors:door_steelglass1")
table.insert(doors, "doors:door_steelglass2")
table.insert(doors, "doors:door_steelpanel1")
table.insert(doors, "doors:door_woodglass1")
table.insert(doors, "doors:door_woodglass2")
table.insert(doors, "doors:door_woodpanel1")
end
if minetest.global_exists("xdecor") then
table.insert(doors, "doors:japanese_door")
table.insert(doors, "doors:prison_door")
table.insert(doors, "doors:rusty_prison_door")
table.insert(doors, "doors:screen_door")
table.insert(doors, "doors:slide_door")
table.insert(doors, "doors:woodglass_door")
end
if use_xpanes then
table.insert(doors, "xpanes:door_steel_bar")
end
for _, door in ipairs(doors) do
door_signal_overwrite(door .. "_a")
door_signal_overwrite(door .. "_b")
door_signal_overwrite(door .. "_c")
door_signal_overwrite(door .. "_d")
end
-- trapdoors
local trapdoors = {}
if use_doors then
table.insert(trapdoors, "doors:trapdoor")
table.insert(trapdoors, "doors:trapdoor_steel")
end
if use_xpanes then
table.insert(trapdoors, "xpanes:trapdoor_steel_bar")
end
for _, trapdoor in ipairs(trapdoors) do
door_signal_overwrite(trapdoor)
door_signal_overwrite(trapdoor .. "_open")
make_it_noclip(trapdoor .. "_open")
end
--[[
if use_doors then
local function make_it_nondiggable_but_removable(name, dropname, door)
minetest.override_item(name, {
diggable = false,
on_punch = function(pos, _, puncher) -- remove node if owner repeatedly punches it 3x
local player_name = puncher:get_player_name()
local meta = minetest.get_meta(pos)
-- can be dug by owner or if unprotected
if player_name == meta:get_string("owner") or not minetest.is_protected(pos, player_name) then
local t0, t = meta:get_int("punchtime"), minetest.get_gametime()
local count = meta:get_int("punchcount")
if t - t0 < 2 then count = (count + 1) % 3 else count = 0 end
meta:set_int("punchtime", t); meta:set_int("punchcount", count)
if count == 1 then
minetest.chat_send_player(player_name, S("@1: Punch me one more time to remove me", door))
elseif count == 2 then -- remove steel door and drop it
minetest.remove_node(pos)
minetest.add_item(pos, ItemStack(dropname))
end
end
end
})
end
local impervious_steel = {
{"doors:door_steel_a", "doors:door_steel", S("Steel Door")},
{"doors:door_steel_b", "doors:door_steel", S("Steel Door")},
{"doors:door_steel_c", "doors:door_steel", S("Steel Door")},
{"doors:door_steel_d", "doors:door_steel", S("Steel Door")},
{"doors:trapdoor_steel", "doors:trapdoor_steel", S("Steel Trapdoor")},
{"doors:trapdoor_steel_open", "doors:trapdoor_steel", S("Steel Trapdoor")}
}
for _, door in ipairs(impervious_steel) do
make_it_nondiggable_but_removable(door[1], door[2], door[3])
end
end
--]]