update doors and convert doors 3 nodes in new systeme

This commit is contained in:
crabman77 2016-06-04 01:27:26 +02:00
parent a364f64ab9
commit 67673f7fdc
46 changed files with 473 additions and 682 deletions

View File

@ -1,671 +0,0 @@
doors3 = {}
function doors3.get_pos(pos, dir, p1, b)
local pos2 = {x=pos.x, y=pos.y, z=pos.z}
if b == 0 then
if p1 == 1 then
if dir == 1 then
pos2.z=pos2.z-1
elseif dir == 2 then
pos2.x=pos2.x-1
elseif dir == 3 then
pos2.z=pos2.z+1
else
pos2.x=pos2.x+1
end
else
if dir == 1 then
pos2.x=pos2.x+1
elseif dir == 2 then
pos2.z=pos2.z-1
elseif dir == 3 then
pos2.x=pos2.x-1
else
pos2.z=pos2.z+1
end
end
else
if p1 == 1 then
if dir == 1 then
pos2.x=pos2.x+1
elseif dir == 2 then
pos2.z=pos2.z-1
elseif dir == 3 then
pos2.x=pos2.x-1
else
pos2.z=pos2.z+1
end
else
if dir == 1 then
pos2.z=pos2.z+1
elseif dir == 2 then
pos2.x=pos2.x+1
elseif dir == 3 then
pos2.z=pos2.z-1
else
pos2.x=pos2.x-1
end
end
end
return pos2
end
-- Registers a door
function doors3.register_door(name, def)
def.groups.not_in_creative_inventory = 1
local box = {{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5+1.5/16}}
if not def.node_box_bottom then
def.node_box_bottom = box
end
if not def.node_box_middle then
def.node_box_middle = box
end
if not def.node_box_top then
def.node_box_top = box
end
if not def.selection_box_bottom then
def.selection_box_bottom= box
end
if not def.selection_box_middle then
def.selection_box_middle = box
end
if not def.selection_box_top then
def.selection_box_top = box
end
if not def.sound_close_door then
def.sound_close_door = "doors_door_close"
end
if not def.sound_open_door then
def.sound_open_door = "doors_door_open"
end
minetest.register_craftitem(name, {
description = def.description,
inventory_image = def.inventory_image,
on_place = function(itemstack, placer, pointed_thing)
if not pointed_thing.type == "node" then
return itemstack
end
local ptu = pointed_thing.under
local nu = minetest.get_node(ptu)
if minetest.registered_nodes[nu.name].on_rightclick then
return minetest.registered_nodes[nu.name].on_rightclick(ptu, nu, placer, itemstack)
end
local pt = pointed_thing.above
local pt1 = {x=pt.x, y=pt.y+1, z=pt.z}
local pt2 = {x=pt.x, y=pt.y+2, z=pt.z}
if
not minetest.registered_nodes[minetest.get_node(pt).name].buildable_to or
not minetest.registered_nodes[minetest.get_node(pt1).name].buildable_to or
not minetest.registered_nodes[minetest.get_node(pt2).name].buildable_to or
not placer or
not placer:is_player()
then
return itemstack
end
if minetest.is_protected(pt, placer:get_player_name()) or minetest.is_protected(pt2, placer:get_player_name()) then
minetest.record_protection_violation(pt, placer:get_player_name())
return itemstack
end
local p2 = minetest.dir_to_facedir(placer:get_look_dir())
local pt3 = {x=pt.x, y=pt.y, z=pt.z}
if p2 == 0 then
pt3.x = pt3.x-1
elseif p2 == 1 then
pt3.z = pt3.z+1
elseif p2 == 2 then
pt3.x = pt3.x+1
elseif p2 == 3 then
pt3.z = pt3.z-1
end
if minetest.get_item_group(minetest.get_node(pt3).name, "door") == 0 then
minetest.set_node(pt, {name=name.."_b_1", param2=p2})
minetest.set_node(pt1, {name=name.."_m_1", param2=p2})
minetest.set_node(pt2, {name=name.."_t_1", param2=p2})
else
minetest.set_node(pt, {name=name.."_b_2", param2=p2})
minetest.set_node(pt1, {name=name.."_m_2", param2=p2})
minetest.set_node(pt2, {name=name.."_t_2", param2=p2})
minetest.get_meta(pt):set_int("right", 1)
minetest.get_meta(pt1):set_int("right", 1)
minetest.get_meta(pt2):set_int("right", 1)
end
if def.only_placer_can_open then
local pn = placer:get_player_name()
local meta = minetest.get_meta(pt)
meta:set_string("doors_owner", pn)
meta:set_string("infotext", "Owned by "..pn)
meta = minetest.get_meta(pt1)
meta:set_string("doors_owner", pn)
meta:set_string("infotext", "Owned by "..pn)
meta = minetest.get_meta(pt2)
meta:set_string("doors_owner", pn)
meta:set_string("infotext", "Owned by "..pn)
end
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
return itemstack
end,
})
local tt = def.tiles_top
local tm = def.tiles_middle
local tb = def.tiles_bottom
local function after_dig_node(pos, letter, name, num, digger)
local p
if letter == "b" then -- bottom
p = { {y=1, l="m"}, {y=2, l="t"} }
elseif letter == "m" then -- middle
p = { {y=-1, l="b"}, {y=1, l="t"} }
else -- top
p = { {y=-2, l="b"}, {y=-1, l="m"} }
end
for _,t in pairs(p) do
local pos1 = {x=pos.x, y=pos.y+t["y"], z=pos.z}
local node = minetest.get_node(pos1)
if node.name == name.."_"..t["l"].."_"..num then
minetest.node_dig(pos1, node, digger)
end
end
end
local function check_and_blast(pos, name)
local node = minetest.get_node(pos)
if node.name == name then
minetest.remove_node(pos)
end
end
local function make_on_blast(base_name, letter, num)
if def.only_placer_can_open then
return function() end
else
return function(pos, intensity)
local p
if letter == "b" then -- bottom
p = { {y=1, l="m"}, {y=2, l="t"} }
elseif letter == "m" then -- middle
p = { {y=-1, l="b"}, {y=1, l="t"} }
else -- top
p = { {y=-2, l="b"}, {y=-1, l="m"} }
end
for _,t in pairs(p) do
check_and_blast({x=pos.x, y=pos.y+t["y"], z=pos.z}, base_name.."_"..t["l"].."_"..num)
end
end
end
end
local function on_rightclick(pos, letter, name, oldnum, params, clicker, oldparam2)
local p
if letter == "b" then -- bottom
p = { {y=0, l="b"}, {y=1, l="m"}, {y=2, l="t"} }
elseif letter == "m" then -- middle
p = { {y=-1, l="b"}, {y=0, l="m"}, {y=1, l="t"} }
else -- top
p = { {y=-2, l="b"}, {y=-1, l="m"}, {y=0, l="t"} }
end
local newnum
if oldnum == 1 then
newnum = 2
else
newnum = 1
end
for _,t in pairs(p) do
local pos1 = {x=pos.x, y=pos.y+t["y"], z=pos.z}
if minetest.get_node(pos1).name == name.."_"..t["l"].."_"..oldnum then
local p2 = minetest.get_node(pos1).param2
p2 = params[p2+1]
minetest.swap_node(pos1, {name=name.."_"..t["l"].."_"..newnum, param2=p2})
end
end
local snd_1 = def.sound_close_door
local snd_2 = def.sound_open_door
if params[1] == 3 then
snd_1 = def.sound_open_door
snd_2 = def.sound_close_door
end
local b = minetest.get_meta(pos):get_int("right")
local pos2 = doors3.get_pos(pos, oldparam2, params[1], b)
local node = minetest.get_node_or_nil(pos2)
if node and node.name and node.name == name.."_"..letter.."_"..newnum then
if minetest.get_meta(pos2):get_int("right") ~= b then
if minetest.registered_nodes[node.name].on_rightclick then
return minetest.registered_nodes[node.name].on_rightclick(pos2, node, clicker)
end
end
end
--if double doors, only 2eme play sound
if b ~= 0 then
minetest.sound_play(snd_1, {pos = pos, gain = 0.3, max_hear_distance = 10})
else
minetest.sound_play(snd_2, {pos = pos, gain = 0.3, max_hear_distance = 10})
end
end
local function check_player_priv(pos, player)
if not def.only_placer_can_open then
return true
end
local meta = minetest.get_meta(pos)
local pn = player:get_player_name()
return meta:get_string("doors_owner") == pn
end
local function on_rotate(pos, node, dir, user, name, num, mode, new_param2)
if not check_player_priv(pos, user) then
return false
end
if mode ~= screwdriver.ROTATE_FACE then
return false
end
local p
if dir == 0 then -- bottom
p = { {y=0, l="b"}, {y=1, l="m"}, {y=2, l="t"} }
elseif dir == 1 then -- middle
p = { {y=-1, l="b"}, {y=0, l="m"}, {y=1, l="t"} }
else -- top
p = { {y=-2, l="b"}, {y=-1, l="m"}, {y=0, l="t"} }
end
for _,t in pairs(p) do
local pos1 = {x=pos.x, y=pos.y+t["y"], z=pos.z}
if not minetest.get_node(pos1).name == name.."_"..t["l"].."_"..num then
return false
end
if minetest.is_protected(pos1, user:get_player_name()) then
minetest.record_protection_violation(pos4, user:get_player_name())
return false
end
end
for _,t in pairs(p) do
local pos1 = {x=pos.x, y=pos.y+t["y"], z=pos.z}
local node2 = minetest.get_node(pos1)
node2.param2 = (node2.param2 + 1) % 4
minetest.swap_node(pos1, node2)
end
return true
end
minetest.register_node(name.."_b_1", {
tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
drop = name,
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = def.node_box_bottom
},
selection_box = {
type = "fixed",
fixed = def.selection_box_bottom
},
groups = def.groups,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
after_dig_node(pos, "b", name, 1, digger)
end,
on_rightclick = function(pos, node, clicker)
if check_player_priv(pos, clicker) then
on_rightclick(pos, "b", name, 1, {1,2,3,0}, clicker, node.param2)
end
end,
on_rotate = function(pos, node, user, mode, new_param2)
return on_rotate(pos, node, 0, user, name, 1, mode)
end,
can_dig = check_player_priv,
sounds = def.sounds,
sunlight_propagates = def.sunlight,
on_blast = make_on_blast(name, "b", 1)
})
minetest.register_node(name.."_m_1", {
tiles = {tm[2], tm[2], tm[2], tm[2], tm[1], tm[1].."^[transformfx"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
drop = "",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = def.node_box_middle
},
selection_box = {
type = "fixed",
fixed = def.selection_box_middle
},
groups = def.groups,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
after_dig_node(pos, "m", name, 1, digger)
end,
on_rightclick = function(pos, node, clicker)
if check_player_priv(pos, clicker) then
on_rightclick(pos, "m", name, 1, {1,2,3,0}, clicker, node.param2)
end
end,
on_rotate = function(pos, node, user, mode, new_param2)
return on_rotate(pos, node, 1, user, name, 1, mode)
end,
can_dig = check_player_priv,
sounds = def.sounds,
sunlight_propagates = def.sunlight,
on_blast = make_on_blast(name, "m", 1)
})
minetest.register_node(name.."_t_1", {
tiles = {tt[2], tt[2], tt[2], tt[2], tt[1], tt[1].."^[transformfx"},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
drop = "",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = def.node_box_top
},
selection_box = {
type = "fixed",
fixed = def.selection_box_top
},
groups = def.groups,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
after_dig_node(pos, "t", name, 1, digger)
end,
on_rightclick = function(pos, node, clicker)
if check_player_priv(pos, clicker) then
on_rightclick(pos, "t", name, 1, {1,2,3,0}, clicker, node.param2)
end
end,
on_rotate = function(pos, node, user, mode, new_param2)
return on_rotate(pos, node, 2, user, name, 1, mode)
end,
can_dig = check_player_priv,
sounds = def.sounds,
sunlight_propagates = def.sunlight,
on_blast = make_on_blast(name, "t", 1)
})
minetest.register_node(name.."_b_2", {
tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
drop = name,
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = def.node_box_bottom
},
selection_box = {
type = "fixed",
fixed = def.selection_box_bottom
},
groups = def.groups,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
after_dig_node(pos, "b", name, 2, digger)
end,
on_rightclick = function(pos, node, clicker)
if check_player_priv(pos, clicker) then
on_rightclick(pos, "b", name, 2, {3,0,1,2}, clicker, node.param2)
end
end,
on_rotate = function(pos, node, user, mode, new_param2)
return on_rotate(pos, node, 0, user, name, 2, mode)
end,
can_dig = check_player_priv,
sounds = def.sounds,
sunlight_propagates = def.sunlight,
on_blast = make_on_blast(name, "b", 2)
})
minetest.register_node(name.."_m_2", {
tiles = {tm[2], tm[2], tm[2], tm[2], tm[1].."^[transformfx", tm[1]},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
drop = "",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = def.node_box_middle
},
selection_box = {
type = "fixed",
fixed = def.selection_box_middle
},
groups = def.groups,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
after_dig_node(pos, "m", name, 2, digger)
end,
on_rightclick = function(pos, node, clicker)
if check_player_priv(pos, clicker) then
on_rightclick(pos, "m", name, 2, {3,0,1,2}, clicker, node.param2)
end
end,
on_rotate = function(pos, node, user, mode, new_param2)
return on_rotate(pos, node, 1, user, name, 2, mode)
end,
can_dig = check_player_priv,
sounds = def.sounds,
sunlight_propagates = def.sunlight,
on_blast = make_on_blast(name, "m", 2)
})
minetest.register_node(name.."_t_2", {
tiles = {tt[2], tt[2], tt[2], tt[2], tt[1].."^[transformfx", tt[1]},
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
drop = "",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = def.node_box_top
},
selection_box = {
type = "fixed",
fixed = def.selection_box_top
},
groups = def.groups,
after_dig_node = function(pos, oldnode, oldmetadata, digger)
after_dig_node(pos, "t", name, 2, digger)
end,
on_rightclick = function(pos, node, clicker)
if check_player_priv(pos, clicker) then
on_rightclick(pos, "t", name, 2, {3,0,1,2}, clicker, node.param2)
end
end,
on_rotate = function(pos, node, user, mode, new_param2)
return on_rotate(pos, node, 2, user, name, 2, mode)
end,
can_dig = check_player_priv,
sounds = def.sounds,
sunlight_propagates = def.sunlight,
on_blast = make_on_blast(name, "t", 2)
})
end
doors3.register_door("doors:door3_wood", {
description = "Wooden Door 3",
inventory_image = "doors3_wood.png",
groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1},
tiles_bottom = {"doors3_wood_b.png", "doors3_brown.png"},
tiles_middle = {"doors3_wood_m.png", "doors3_brown.png"},
tiles_top = {"doors3_wood_t.png", "doors3_brown.png"},
sounds = default.node_sound_wood_defaults(),
sunlight = false,
})
minetest.register_craft({
output = "doors:door3_wood",
recipe = {
{"", "", ""},
{"", "doors:door_wood", ""},
{"", "doors:door_wood", ""}
}
})
doors3.register_door("doors:door3_steel", {
description = "Steel Door 3",
inventory_image = "doors3_steel_inv.png",
groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1},
tiles_bottom = {"doors3_steel_b.png", "doors_grey.png"},
tiles_middle = {"doors3_steel_m.png", "doors_grey.png"},
tiles_top = {"doors3_steel_t.png", "doors_grey.png"},
only_placer_can_open = true,
sounds = default.node_sound_wood_defaults(),
sunlight = false,
})
minetest.register_craft({
output = "doors:door3_steel",
recipe = {
{"", "", ""},
{"", "doors:door_steel", ""},
{"", "doors:door_steel", ""}
}
})
doors3.register_door("doors:door3_glass", {
description = "Glass Door 3",
inventory_image = "doors3_glass_inv.png",
groups = {snappy=1,cracky=1,oddly_breakable_by_hand=3,door=1},
tiles_bottom = {"doors_glass_b.png", "doors_glass_side.png"},
tiles_middle = {"doors_glass_a.png", "doors_glass_side.png"},
tiles_top = {"doors_glass_a.png", "doors_glass_side.png"},
sounds = default.node_sound_glass_defaults(),
sunlight = true,
})
minetest.register_craft({
output = "doors:door3_glass",
recipe = {
{"", "", ""},
{"", "doors:door_glass", ""},
{"", "doors:door_glass", ""}
}
})
doors3.register_door("doors:door3_obsidian_glass", {
description = "Obsidian Glass Door 3",
inventory_image = "doors3_obsidian_glass_inv.png",
groups = {snappy=1,cracky=1,oddly_breakable_by_hand=3,door=1},
tiles_bottom = {"doors_obsidian_glass_b.png", "doors_obsidian_glass_side.png"},
tiles_middle = {"doors_obsidian_glass_a.png", "doors_obsidian_glass_side.png"},
tiles_top = {"doors_obsidian_glass_a.png", "doors_obsidian_glass_side.png"},
sounds = default.node_sound_glass_defaults(),
sunlight = true,
})
minetest.register_craft({
output = "doors:door3_obsidian_glass",
recipe = {
{"", "", ""},
{"", "doors:door_obsidian_glass", ""},
{"", "doors:door_obsidian_glass", ""}
}
})
-- From BFD: Cherry planks doors
doors3.register_door("doors:door3_cherry", {
description = "Cherry Door 3",
inventory_image = "doors3_wood_cherry_inv.png",
groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1},
tiles_bottom = {"doors_wood_cherry_b.png", "default_wood_cherry_planks.png"},
tiles_middle = {"doors_wood_cherry_a.png", "default_wood_cherry_planks.png"},
tiles_top = {"doors_wood_cherry_a.png", "default_wood_cherry_planks.png"},
sounds = default.node_sound_wood_defaults(),
sunlight = false,
})
minetest.register_craft({
output = "doors:door3_cherry",
recipe = {
{"", "", ""},
{"", "doors:door_cherry", ""},
{"", "doors:door_cherry", ""}
}
})
doors3.register_door("doors:door3_prison", {
description = "Prison Door 3",
inventory_image = "doors3_prison_inv.png",
groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1},
tiles_bottom = {"doors_prison_b.png", "doors_black.png"},
tiles_middle = {"doors_prison_t.png", "doors_black.png"},
tiles_top = {"doors_prison_t.png", "doors_black.png"},
only_placer_can_open = true,
sounds = default.node_sound_wood_defaults(),
sunlight = false,
})
minetest.register_craft({
output = "doors:door3_prison",
recipe = {
{"", "", ""},
{"", "doors:door_prison", ""},
{"", "doors:door_prison", ""}
}
})

