forked from MineClone5/MineClone5
#62 Spawn ender dragon again
This commit is contained in:
parent
011423ac6d
commit
03590d3730
|
@ -1133,57 +1133,6 @@ if string.len(mg_flags_str) > 0 then
|
||||||
end
|
end
|
||||||
minetest.set_mapgen_setting("mg_flags", mg_flags_str, true)
|
minetest.set_mapgen_setting("mg_flags", mg_flags_str, true)
|
||||||
|
|
||||||
-- Takes an index of a biomemap table (from minetest.get_mapgen_object),
|
|
||||||
-- minp and maxp (from an on_generated callback) and returns the real world coordinates
|
|
||||||
-- as X, Z.
|
|
||||||
-- Inverse function of xz_to_biomemap
|
|
||||||
--[[local function biomemap_to_xz(index, minp, maxp)
|
|
||||||
local xwidth = maxp.x - minp.x + 1
|
|
||||||
local zwidth = maxp.z - minp.z + 1
|
|
||||||
local x = ((index-1) % xwidth) + minp.x
|
|
||||||
local z = ((index-1) / zwidth) + minp.z
|
|
||||||
return x, z
|
|
||||||
end]]
|
|
||||||
|
|
||||||
local dragon_spawn_pos = false
|
|
||||||
local dragon_spawned, portal_generated = false, false
|
|
||||||
|
|
||||||
local function spawn_ender_dragon()
|
|
||||||
local obj = minetest.add_entity(dragon_spawn_pos, "mobs_mc:enderdragon")
|
|
||||||
if not obj then return false end
|
|
||||||
local dragon_entity = obj:get_luaentity()
|
|
||||||
dragon_entity._initial = true
|
|
||||||
dragon_entity._portal_pos = pos
|
|
||||||
return obj
|
|
||||||
end
|
|
||||||
|
|
||||||
local function try_to_spawn_ender_dragon()
|
|
||||||
if spawn_ender_dragon() then
|
|
||||||
dragon_spawned = true
|
|
||||||
return
|
|
||||||
end
|
|
||||||
minetest.after(2, try_to_spawn_ender_dragon)
|
|
||||||
minetest.log("warning", "[mcl_mapgen_core] WARNING! Ender dragon doesn't want to spawn at "..minetest.pos_to_string(dragon_spawn_pos))
|
|
||||||
end
|
|
||||||
|
|
||||||
if portal_generated and not dragon_spawned then
|
|
||||||
minetest.after(10, try_to_spawn_ender_dragon)
|
|
||||||
end
|
|
||||||
|
|
||||||
function mcl_mapgen_core.generate_end_exit_portal(pos)
|
|
||||||
if dragon_spawn_pos then return false end
|
|
||||||
dragon_spawn_pos = vector.add(pos, vector.new(3, 11, 3))
|
|
||||||
mcl_structures.call_struct(pos, "end_exit_portal", nil, nil, function()
|
|
||||||
minetest.after(2, function()
|
|
||||||
minetest.emerge_area(vector.subtract(dragon_spawn_pos, {x = 64, y = 12, z = 5}), vector.add(dragon_spawn_pos, {x = 3, y = 3, z = 5}), function(blockpos, action, calls_remaining, param)
|
|
||||||
if calls_remaining > 0 then return end
|
|
||||||
minetest.after(2, try_to_spawn_ender_dragon)
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
end)
|
|
||||||
portal_generated = true
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Generate basic layer-based nodes: void, bedrock, realm barrier, lava seas, etc.
|
-- Generate basic layer-based nodes: void, bedrock, realm barrier, lava seas, etc.
|
||||||
-- Also perform some basic node replacements.
|
-- Also perform some basic node replacements.
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,31 @@ local p0 = {
|
||||||
|
|
||||||
local schematic = modpath .. "/schematics/mcl_structures_end_exit_portal.mts"
|
local schematic = modpath .. "/schematics/mcl_structures_end_exit_portal.mts"
|
||||||
|
|
||||||
|
local dragon_spawn_pos = false
|
||||||
|
local dragon_spawned, portal_generated = false, false
|
||||||
|
|
||||||
|
local function spawn_ender_dragon()
|
||||||
|
local obj = minetest.add_entity(dragon_spawn_pos, "mobs_mc:enderdragon")
|
||||||
|
if not obj then return false end
|
||||||
|
local dragon_entity = obj:get_luaentity()
|
||||||
|
dragon_entity._initial = true
|
||||||
|
dragon_entity._portal_pos = p0
|
||||||
|
return obj
|
||||||
|
end
|
||||||
|
|
||||||
|
local function try_to_spawn_ender_dragon()
|
||||||
|
if spawn_ender_dragon() then
|
||||||
|
dragon_spawned = true
|
||||||
|
return
|
||||||
|
end
|
||||||
|
minetest.after(2, try_to_spawn_ender_dragon)
|
||||||
|
minetest.log("warning", "Ender dragon doesn't want to spawn at "..minetest.pos_to_string(dragon_spawn_pos))
|
||||||
|
end
|
||||||
|
|
||||||
|
if portal_generated and not dragon_spawned then
|
||||||
|
minetest.after(10, try_to_spawn_ender_dragon)
|
||||||
|
end
|
||||||
|
|
||||||
local function place(pos, rotation, pr)
|
local function place(pos, rotation, pr)
|
||||||
mcl_structures.place_schematic({pos = pos, schematic = schematic, rotation = rotation, pr = pr})
|
mcl_structures.place_schematic({pos = pos, schematic = schematic, rotation = rotation, pr = pr})
|
||||||
end
|
end
|
||||||
|
@ -28,6 +53,10 @@ mcl_mapgen.register_mapgen(function(minp, maxp, seed, vm_context)
|
||||||
if minp.z > END_EXIT_PORTAL_POS_Z then return end
|
if minp.z > END_EXIT_PORTAL_POS_Z then return end
|
||||||
if maxp.z < END_EXIT_PORTAL_POS_Z then return end
|
if maxp.z < END_EXIT_PORTAL_POS_Z then return end
|
||||||
|
|
||||||
|
dragon_spawn_pos = vector.add(p0, vector.new(3, 11, 3))
|
||||||
|
portal_generated = true
|
||||||
|
try_to_spawn_ender_dragon()
|
||||||
|
|
||||||
local p = table.copy(p0)
|
local p = table.copy(p0)
|
||||||
|
|
||||||
for y = y2, y1, -1 do
|
for y = y2, y1, -1 do
|
||||||
|
|
|
@ -337,9 +337,7 @@ function mcl_structures.call_struct(pos, struct_style, rotation, pr, callback)
|
||||||
if not rotation then
|
if not rotation then
|
||||||
rotation = "random"
|
rotation = "random"
|
||||||
end
|
end
|
||||||
if struct_style == "witch_hut" then
|
if struct_style == "boulder" then
|
||||||
return mcl_structures.generate_witch_hut(pos, rotation)
|
|
||||||
elseif struct_style == "boulder" then
|
|
||||||
return mcl_structures.generate_boulder(pos, rotation, pr)
|
return mcl_structures.generate_boulder(pos, rotation, pr)
|
||||||
elseif struct_style == "end_exit_portal" then
|
elseif struct_style == "end_exit_portal" then
|
||||||
return mcl_structures.generate_end_exit_portal(pos, rotation, pr, callback)
|
return mcl_structures.generate_end_exit_portal(pos, rotation, pr, callback)
|
||||||
|
@ -385,27 +383,6 @@ function mcl_structures.generate_boulder(pos, rotation, pr)
|
||||||
return minetest.place_schematic(newpos, path, rotation) -- don't serialize schematics for registered biome decorations, for MT 5.4.0, https://github.com/minetest/minetest/issues/10995
|
return minetest.place_schematic(newpos, path, rotation) -- don't serialize schematics for registered biome decorations, for MT 5.4.0, https://github.com/minetest/minetest/issues/10995
|
||||||
end
|
end
|
||||||
|
|
||||||
local function hut_placement_callback(p1, p2, size, orientation, pr)
|
|
||||||
if not p1 or not p2 then return end
|
|
||||||
local legs = minetest.find_nodes_in_area(p1, p2, "mcl_core:tree")
|
|
||||||
for i = 1, #legs do
|
|
||||||
while minetest.get_item_group(mcl_mapgen.get_far_node({x=legs[i].x, y=legs[i].y-1, z=legs[i].z}, true, 333333).name, "water") ~= 0 do
|
|
||||||
legs[i].y = legs[i].y - 1
|
|
||||||
minetest.swap_node(legs[i], {name = "mcl_core:tree", param2 = 2})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function mcl_structures.generate_witch_hut(pos, rotation, pr)
|
|
||||||
local path = modpath.."/schematics/mcl_structures_witch_hut.mts"
|
|
||||||
mcl_structures.place_schematic(pos, path, rotation, nil, true, nil, hut_placement_callback, pr)
|
|
||||||
end
|
|
||||||
|
|
||||||
function mcl_structures.generate_ice_spike_large(pos, rotation)
|
|
||||||
local path = modpath.."/schematics/mcl_structures_ice_spike_large.mts"
|
|
||||||
return minetest.place_schematic(pos, path, rotation or "random", nil, false) -- don't serialize schematics for registered biome decorations, for MT 5.4.0
|
|
||||||
end
|
|
||||||
|
|
||||||
function mcl_structures.generate_end_exit_portal(pos, rot, pr, callback)
|
function mcl_structures.generate_end_exit_portal(pos, rot, pr, callback)
|
||||||
local path = modpath.."/schematics/mcl_structures_end_exit_portal.mts"
|
local path = modpath.."/schematics/mcl_structures_end_exit_portal.mts"
|
||||||
return mcl_structures.place_schematic(pos, path, rot or "0", {["mcl_portals:portal_end"] = "air"}, true, nil, callback)
|
return mcl_structures.place_schematic(pos, path, rot or "0", {["mcl_portals:portal_end"] = "air"}, true, nil, callback)
|
||||||
|
|
Loading…
Reference in New Issue