Spawn player on start block in new level
parent
bcc9bcdd33
commit
61b4ff5983
|
@ -15,6 +15,14 @@ lzr_levels.LAST_LEVEL = 0
|
||||||
-- Mod storage for game progress
|
-- Mod storage for game progress
|
||||||
local mod_storage = minetest.get_mod_storage()
|
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
|
-- Read the level schematics to find out some metadata about them
|
||||||
-- and count the number of levels
|
-- and count the number of levels
|
||||||
local analyze_levels = function()
|
local analyze_levels = function()
|
||||||
|
@ -38,12 +46,17 @@ local analyze_levels = function()
|
||||||
assert(schem, "Could not load level file: "..filename)
|
assert(schem, "Could not load level file: "..filename)
|
||||||
level_data[l].contains_rotatable_block = false
|
level_data[l].contains_rotatable_block = false
|
||||||
level_data[l].size = schem.size
|
level_data[l].size = schem.size
|
||||||
|
local size = level_data[l].size
|
||||||
for d=1, #schem.data do
|
for d=1, #schem.data do
|
||||||
local nodename = schem.data[d].name
|
local nodename = schem.data[d].name
|
||||||
local is_rotatable = minetest.get_item_group(nodename, "rotatable") == 1
|
local is_rotatable = minetest.get_item_group(nodename, "rotatable") == 1
|
||||||
if is_rotatable then
|
if is_rotatable then
|
||||||
level_data[l].contains_rotatable_block = true
|
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
|
end
|
||||||
end
|
end
|
||||||
|
@ -144,7 +157,14 @@ end
|
||||||
function lzr_levels.start_level(level)
|
function lzr_levels.start_level(level)
|
||||||
current_level = level
|
current_level = level
|
||||||
local player = get_singleplayer()
|
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_pos(start_pos)
|
||||||
player:set_look_horizontal(0)
|
player:set_look_horizontal(0)
|
||||||
lzr_levels.prepare_and_build_level(level)
|
lzr_levels.prepare_and_build_level(level)
|
||||||
|
|
|
@ -10,7 +10,7 @@ minetest.register_node("lzr_teleporter:teleporter", {
|
||||||
"lzr_teleporter_front.png",
|
"lzr_teleporter_front.png",
|
||||||
"lzr_teleporter_rear.png",
|
"lzr_teleporter_rear.png",
|
||||||
},
|
},
|
||||||
groups = { breakable = 1 },
|
groups = { breakable = 1, teleporter = 2 },
|
||||||
sounds = lzr_sounds.node_sound_stone_defaults(),
|
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_front.png",
|
||||||
"lzr_teleporter_off_rear.png",
|
"lzr_teleporter_off_rear.png",
|
||||||
},
|
},
|
||||||
groups = { breakable = 1 },
|
groups = { breakable = 1, teleporter = 1 },
|
||||||
sounds = lzr_sounds.node_sound_stone_defaults(),
|
sounds = lzr_sounds.node_sound_stone_defaults(),
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue