Rewrite emerge algorithm of Netherportal gen.
This commit is contained in:
parent
f68e835087
commit
c1614dabc5
|
@ -9,6 +9,8 @@ local FRAME_SIZE_Y_MIN = 5
|
||||||
local FRAME_SIZE_X_MAX = 23
|
local FRAME_SIZE_X_MAX = 23
|
||||||
local FRAME_SIZE_Y_MAX = 23
|
local FRAME_SIZE_Y_MAX = 23
|
||||||
|
|
||||||
|
local NETHER_PORTAL_TELEPORT_DELAY = 3 -- seconds before teleporting in Nether portal
|
||||||
|
|
||||||
local mg_name = minetest.get_mapgen_setting("mg_name")
|
local mg_name = minetest.get_mapgen_setting("mg_name")
|
||||||
|
|
||||||
-- 3D noise
|
-- 3D noise
|
||||||
|
@ -179,6 +181,7 @@ local function build_portal(pos, target)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
minetest.log("action", "[mcl_portal] Destination Nether portal generated at "..minetest.pos_to_string(p2).."!")
|
||||||
end
|
end
|
||||||
|
|
||||||
local function find_nether_target_y(target_x, target_z)
|
local function find_nether_target_y(target_x, target_z)
|
||||||
|
@ -399,11 +402,11 @@ minetest.register_abm({
|
||||||
-- force emerge of target area
|
-- force emerge of target area
|
||||||
minetest.get_voxel_manip():read_from_map(target, target)
|
minetest.get_voxel_manip():read_from_map(target, target)
|
||||||
if not minetest.get_node_or_nil(target) then
|
if not minetest.get_node_or_nil(target) then
|
||||||
minetest.emerge_area(
|
minetest.emerge_area(vector.subtract(target, 4), vector.add(target, 4))
|
||||||
vector.subtract(target, 4), vector.add(target, 4))
|
|
||||||
end
|
end
|
||||||
-- teleport the object
|
|
||||||
minetest.after(3, function(obj, pos, target)
|
-- teleport function
|
||||||
|
local teleport = function(obj, pos, target)
|
||||||
if (not obj:get_luaentity()) and (not obj:is_player()) then
|
if (not obj:get_luaentity()) and (not obj:is_player()) then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
@ -423,18 +426,6 @@ minetest.register_abm({
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Build target portal (if there isn't already one)
|
|
||||||
|
|
||||||
local n = minetest.get_node_or_nil(target)
|
|
||||||
if n and n.name ~= "mcl_portals:portal" then
|
|
||||||
local emerge_callback = function(blockpos, action, calls_remaining, param)
|
|
||||||
if calls_remaining <= 0 then
|
|
||||||
build_portal(param.target, param.pos, false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
minetest.emerge_area(vector.subtract(target, 7), vector.add(target, 7), emerge_callback, { pos = pos, target = target })
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Teleport
|
-- Teleport
|
||||||
obj:set_pos(target)
|
obj:set_pos(target)
|
||||||
if obj:is_player() then
|
if obj:is_player() then
|
||||||
|
@ -447,8 +438,30 @@ minetest.register_abm({
|
||||||
minetest.after(4, function(o)
|
minetest.after(4, function(o)
|
||||||
portal_cooloff[o] = false
|
portal_cooloff[o] = false
|
||||||
end, obj)
|
end, obj)
|
||||||
|
if obj:is_player() then
|
||||||
|
local name = obj:get_player_name()
|
||||||
|
minetest.log("action", "[mcl_portal] "..name.." teleported to Nether portal at "..minetest.pos_to_string(target)..".")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local n = minetest.get_node_or_nil(target)
|
||||||
|
if n and n.name ~= "mcl_portals:portal" then
|
||||||
|
-- Emerge target area, wait for emerging to be finished, build destination portal
|
||||||
|
-- (if there isn't already one, teleport object after a short delay.
|
||||||
|
local emerge_callback = function(blockpos, action, calls_remaining, param)
|
||||||
|
minetest.log("verbose", "[mcl_portal] emerge_callack called! action="..action)
|
||||||
|
if calls_remaining <= 0 then
|
||||||
|
minetest.log("verbose", "[mcl_portal] Area for destination Nether portal emerged!")
|
||||||
|
build_portal(param.target, param.pos, false)
|
||||||
|
minetest.after(NETHER_PORTAL_TELEPORT_DELAY, teleport, obj, pos, target)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
minetest.log("verbose", "[mcl_portal] Emerging area for destination Nether portal ...")
|
||||||
|
minetest.emerge_area(vector.subtract(target, 7), vector.add(target, 7), emerge_callback, { pos = pos, target = target })
|
||||||
|
else
|
||||||
|
minetest.after(NETHER_PORTAL_TELEPORT_DELAY, teleport, obj, pos, target)
|
||||||
|
end
|
||||||
|
|
||||||
end, obj, pos, target)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -469,6 +482,9 @@ minetest.override_item("mcl_core:obsidian", {
|
||||||
_on_ignite = function(user, pointed_thing)
|
_on_ignite = function(user, pointed_thing)
|
||||||
local pos = pointed_thing.under
|
local pos = pointed_thing.under
|
||||||
local portal_placed = mcl_portals.light_nether_portal(pos)
|
local portal_placed = mcl_portals.light_nether_portal(pos)
|
||||||
|
if portal_placed then
|
||||||
|
minetest.log("action", "[mcl_portal] Nether portal activated at "..minetest.pos_to_string(pos)..".")
|
||||||
|
end
|
||||||
if portal_placed and minetest.get_modpath("doc") then
|
if portal_placed and minetest.get_modpath("doc") then
|
||||||
doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal")
|
doc.mark_entry_as_revealed(user:get_player_name(), "nodes", "mcl_portals:portal")
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user