View File

@ -13,6 +13,7 @@ doors = {}
-- private data
local _doors = {}
_doors.registered_doors = {}
_doors.registered_doors3 = {} --MFF doors3
_doors.registered_trapdoors = {}
-- returns an object to a door object or nil
@ -65,6 +66,30 @@ function doors.get(pos)
return name:sub(-5) == "_open"
end
}
elseif _doors.registered_doors3[minetest.get_node(pos).name] then --MFF doors3
-- A normal upright door
return {
pos = pos,
open = function(self, player)
if self:state() then
return false
end
return _doors.door_toggle(self.pos, player)
end,
close = function(self, player)
if not self:state() then
return false
end
return _doors.door_toggle(self.pos, player)
end,
toggle = function(self, player)
return _doors.door_toggle(self.pos, player)
end,
state = function(self)
local state = minetest.get_meta(self.pos):get_int("state")
return state %2 == 1
end
}
else
return nil
end
@ -192,6 +217,8 @@ function _doors.door_toggle(pos, clicker)
-- fix up lvm-placed right-hinged doors, default closed
if minetest.get_node(pos).name:sub(-2) == "_b" then
state = 2
else
state = 0
end
else
state = tonumber(state)
@ -272,11 +299,10 @@ function doors.register(name, def)
end
-- replace old doors of this type automatically
minetest.register_abm({
minetest.register_lbm({
name = ":doors:replace_" .. name:gsub(":", "_"),
nodenames = {name.."_b_1", name.."_b_2"},
interval = 7.0,
chance = 1,
action = function(pos, node, active_object_count, active_object_count_wider)
action = function(pos, node)
local l = tonumber(node.name:sub(-1))
local meta = minetest.get_meta(pos)
local h = meta:get_int("right") + 1
@ -322,7 +348,7 @@ function doors.register(name, def)
local pdef = minetest.registered_nodes[node.name]
if pdef and pdef.on_rightclick then
return pdef.on_rightclick(pointed_thing.under,
node, placer, itemstack)
node, placer, itemstack, pointed_thing)
end
if pdef and pdef.buildable_to then
@ -365,11 +391,10 @@ function doors.register(name, def)
if minetest.get_item_group(minetest.get_node(aside).name, "door") == 1 then
state = state + 2
minetest.set_node(pos, {name = name .. "_b", param2 = dir})
minetest.set_node(above, {name = "doors:hidden", param2 = (dir + 3) % 4})
else
minetest.set_node(pos, {name = name .. "_a", param2 = dir})
minetest.set_node(above, {name = "doors:hidden", param2 = dir})
end
minetest.set_node(above, { name = "doors:hidden" })
local meta = minetest.get_meta(pos)
meta:set_int("state", state)
@ -583,12 +608,11 @@ doors.register("door_obsidian_glass", {
})
-- From BFD: Cherry planks doors
doors.register("door_cherry", {
tiles = { "doors_door_cherry.png" },
description = "Cherry Door",
inventory_image = "doors_item_cherry.png",
groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1},
groups = {choppy=2, oddly_breakable_by_hand=2, flammable=2, door=1},
sounds = default.node_sound_wood_defaults(),
recipe = {
{"default:cherry_plank", "default:cherry_plank"},
@ -614,6 +638,7 @@ doors.register("door_tin", {
}
})
-- doors prison MFF
doors.register("door_prison", {
tiles = { "doors_door_prison.png" },
@ -626,7 +651,6 @@ doors.register("door_prison", {
{"darkage:iron_stick", "darkage:iron_stick"},
{"darkage:iron_stick", "darkage:iron_stick"},
{"darkage:iron_stick", "darkage:iron_stick"}
}
})
@ -947,4 +971,358 @@ doors.register_fencegate("doors:gate_aspen_wood", {
})
-- door 3 nodes
dofile(minetest.get_modpath("doors").."/doors3.lua")
function doors.register3(name, def)
if not name:find(":") then
name = "doors:" .. name
end
-- replace old doors of this type automatically
minetest.register_lbm({
name = ":doors:replace_" .. name:gsub(":", "_"),
nodenames = {name.."_b_1", name.."_b_2"},
action = function(pos, node)
local l = tonumber(node.name:sub(-1))
local meta = minetest.get_meta(pos)
local h = meta:get_int("right") + 1
local p2 = node.param2
local replace = {
{ { type = "a", state = 0 }, { type = "a", state = 3 } },
{ { type = "b", state = 1 }, { type = "b", state = 2 } }
}
local new = replace[l][h]
-- retain infotext and doors_owner fields
minetest.swap_node(pos, {name = name .. "_" .. new.type, param2 = p2})
meta:set_int("state", new.state)
-- properly place doors:hidden at the right spot
local p3 = p2
if new.state >= 2 then
p3 = (p3 + 3) % 4
end
if new.state % 2 == 1 then
if new.state >= 2 then
p3 = (p3 + 1) % 4
else
p3 = (p3 + 3) % 4
end
end
-- wipe meta on top node as it's unused
minetest.set_node({x = pos.x, y = pos.y + 1, z = pos.z},
{name = "doors:hidden", param2 = p3})
minetest.set_node({x = pos.x, y = pos.y + 2, z = pos.z},
{name = "doors:hidden", param2 = p3})
end
})
minetest.register_craftitem(":" .. name, {
description = def.description,
inventory_image = def.inventory_image,
on_place = function(itemstack, placer, pointed_thing)
local pos = nil
if not pointed_thing.type == "node" then
return itemstack
end
local node = minetest.get_node(pointed_thing.under)
local pdef = minetest.registered_nodes[node.name]
if pdef and pdef.on_rightclick then
return pdef.on_rightclick(pointed_thing.under,
node, placer, itemstack, pointed_thing)
end
if pdef and pdef.buildable_to then
pos = pointed_thing.under
else
pos = pointed_thing.above
node = minetest.get_node(pos)
pdef = minetest.registered_nodes[node.name]
if not pdef or not pdef.buildable_to then
return itemstack
end
end
local above = { x = pos.x, y = pos.y + 1, z = pos.z }
if not minetest.registered_nodes[minetest.get_node(above).name].buildable_to then
return itemstack
end
local above2 = { x = pos.x, y = pos.y + 2, z = pos.z }
if not minetest.registered_nodes[minetest.get_node(above2).name].buildable_to then
return itemstack
end
local pn = placer:get_player_name()
if minetest.is_protected(pos, pn) or minetest.is_protected(above, pn) or minetest.is_protected(above2, pn) then
return itemstack
end
local dir = minetest.dir_to_facedir(placer:get_look_dir())
local ref = {
{ x = -1, y = 0, z = 0 },
{ x = 0, y = 0, z = 1 },
{ x = 1, y = 0, z = 0 },
{ x = 0, y = 0, z = -1 },
}
local aside = {
x = pos.x + ref[dir + 1].x,
y = pos.y + ref[dir + 1].y,
z = pos.z + ref[dir + 1].z,
}
local state = 0
if minetest.get_item_group(minetest.get_node(aside).name, "door") == 1 then
state = state + 2
minetest.set_node(pos, {name = name .. "_b", param2 = dir})
else
minetest.set_node(pos, {name = name .. "_a", param2 = dir})
end
minetest.set_node(above, { name = "doors:hidden" })
minetest.set_node(above2, { name = "doors:hidden" })
local meta = minetest.get_meta(pos)
meta:set_int("state", state)
if def.protected then
local pn = placer:get_player_name()
meta:set_string("doors_owner", pn)
meta:set_string("infotext", "Owned by " .. pn)
end
if not minetest.setting_getbool("creative_mode") then
itemstack:take_item()
end
on_place_node(pos, minetest.get_node(pos), placer, node, itemstack, pointed_thing)
return itemstack
end
})
local can_dig = function(pos, digger)
if not def.protected then
return true
end
if minetest.check_player_privs(digger:get_player_name(), {protection_bypass = true}) then
return true
end
local meta = minetest.get_meta(pos)
local name = ""
if digger then
name = digger:get_player_name()
end
return meta:get_string("doors_owner") == name
end
if not def.sounds then
def.sounds = default.node_sound_wood_defaults()
end
if not def.sound_open then
def.sound_open = "doors_door_open"
end
if not def.sound_close then
def.sound_close = "doors_door_close"
end
def.groups.not_in_creative_inventory = 1
def.groups.door = 1
def.drop = name
def.door = {
name = name,
sounds = { def.sound_close, def.sound_open },
}
def.on_rightclick = function(pos, node, clicker)
_doors.door_toggle(pos, clicker)
end
def.after_dig_node = function(pos, node, meta, digger)
minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z})
minetest.remove_node({x = pos.x, y = pos.y + 2, z = pos.z})
nodeupdate({x = pos.x, y = pos.y + 2, z = pos.z})
end
def.can_dig = function(pos, player)
return can_dig(pos, player)
end
def.on_rotate = function(pos, node, user, mode, new_param2)
return false
end
if def.protected then
def.on_blast = function() end
else
def.on_blast = function(pos, intensity)
minetest.remove_node(pos)
-- hidden node doesn't get blasted away.
minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z})
minetest.remove_node({x = pos.x, y = pos.y + 2, z = pos.z})
return {name}
end
end
def.on_destruct = function(pos)
minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z})
minetest.remove_node({x = pos.x, y = pos.y + 2, z = pos.z})
end
minetest.register_node(":" .. name .. "_a", {
description = def.description,
visual = "mesh",
mesh = "door3_a.obj",
tiles = def.tiles,
drawtype = "mesh",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
walkable = true,
is_ground_content = false,
buildable_to = false,
drop = def.drop,
groups = def.groups,
sounds = def.sounds,
door = def.door,
on_rightclick = def.on_rightclick,
after_dig_node = def.after_dig_node,
can_dig = def.can_dig,
on_rotate = def.on_rotate,
on_blast = def.on_blast,
on_destruct = def.on_destruct,
selection_box = {
type = "fixed",
fixed = { -1/2,-1/2,-1/2,1/2,2.5,-6/16}
},
collision_box = {
type = "fixed",
fixed = { -1/2,-1/2,-1/2,1/2,2.5,-6/16}
},
})
minetest.register_node(":" .. name .. "_b", {
description = def.description,
visual = "mesh",
mesh = "door3_b.obj",
tiles = def.tiles,
drawtype = "mesh",
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
walkable = true,
is_ground_content = false,
buildable_to = false,
drop = def.drop,
groups = def.groups,
sounds = def.sounds,
door = def.door,
on_rightclick = def.on_rightclick,
after_dig_node = def.after_dig_node,
can_dig = def.can_dig,
on_rotate = def.on_rotate,
on_blast = def.on_blast,
on_destruct = def.on_destruct,
selection_box = {
type = "fixed",
fixed = { -1/2,-1/2,-1/2,1/2,2.5,-6/16}
},
collision_box = {
type = "fixed",
fixed = { -1/2,-1/2,-1/2,1/2,2.5,-6/16}
},
})
if def.recipe then
minetest.register_craft({
output = name,
recipe = def.recipe,
})
end
_doors.registered_doors3[name .. "_a"] = true
_doors.registered_doors3[name .. "_b"] = true
end
doors.register3("door3_wood", {
tiles = {{ name = "doors_door3_wood.png", backface_culling = true }},
description = "Wooden Door 3 Nodes",
inventory_image = "doors3_item_wood.png",
groups = { snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 },
recipe = {
{"", "", ""},
{"", "doors:door_wood", ""},
{"", "doors:door_wood", ""},
}
})
doors.register3("door3_steel", {
tiles = {{ name = "doors_door3_steel.png", backface_culling = true }},
description = "Steel Door 3 Nodes",
inventory_image = "doors3_item_steel.png",
protected = true,
groups = { snappy = 1, bendy = 2, cracky = 1, melty = 2, level = 2 },
sound_open = "doors_steel_door_open",
sound_close = "doors_steel_door_close",
recipe = {
{"", "", ""},
{"", "doors:door_steel", ""},
{"", "doors:door_steel", ""},
}
})
doors.register3("door3_glass", {
tiles = { "doors_door3_glass.png"},
description = "Glass Door 3 Nodes",
inventory_image = "doors3_item_glass.png",
groups = { snappy=1, cracky=1, oddly_breakable_by_hand=3 },
sounds = default.node_sound_glass_defaults(),
recipe = {
{"", "", ""},
{"", "doors:door_glass", ""},
{"", "doors:door_glass", ""},
}
})
doors.register3("door3_obsidian_glass", {
tiles = { "doors_door3_obsidian_glass.png" },
description = "Obsidian Glass Door 3 Nodes",
inventory_image = "doors3_item_obsidian_glass.png",
groups = { snappy=1, cracky=1, oddly_breakable_by_hand=3 },
sounds = default.node_sound_glass_defaults(),
recipe = {
{"", "", ""},
{"", "doors:door_obsidian_glass", ""},
{"", "doors:door_obsidian_glass", ""},
},
})
-- From BFD: Cherry planks doors
doors.register3("door3_cherry", {
tiles = { "doors_door3_cherry.png" },
description = "Cherry Door 3 Nodes",
inventory_image = "doors3_item_cherry.png",
groups = {choppy=2, oddly_breakable_by_hand=2, flammable=2, door=1},
sounds = default.node_sound_wood_defaults(),
recipe = {
{"", "", ""},
{"", "doors:door_cherry", ""},
{"", "doors:door_cherry", ""},
},
})
-- doors prison MFF
doors.register3("door3_prison", {
tiles = { "doors_door3_prison.png" },
description = "Prison Door 3 Nodes",
inventory_image = "doors3_item_prison.png",
groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1},
protected = true,
sounds = default.node_sound_stone_defaults(),
recipe = {
{"", "", ""},
{"", "doors:door_prison", ""},
{"", "doors:door_prison", ""},
}
})

