Add custom level size changer in editor

master
Wuzzy 2022-02-05 14:08:39 +01:00
parent e6f6d4c32e
commit 4577518382
3 changed files with 60 additions and 13 deletions

View File

@ -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 = "<x>,<y>,<z>",
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.")

View File

@ -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)

View File

@ -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)