forked from MineClone5/MineClone5
#202 Destroy Nether Portals on ABMs
This commit is contained in:
parent
560882b1ba
commit
306a6ad20f
|
@ -209,39 +209,6 @@ local function get_target(p)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Destroy portal if pos (portal frame or portal node) got destroyed
|
|
||||||
local function destroy_nether_portal(pos, node)
|
|
||||||
if not node then return end
|
|
||||||
local nn, orientation = node.name, node.param2
|
|
||||||
local obsidian = nn == OBSIDIAN
|
|
||||||
|
|
||||||
local function check_remove(pos, orientation)
|
|
||||||
local node = get_node(pos)
|
|
||||||
if node and (node.name == PORTAL and (orientation == nil or (node.param2 == orientation))) then
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
remove_exit(pos)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if obsidian then -- check each of 6 sides of it and destroy every portal:
|
|
||||||
check_remove({x = pos.x - 1, y = pos.y, z = pos.z}, 0)
|
|
||||||
check_remove({x = pos.x + 1, y = pos.y, z = pos.z}, 0)
|
|
||||||
check_remove({x = pos.x, y = pos.y, z = pos.z - 1}, 1)
|
|
||||||
check_remove({x = pos.x, y = pos.y, z = pos.z + 1}, 1)
|
|
||||||
check_remove({x = pos.x, y = pos.y - 1, z = pos.z})
|
|
||||||
check_remove({x = pos.x, y = pos.y + 1, z = pos.z})
|
|
||||||
return
|
|
||||||
end
|
|
||||||
if orientation == 0 then
|
|
||||||
check_remove({x = pos.x - 1, y = pos.y, z = pos.z}, 0)
|
|
||||||
check_remove({x = pos.x + 1, y = pos.y, z = pos.z}, 0)
|
|
||||||
else
|
|
||||||
check_remove({x = pos.x, y = pos.y, z = pos.z - 1}, 1)
|
|
||||||
check_remove({x = pos.x, y = pos.y, z = pos.z + 1}, 1)
|
|
||||||
end
|
|
||||||
check_remove({x = pos.x, y = pos.y - 1, z = pos.z})
|
|
||||||
check_remove({x = pos.x, y = pos.y + 1, z = pos.z})
|
|
||||||
end
|
|
||||||
|
|
||||||
local on_rotate
|
local on_rotate
|
||||||
if minetest.get_modpath("screwdriver") then
|
if minetest.get_modpath("screwdriver") then
|
||||||
on_rotate = screwdriver.disallow
|
on_rotate = screwdriver.disallow
|
||||||
|
@ -295,7 +262,6 @@ minetest.register_node(PORTAL, {
|
||||||
},
|
},
|
||||||
groups = { creative_breakable = 1, portal = 1, not_in_creative_inventory = 1 },
|
groups = { creative_breakable = 1, portal = 1, not_in_creative_inventory = 1 },
|
||||||
sounds = mcl_sounds.node_sound_glass_defaults(),
|
sounds = mcl_sounds.node_sound_glass_defaults(),
|
||||||
after_destruct = destroy_nether_portal,
|
|
||||||
on_rotate = on_rotate,
|
on_rotate = on_rotate,
|
||||||
|
|
||||||
_mcl_hardness = -1,
|
_mcl_hardness = -1,
|
||||||
|
@ -763,10 +729,38 @@ mcl_structures.register_structure({name = "nether_portal", place_function = mcl_
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
label = "Nether portal teleportation and particles",
|
label = "Nether portal teleportation and particles",
|
||||||
nodenames = {PORTAL},
|
nodenames = {PORTAL},
|
||||||
interval = 1,
|
interval = 0.8,
|
||||||
chance = 1,
|
chance = 3,
|
||||||
action = function(pos, node)
|
action = function(pos, node)
|
||||||
|
-- Don't use call stack!
|
||||||
|
local upper_node_name = get_node({x = pos.x, y = pos.y + 1, z = pos.z}).name
|
||||||
|
if upper_node_name ~= PORTAL and upper_node_name ~= OBSIDIAN then
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
remove_exit(pos)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local lower_node_name = get_node({x = pos.x, y = pos.y - 1, z = pos.z}).name
|
||||||
|
if lower_node_name ~= PORTAL and lower_node_name ~= OBSIDIAN then
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
remove_exit(pos)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local o = node.param2 -- orientation
|
local o = node.param2 -- orientation
|
||||||
|
|
||||||
|
local closer_node_name = get_node({x = pos.x - 1 + o, y = pos.y, z = pos.z - o}).name
|
||||||
|
if closer_node_name ~= PORTAL and closer_node_name ~= OBSIDIAN then
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
remove_exit(pos)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local further_node_name = get_node({x = pos.x + 1 - o, y = pos.y, z = pos.z + o}).name
|
||||||
|
if further_node_name ~= PORTAL and further_node_name ~= OBSIDIAN then
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
remove_exit(pos)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
local d = random(0, 1) -- direction
|
local d = random(0, 1) -- direction
|
||||||
local time = random() * 1.9 + 0.5
|
local time = random() * 1.9 + 0.5
|
||||||
local velocity, acceleration
|
local velocity, acceleration
|
||||||
|
@ -829,7 +823,6 @@ local usagehelp = S("To open a Nether portal, place an upright frame of obsidian
|
||||||
minetest.override_item(OBSIDIAN, {
|
minetest.override_item(OBSIDIAN, {
|
||||||
_doc_items_longdesc = longdesc,
|
_doc_items_longdesc = longdesc,
|
||||||
_doc_items_usagehelp = usagehelp,
|
_doc_items_usagehelp = usagehelp,
|
||||||
after_destruct = destroy_nether_portal,
|
|
||||||
_on_ignite = function(user, pointed_thing)
|
_on_ignite = function(user, pointed_thing)
|
||||||
local x, y, z = pointed_thing.under.x, pointed_thing.under.y, pointed_thing.under.z
|
local x, y, z = pointed_thing.under.x, pointed_thing.under.y, pointed_thing.under.z
|
||||||
-- Check empty spaces around obsidian and light all frames found:
|
-- Check empty spaces around obsidian and light all frames found:
|
||||||
|
|
Loading…
Reference in New Issue