View File

@ -0,0 +1,42 @@
# Blender v2.76 (sub 0) OBJ File: '3node_door.blend'
# www.blender.org
mtllib 3node_door.mtl
o Cube_Cube.001
v -0.499000 -0.499000 -0.375000
v 0.499000 -0.499000 -0.375000
v 0.498998 2.498000 -0.375000
v -0.499000 2.498000 -0.375000
v -0.499000 2.498000 -0.499000
v -0.499000 -0.499000 -0.499000
v 0.498998 2.498000 -0.499000
v 0.499000 -0.499000 -0.499000
vt 0.842905 0.000000
vt 0.421453 0.000000
vt 0.421453 1.000000
vt 0.842905 1.000000
vt 0.895270 0.000000
vt 0.895270 1.000000
vt 1.000000 0.665999
vt 0.947635 0.665999
vt 0.947635 0.333000
vt 1.000000 0.333000
vt 0.000000 0.000000
vt 0.000000 1.000000
vt 0.947635 0.000000
vt 0.947635 1.000000
vt 1.000000 0.000000
vn 0.000000 -0.000000 1.000000
vn -1.000000 0.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn 1.000000 0.000000 0.000000
vn 0.000000 -1.000000 -0.000000
usemtl None
s off
f 1/1/1 2/2/1 3/3/1 4/4/1
f 1/4/2 4/1/2 5/5/2 6/6/2
f 3/7/3 7/8/3 5/9/3 4/10/3
f 6/11/4 5/12/4 7/3/4 8/2/4
f 2/5/5 8/13/5 7/14/5 3/6/5
s 1
f 8/13/6 2/15/6 1/10/6 6/9/6

