From 61b4ff5983074696bff1c8d8917fb5dd654b8af7 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 3 Feb 2022 18:32:43 +0100 Subject: [PATCH] Spawn player on start block in new level --- mods/lzr_levels/init.lua | 24 ++++++++++++++++++++++-- mods/lzr_teleporter/init.lua | 4 ++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/mods/lzr_levels/init.lua b/mods/lzr_levels/init.lua index 2f18646..be34357 100644 --- a/mods/lzr_levels/init.lua +++ b/mods/lzr_levels/init.lua @@ -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) diff --git a/mods/lzr_teleporter/init.lua b/mods/lzr_teleporter/init.lua index 1e61753..f1ca3e4 100644 --- a/mods/lzr_teleporter/init.lua +++ b/mods/lzr_teleporter/init.lua @@ -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(), })