From 4577518382806b39523afdeb1787bc000392cbe6 Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Sat, 5 Feb 2022 14:08:39 +0100 Subject: [PATCH] Add custom level size changer in editor --- mods/lzr_editor/init.lua | 46 ++++++++++++++++++++++++++++++++++++++- mods/lzr_globals/init.lua | 13 ++++++----- mods/lzr_levels/init.lua | 14 +++++++----- 3 files changed, 60 insertions(+), 13 deletions(-) diff --git a/mods/lzr_editor/init.lua b/mods/lzr_editor/init.lua index 270a7d9..d98bbbe 100644 --- a/mods/lzr_editor/init.lua +++ b/mods/lzr_editor/init.lua @@ -1,5 +1,7 @@ local S = minetest.get_translator("lzr_editor") +local level_size = table.copy(lzr_globals.DEFAULT_LEVEL_SIZE) + minetest.register_chatcommand("editor", { privs = { server = true }, description = S("Start or exit level editor"), @@ -30,6 +32,46 @@ minetest.register_chatcommand("editor", { end, }) +local function clear_area(size) + local posses = {} + for z=-1, size.x+1 do + for y=-1, size.y+1 do + for x=-1, size.z+1 do + local pos = vector.new(x,y,z) + pos = vector.add(pos, lzr_globals.LEVEL_POS) + table.insert(posses, vector.new(x,y,z)) + end + end + end + minetest.bulk_set_node(posses, {name="air"}) +end + +minetest.register_chatcommand("editor_size", { + privs = { server = true }, + description = S("Set level size for editor (warning: clears level contents!)"), + params = ",,", + func = function(name, param) + if lzr_gamestate.get_state() ~= lzr_gamestate.EDITOR then + return false, S("Not in editor mode!") + end + local size = minetest.string_to_pos(param) + if not size then + return false + end + if size.x > lzr_globals.PLAYFIELD_SIZE.x or + size.y > lzr_globals.PLAYFIELD_SIZE.y or + size.z > lzr_globals.PLAYFIELD_SIZE.z then + return false, S("Too large!") + end + if size.x < 1 or size.y < 4 or size.z < 1 then + return false, S("Too small!") + end + clear_area(lzr_globals.PLAYFIELD_SIZE) + level_size = size + lzr_levels.build_room(lzr_globals.LEVEL_POS, level_size) + return true + end, +}) -- Dummy save and load functions (only 1 level name supported for now) minetest.register_chatcommand("editor_save", { @@ -49,7 +91,7 @@ minetest.register_chatcommand("editor_save", { local level_name = "level_custom_"..num minetest.mkdir(minetest.get_worldpath().."/levels") local filename = minetest.get_worldpath().."/levels/"..level_name..".mts" - local ok = minetest.create_schematic(lzr_globals.LEVEL_POS, vector.add(lzr_globals.LEVEL_POS, lzr_globals.PLAYFIELD_SIZE), {}, filename, {}) + local ok = minetest.create_schematic(lzr_globals.LEVEL_POS, vector.add(lzr_globals.LEVEL_POS, level_size), {}, filename, {}) if ok then minetest.log("action", "[lzr_editor] Level written to "..filename) return true, S("Level saved to @1.", filename) @@ -94,6 +136,8 @@ minetest.register_chatcommand("editor_load", { local filename = minetest.get_worldpath().."/levels/"..level_name..".mts" local schem = minetest.read_schematic(filename, {}) if schem then + level_size = schem.size + lzr_levels.build_room(lzr_globals.LEVEL_POS, level_size) minetest.place_schematic(lzr_globals.LEVEL_POS, schem, "0", {}, true, {}) minetest.log("action", "[lzr_editor] Level loaded from "..filename) return true, S("Level loaded.") diff --git a/mods/lzr_globals/init.lua b/mods/lzr_globals/init.lua index ccbaa32..261e6e6 100644 --- a/mods/lzr_globals/init.lua +++ b/mods/lzr_globals/init.lua @@ -1,11 +1,12 @@ lzr_globals = {} -lzr_globals.PLAYFIELD_START = { x = -5, y = 0, z = -5 } -lzr_globals.PLAYFIELD_SIZE = { x = 20, y = 20, z = 20 } +lzr_globals.PLAYFIELD_START = vector.new(-5, 0, -5) +lzr_globals.PLAYFIELD_SIZE = vector.new(20, 20, 20) lzr_globals.PLAYFIELD_END = vector.add(lzr_globals.PLAYFIELD_START, lzr_globals.PLAYFIELD_SIZE) -lzr_globals.LEVEL_POS = { x = 0, y = 0, z = 0 } -lzr_globals.MENU_SHIP_POS = { x = -500, y = -4, z = -500 } -lzr_globals.MENU_SHIP_PLAYER_SPAWN_OFFSET = { x = 7, y = 8.5, z = 29 } -lzr_globals.MENU_SHIP_STARTBOOK_OFFSET = { x = 7, y = 10, z = 31 } +lzr_globals.LEVEL_POS = vector.zero() +lzr_globals.DEFAULT_LEVEL_SIZE = vector.new(10, 6, 10) +lzr_globals.MENU_SHIP_POS = vector.new(-500, -4, -500) +lzr_globals.MENU_SHIP_PLAYER_SPAWN_OFFSET = vector.new(7, 8.5, 29) +lzr_globals.MENU_SHIP_STARTBOOK_OFFSET = vector.new(7, 10, 31) lzr_globals.MENU_PLAYER_SPAWN_POS = vector.add(lzr_globals.MENU_SHIP_POS, lzr_globals.MENU_SHIP_PLAYER_SPAWN_OFFSET) diff --git a/mods/lzr_levels/init.lua b/mods/lzr_levels/init.lua index 34dd372..0a840c7 100644 --- a/mods/lzr_levels/init.lua +++ b/mods/lzr_levels/init.lua @@ -98,11 +98,13 @@ local emerge_callback = function(blockpos, action, calls_remaining, param) minetest.log("error", "[lzr_levels] Room emerging cancelled.") elseif calls_remaining == 0 and (action == minetest.EMERGE_GENERATED or action == minetest.EMERGE_FROM_DISK or action == minetest.EMERGE_FROM_MEMORY) then build_room(param) - local level_ok = lzr_levels.build_level(param.level) - if not level_ok then - minetest.log("error", "[lzr_levels] Room emerge callback done with error") - else - minetest.log("action", "[lzr_levels] Room emerge callback done") + if param.level then + local level_ok = lzr_levels.build_level(param.level) + if not level_ok then + minetest.log("error", "[lzr_levels] Room emerge callback done with error") + else + minetest.log("action", "[lzr_levels] Room emerge callback done") + end end end end @@ -116,7 +118,7 @@ function lzr_levels.build_room(pos, size, level) end function lzr_levels.prepare_and_build_level(level) - lzr_levels.build_room(lzr_globals.LEVEL_POS, {x=10, y=6, z=10}, level) + lzr_levels.build_room(lzr_globals.LEVEL_POS, level_data[level].size, level) end function lzr_levels.build_level(level)