View File

@ -0,0 +1,42 @@
# Blender v2.76 (sub 0) OBJ File: '3node_door_b.blend'
# www.blender.org
mtllib 3node_door_b.mtl
o Cube_Cube.001
v -0.499000 -0.499000 -0.375000
v 0.499000 -0.499000 -0.375000
v 0.498998 2.498000 -0.375000
v -0.499000 2.498000 -0.375000
v -0.499000 2.498000 -0.499000
v -0.499000 -0.499000 -0.499000
v 0.498998 2.498000 -0.499000
v 0.499000 -0.499000 -0.499000
vt 0.421453 0.000000
vt 0.842905 0.000000
vt 0.842905 1.000000
vt 0.421453 1.000000
vt 0.895270 0.000000
vt 0.895270 1.000000
vt 1.000000 0.665999
vt 0.947635 0.665999
vt 0.947635 0.333000
vt 1.000000 0.333000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 0.947635 0.000000
vt 0.947635 1.000000
vt 1.000000 0.000000
vn 0.000000 -0.000000 1.000000
vn -1.000000 0.000000 0.000000
vn 0.000000 1.000000 0.000000
vn 0.000000 0.000000 -1.000000
vn 1.000000 0.000000 0.000000
vn 0.000000 -1.000000 -0.000000
usemtl None
s off
f 1/1/1 2/2/1 3/3/1 4/4/1
f 1/3/2 4/2/2 5/5/2 6/6/2
f 3/7/3 7/8/3 5/9/3 4/10/3
f 6/1/4 5/4/4 7/11/4 8/12/4
f 2/5/5 8/13/5 7/14/5 3/6/5
s 1
f 8/13/6 2/15/6 1/10/6 6/9/6

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

View File

Before

Width:  |  Height:  |  Size: 286 B

After

Width:  |  Height:  |  Size: 286 B

View File

Before

Width:  |  Height:  |  Size: 341 B

After

Width:  |  Height:  |  Size: 341 B

View File

Before

Width:  |  Height:  |  Size: 263 B

After

Width:  |  Height:  |  Size: 263 B

View File

Before

Width:  |  Height:  |  Size: 410 B

After

Width:  |  Height:  |  Size: 410 B

View File

Before

Width:  |  Height:  |  Size: 631 B

After

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 471 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 490 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 185 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 614 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 319 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 205 B

After

Width:  |  Height:  |  Size: 202 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 172 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 102 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 214 B

After

Width:  |  Height:  |  Size: 211 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 158 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 320 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 B

After

Width:  |  Height:  |  Size: 123 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 295 B