Spawn player on start block in new level

master
Wuzzy 2022-02-03 18:32:43 +01:00
parent bcc9bcdd33
commit 61b4ff5983
2 changed files with 24 additions and 4 deletions

View File

@ -15,6 +15,14 @@ lzr_levels.LAST_LEVEL = 0
-- Mod storage for game progress
local mod_storage = minetest.get_mod_storage()
local flat_index_to_pos = function(index, size)
local d = index-1
local x = d % size.x
local y = math.floor((d / size.x) % size.y)
local z = math.floor((d / (size.x*size.y)) % size.z)
return vector.new(x,y,z)
end
-- Read the level schematics to find out some metadata about them
-- and count the number of levels
local analyze_levels = function()
@ -38,12 +46,17 @@ local analyze_levels = function()
assert(schem, "Could not load level file: "..filename)
level_data[l].contains_rotatable_block = false
level_data[l].size = schem.size
local size = level_data[l].size
for d=1, #schem.data do
local nodename = schem.data[d].name
local is_rotatable = minetest.get_item_group(nodename, "rotatable") == 1
if is_rotatable then
level_data[l].contains_rotatable_block = true
break
end
if nodename == "lzr_teleporter:teleporter_off" then
local start = flat_index_to_pos(d, size)
start = vector.add(start, vector.new(0, 0.5, 0))
level_data[l].start_pos = start
end
end
end
@ -144,7 +157,14 @@ end
function lzr_levels.start_level(level)
current_level = level
local player = get_singleplayer()
local start_pos = vector.add(lzr_globals.LEVEL_POS, {x=4,y=-0.5,z=4})
local start_pos
if level_data[level].start_pos then
start_pos = vector.add(lzr_globals.LEVEL_POS, level_data[level].start_pos)
else
-- Fallback
local size = level_data[level].size
start_pos = vector.add(lzr_globals.LEVEL_POS, vector.new(math.floor(size.x/2), -0.5, math.floor(size.z/2)))
end
player:set_pos(start_pos)
player:set_look_horizontal(0)
lzr_levels.prepare_and_build_level(level)

View File

@ -10,7 +10,7 @@ minetest.register_node("lzr_teleporter:teleporter", {
"lzr_teleporter_front.png",
"lzr_teleporter_rear.png",
},
groups = { breakable = 1 },
groups = { breakable = 1, teleporter = 2 },
sounds = lzr_sounds.node_sound_stone_defaults(),
})
@ -24,6 +24,6 @@ minetest.register_node("lzr_teleporter:teleporter_off", {
"lzr_teleporter_off_front.png",
"lzr_teleporter_off_rear.png",
},
groups = { breakable = 1 },
groups = { breakable = 1, teleporter = 1 },
sounds = lzr_sounds.node_sound_stone_defaults(),
})