mirror of
https://git.minetest.land/VoxeLibre/VoxeLibre.git
synced 2024-11-22 18:41:09 +01:00
Add API to create filled map
This commit is contained in:
parent
e11185638f
commit
2228b30658
1 changed files with 108 additions and 111 deletions
|
@ -1,3 +1,5 @@
|
|||
mcl_maps = {}
|
||||
|
||||
local S = minetest.get_translator("mcl_maps")
|
||||
local storage = minetest.get_mod_storage()
|
||||
local modpath = minetest.get_modpath("mcl_maps")
|
||||
|
@ -25,11 +27,9 @@ local loaded_maps = {}
|
|||
|
||||
local c_air = minetest.get_content_id("air")
|
||||
|
||||
-- Turn empty map into filled map by rightclick
|
||||
local make_filled_map = function(itemstack, placer, pointed_thing)
|
||||
local new_map = ItemStack("mcl_maps:filled_map")
|
||||
if minetest.settings:get_bool("enable_real_maps", true) then
|
||||
local meta = new_map:get_meta()
|
||||
function mcl_maps.create_map(pos)
|
||||
local itemstack = ItemStack("mcl_maps:filled_map")
|
||||
local meta = itemstack:get_meta()
|
||||
local id = storage:get_int("next_id")
|
||||
storage:set_int("next_id", id + 1)
|
||||
local texture_file = "mcl_maps_map_texture_" .. id .. ".tga"
|
||||
|
@ -38,13 +38,14 @@ local make_filled_map = function(itemstack, placer, pointed_thing)
|
|||
meta:set_int("mcl_maps:id", id)
|
||||
meta:set_string("mcl_maps:texture", texture)
|
||||
meta:set_string("mcl_maps:texture_path", texture_path)
|
||||
tt.reload_itemstack_description(new_map)
|
||||
tt.reload_itemstack_description(itemstack)
|
||||
creating_maps[texture] = true
|
||||
local pos = placer:get_pos()
|
||||
local minp = vector.multiply(vector.floor(vector.divide(pos, 128)), 128)
|
||||
local maxp = vector.add(minp, vector.new(127, 127, 127))
|
||||
minetest.emerge_area(minp, maxp, function(blockpos, action, calls_remaining)
|
||||
if calls_remaining < 1 then
|
||||
if calls_remaining > 0 then
|
||||
return
|
||||
end
|
||||
local vm = minetest.get_voxel_manip()
|
||||
local emin, emax = vm:read_from_map(minp, maxp)
|
||||
local data = vm:get_data()
|
||||
|
@ -61,31 +62,24 @@ local make_filled_map = function(itemstack, placer, pointed_thing)
|
|||
for map_y = maxp.y, minp.y, -1 do
|
||||
local index = area:index(map_x, map_y, map_z)
|
||||
local c_id = data[index]
|
||||
|
||||
if c_id ~= c_air then
|
||||
color = color_cache[c_id]
|
||||
|
||||
if color == nil then
|
||||
local nodename = minetest.get_name_from_content_id(c_id)
|
||||
local def = minetest.registered_nodes[nodename]
|
||||
|
||||
if def then
|
||||
local texture
|
||||
|
||||
if def.palette then
|
||||
texture = def.palette
|
||||
elseif def.tiles then
|
||||
texture = def.tiles[1]
|
||||
|
||||
if type(texture) == "table" then
|
||||
texture = texture.name
|
||||
end
|
||||
end
|
||||
|
||||
if texture then
|
||||
texture = texture:match("([^=^%^]-([^.]+))$"):split("^")[1]
|
||||
end
|
||||
|
||||
if def.palette then
|
||||
local palette = palettes[texture]
|
||||
color = palette and {palette = palette}
|
||||
|
@ -117,7 +111,6 @@ local make_filled_map = function(itemstack, placer, pointed_thing)
|
|||
}
|
||||
end
|
||||
end
|
||||
|
||||
height = map_y
|
||||
break
|
||||
end
|
||||
|
@ -128,13 +121,16 @@ local make_filled_map = function(itemstack, placer, pointed_thing)
|
|||
end
|
||||
last_heightmap = heightmap
|
||||
end
|
||||
|
||||
tga_encoder.image(pixels):save(texture_path)
|
||||
|
||||
creating_maps[texture] = false
|
||||
end
|
||||
end)
|
||||
return itemstack
|
||||
end
|
||||
|
||||
-- Turn empty map into filled map by rightclick
|
||||
local make_filled_map = function(itemstack, placer, pointed_thing)
|
||||
if minetest.settings:get_bool("enable_real_maps", true) then
|
||||
local new_map = mcl_maps.create_map(placer:get_pos())
|
||||
itemstack:take_item()
|
||||
if itemstack:is_empty() then
|
||||
return new_map
|
||||
|
@ -148,6 +144,7 @@ local make_filled_map = function(itemstack, placer, pointed_thing)
|
|||
return itemstack
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.register_craftitem("mcl_maps:empty_map", {
|
||||
description = S("Empty Map"),
|
||||
|
|
Loading…
Reference in a new issue