mirror of
https://git.minetest.land/MineClone2/MineClone2.git
synced 2024-11-04 23:03:51 +01:00
Refactor mcl_init
- use new vectors - make code less confuse - type annotations
This commit is contained in:
parent
8778ee6e9e
commit
a3d459f020
@ -3,26 +3,26 @@ mcl_vars = {}
|
|||||||
|
|
||||||
mcl_vars.redstone_tick = 0.1
|
mcl_vars.redstone_tick = 0.1
|
||||||
|
|
||||||
--- GUI / inventory menu settings
|
-- GUI / inventory menu settings
|
||||||
mcl_vars.gui_slots = "listcolors[#9990;#FFF7;#FFF0;#000;#FFF]"
|
mcl_vars.gui_slots = "listcolors[#9990;#FFF7;#FFF0;#000;#FFF]"
|
||||||
|
|
||||||
-- nonbg is added as formspec prepend in mcl_formspec_prepend
|
-- nonbg is added as formspec prepend in mcl_formspec_prepend
|
||||||
mcl_vars.gui_nonbg = mcl_vars.gui_slots ..
|
mcl_vars.gui_nonbg = table.concat({
|
||||||
"style_type[image_button;border=false;bgimg=mcl_inventory_button9.png;bgimg_pressed=mcl_inventory_button9_pressed.png;bgimg_middle=2,2]"..
|
mcl_vars.gui_slots,
|
||||||
"style_type[button;border=false;bgimg=mcl_inventory_button9.png;bgimg_pressed=mcl_inventory_button9_pressed.png;bgimg_middle=2,2]"..
|
"style_type[image_button;border=false;bgimg=mcl_inventory_button9.png;bgimg_pressed=mcl_inventory_button9_pressed.png;bgimg_middle=2,2]",
|
||||||
"style_type[field;textcolor=#323232]"..
|
"style_type[button;border=false;bgimg=mcl_inventory_button9.png;bgimg_pressed=mcl_inventory_button9_pressed.png;bgimg_middle=2,2]",
|
||||||
"style_type[label;textcolor=#323232]"..
|
"style_type[field;textcolor=#323232]",
|
||||||
"style_type[textarea;textcolor=#323232]"..
|
"style_type[label;textcolor=#323232]",
|
||||||
"style_type[checkbox;textcolor=#323232]"
|
"style_type[textarea;textcolor=#323232]",
|
||||||
|
"style_type[checkbox;textcolor=#323232]",
|
||||||
|
})
|
||||||
|
|
||||||
-- Background stuff must be manually added by mods (no formspec prepend)
|
-- Background stuff must be manually added by mods (no formspec prepend)
|
||||||
mcl_vars.gui_bg_color = "bgcolor[#00000000]"
|
mcl_vars.gui_bg_color = "bgcolor[#00000000]"
|
||||||
mcl_vars.gui_bg_img = "background9[1,1;1,1;mcl_base_textures_background9.png;true;7]"
|
mcl_vars.gui_bg_img = "background9[1,1;1,1;mcl_base_textures_background9.png;true;7]"
|
||||||
|
|
||||||
-- Legacy
|
|
||||||
mcl_vars.inventory_header = ""
|
|
||||||
|
|
||||||
-- Tool wield size
|
-- Tool wield size
|
||||||
mcl_vars.tool_wield_scale = { x = 1.8, y = 1.8, z = 1 }
|
mcl_vars.tool_wield_scale = vector.new(1.8, 1.8, 1)
|
||||||
|
|
||||||
-- Mapgen variables
|
-- Mapgen variables
|
||||||
local mg_name = minetest.get_mapgen_setting("mg_name")
|
local mg_name = minetest.get_mapgen_setting("mg_name")
|
||||||
@ -35,55 +35,69 @@ mcl_vars.chunksize = math.max(1, tonumber(minetest.get_mapgen_setting("chunksize
|
|||||||
mcl_vars.MAP_BLOCKSIZE = math.max(1, minetest.MAP_BLOCKSIZE or 16)
|
mcl_vars.MAP_BLOCKSIZE = math.max(1, minetest.MAP_BLOCKSIZE or 16)
|
||||||
mcl_vars.mapgen_limit = math.max(1, tonumber(minetest.get_mapgen_setting("mapgen_limit")) or 31000)
|
mcl_vars.mapgen_limit = math.max(1, tonumber(minetest.get_mapgen_setting("mapgen_limit")) or 31000)
|
||||||
mcl_vars.MAX_MAP_GENERATION_LIMIT = math.max(1, minetest.MAX_MAP_GENERATION_LIMIT or 31000)
|
mcl_vars.MAX_MAP_GENERATION_LIMIT = math.max(1, minetest.MAX_MAP_GENERATION_LIMIT or 31000)
|
||||||
|
|
||||||
local central_chunk_offset = -math.floor(mcl_vars.chunksize / 2)
|
local central_chunk_offset = -math.floor(mcl_vars.chunksize / 2)
|
||||||
|
|
||||||
mcl_vars.central_chunk_offset_in_nodes = central_chunk_offset * mcl_vars.MAP_BLOCKSIZE
|
mcl_vars.central_chunk_offset_in_nodes = central_chunk_offset * mcl_vars.MAP_BLOCKSIZE
|
||||||
mcl_vars.chunk_size_in_nodes = mcl_vars.chunksize * mcl_vars.MAP_BLOCKSIZE
|
mcl_vars.chunk_size_in_nodes = mcl_vars.chunksize * mcl_vars.MAP_BLOCKSIZE
|
||||||
|
|
||||||
local central_chunk_min_pos = central_chunk_offset * mcl_vars.MAP_BLOCKSIZE
|
local central_chunk_min_pos = central_chunk_offset * mcl_vars.MAP_BLOCKSIZE
|
||||||
local central_chunk_max_pos = central_chunk_min_pos + mcl_vars.chunk_size_in_nodes - 1
|
local central_chunk_max_pos = central_chunk_min_pos + mcl_vars.chunk_size_in_nodes - 1
|
||||||
local ccfmin = central_chunk_min_pos - mcl_vars.MAP_BLOCKSIZE -- Fullminp/fullmaxp of central chunk, in nodes
|
local ccfmin = central_chunk_min_pos - mcl_vars.MAP_BLOCKSIZE -- Fullminp/fullmaxp of central chunk, in nodes
|
||||||
local ccfmax = central_chunk_max_pos + mcl_vars.MAP_BLOCKSIZE
|
local ccfmax = central_chunk_max_pos + mcl_vars.MAP_BLOCKSIZE
|
||||||
local mapgen_limit_b = math.floor(math.min(mcl_vars.mapgen_limit, mcl_vars.MAX_MAP_GENERATION_LIMIT) / mcl_vars.MAP_BLOCKSIZE)
|
local mapgen_limit_b = math.floor(math.min(mcl_vars.mapgen_limit, mcl_vars.MAX_MAP_GENERATION_LIMIT) /
|
||||||
|
mcl_vars.MAP_BLOCKSIZE)
|
||||||
local mapgen_limit_min = -mapgen_limit_b * mcl_vars.MAP_BLOCKSIZE
|
local mapgen_limit_min = -mapgen_limit_b * mcl_vars.MAP_BLOCKSIZE
|
||||||
local mapgen_limit_max = (mapgen_limit_b + 1) * mcl_vars.MAP_BLOCKSIZE - 1
|
local mapgen_limit_max = (mapgen_limit_b + 1) * mcl_vars.MAP_BLOCKSIZE - 1
|
||||||
local numcmin = math.max(math.floor((ccfmin - mapgen_limit_min) / mcl_vars.chunk_size_in_nodes), 0) -- Number of complete chunks from central chunk
|
local numcmin = math.max(math.floor((ccfmin - mapgen_limit_min) / mcl_vars.chunk_size_in_nodes), 0) -- Number of complete chunks from central chunk
|
||||||
local numcmax = math.max(math.floor((mapgen_limit_max - ccfmax) / mcl_vars.chunk_size_in_nodes), 0) -- fullminp/fullmaxp to effective mapgen limits.
|
local numcmax = math.max(math.floor((mapgen_limit_max - ccfmax) / mcl_vars.chunk_size_in_nodes), 0) -- fullminp/fullmaxp to effective mapgen limits.
|
||||||
|
|
||||||
mcl_vars.mapgen_edge_min = central_chunk_min_pos - numcmin * mcl_vars.chunk_size_in_nodes
|
mcl_vars.mapgen_edge_min = central_chunk_min_pos - numcmin * mcl_vars.chunk_size_in_nodes
|
||||||
mcl_vars.mapgen_edge_max = central_chunk_max_pos + numcmax * mcl_vars.chunk_size_in_nodes
|
mcl_vars.mapgen_edge_max = central_chunk_max_pos + numcmax * mcl_vars.chunk_size_in_nodes
|
||||||
|
|
||||||
|
---@param x integer
|
||||||
|
---@return integer
|
||||||
local function coordinate_to_block(x)
|
local function coordinate_to_block(x)
|
||||||
return math.floor(x / mcl_vars.MAP_BLOCKSIZE)
|
return math.floor(x / mcl_vars.MAP_BLOCKSIZE)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@param x integer
|
||||||
|
---@return integer
|
||||||
local function coordinate_to_chunk(x)
|
local function coordinate_to_chunk(x)
|
||||||
return math.floor((coordinate_to_block(x) - central_chunk_offset) / mcl_vars.chunksize)
|
return math.floor((coordinate_to_block(x) - central_chunk_offset) / mcl_vars.chunksize)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@param pos Vector
|
||||||
|
---@return Vector
|
||||||
function mcl_vars.pos_to_block(pos)
|
function mcl_vars.pos_to_block(pos)
|
||||||
return {
|
return vector.new(
|
||||||
x = coordinate_to_block(pos.x),
|
coordinate_to_block(pos.x),
|
||||||
y = coordinate_to_block(pos.y),
|
coordinate_to_block(pos.y),
|
||||||
z = coordinate_to_block(pos.z)
|
coordinate_to_block(pos.z)
|
||||||
}
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@param pos Vector
|
||||||
|
---@return Vector
|
||||||
function mcl_vars.pos_to_chunk(pos)
|
function mcl_vars.pos_to_chunk(pos)
|
||||||
return {
|
return vector.new(
|
||||||
x = coordinate_to_chunk(pos.x),
|
coordinate_to_chunk(pos.x),
|
||||||
y = coordinate_to_chunk(pos.y),
|
coordinate_to_chunk(pos.y),
|
||||||
z = coordinate_to_chunk(pos.z)
|
coordinate_to_chunk(pos.z)
|
||||||
}
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
local k_positive = math.ceil(mcl_vars.MAX_MAP_GENERATION_LIMIT / mcl_vars.chunk_size_in_nodes)
|
local k_positive = math.ceil(mcl_vars.MAX_MAP_GENERATION_LIMIT / mcl_vars.chunk_size_in_nodes)
|
||||||
local k_positive_z = k_positive * 2
|
local k_positive_z = k_positive * 2
|
||||||
local k_positive_y = k_positive_z * k_positive_z
|
local k_positive_y = k_positive_z * k_positive_z
|
||||||
|
|
||||||
|
---@param pos Vector
|
||||||
|
---@return integer
|
||||||
function mcl_vars.get_chunk_number(pos) -- unsigned int
|
function mcl_vars.get_chunk_number(pos) -- unsigned int
|
||||||
local c = mcl_vars.pos_to_chunk(pos)
|
local c = mcl_vars.pos_to_chunk(pos)
|
||||||
return
|
return (c.y + k_positive) * k_positive_y +
|
||||||
(c.y + k_positive) * k_positive_y +
|
|
||||||
(c.z + k_positive) * k_positive_z +
|
(c.z + k_positive) * k_positive_z +
|
||||||
c.x + k_positive
|
c.x + k_positive
|
||||||
end
|
end
|
||||||
|
|
||||||
if not superflat and not singlenode then
|
if not superflat and not singlenode then
|
||||||
@ -117,11 +131,8 @@ elseif singlenode then
|
|||||||
mcl_vars.mg_bedrock_is_rough = false
|
mcl_vars.mg_bedrock_is_rough = false
|
||||||
else
|
else
|
||||||
-- Classic superflat
|
-- Classic superflat
|
||||||
local ground = minetest.get_mapgen_setting("mgflat_ground_level")
|
local ground = tonumber(minetest.get_mapgen_setting("mgflat_ground_level")) or 8
|
||||||
ground = tonumber(ground)
|
|
||||||
if not ground then
|
|
||||||
ground = 8
|
|
||||||
end
|
|
||||||
mcl_vars.mg_overworld_min = ground - 3
|
mcl_vars.mg_overworld_min = ground - 3
|
||||||
mcl_vars.mg_overworld_max_official = mcl_vars.mg_overworld_min + minecraft_height_limit
|
mcl_vars.mg_overworld_max_official = mcl_vars.mg_overworld_min + minecraft_height_limit
|
||||||
mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min
|
mcl_vars.mg_bedrock_overworld_min = mcl_vars.mg_overworld_min
|
||||||
@ -180,14 +191,16 @@ minetest.craftitemdef_default.stack_max = 64
|
|||||||
math.randomseed(os.time())
|
math.randomseed(os.time())
|
||||||
|
|
||||||
local chunks = {} -- intervals of chunks generated
|
local chunks = {} -- intervals of chunks generated
|
||||||
|
|
||||||
|
---@param pos Vector
|
||||||
function mcl_vars.add_chunk(pos)
|
function mcl_vars.add_chunk(pos)
|
||||||
local n = mcl_vars.get_chunk_number(pos) -- unsigned int
|
local n = mcl_vars.get_chunk_number(pos) -- unsigned int
|
||||||
local prev
|
local prev
|
||||||
for i, d in pairs(chunks) do
|
for i, d in pairs(chunks) do
|
||||||
if n <= d[2] then -- we've found it
|
if n <= d[2] then -- we've found it
|
||||||
if (n == d[2]) or (n >= d[1]) then return end -- already here
|
if (n == d[2]) or (n >= d[1]) then return end -- already here
|
||||||
if n == d[1]-1 then -- right before:
|
if n == d[1] - 1 then -- right before:
|
||||||
if prev and (prev[2] == n-1) then
|
if prev and (prev[2] == n - 1) then
|
||||||
prev[2] = d[2]
|
prev[2] = d[2]
|
||||||
table.remove(chunks, i)
|
table.remove(chunks, i)
|
||||||
return
|
return
|
||||||
@ -195,17 +208,20 @@ function mcl_vars.add_chunk(pos)
|
|||||||
d[1] = n
|
d[1] = n
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if prev and (prev[2] == n-1) then --join to previous
|
if prev and (prev[2] == n - 1) then --join to previous
|
||||||
prev[2] = n
|
prev[2] = n
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
table.insert(chunks, i, {n, n}) -- insert new interval before i
|
table.insert(chunks, i, { n, n }) -- insert new interval before i
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
prev = d
|
prev = d
|
||||||
end
|
end
|
||||||
chunks[#chunks+1] = {n, n}
|
chunks[#chunks + 1] = { n, n }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@param pos Vector
|
||||||
|
---@return boolean
|
||||||
function mcl_vars.is_generated(pos)
|
function mcl_vars.is_generated(pos)
|
||||||
local n = mcl_vars.get_chunk_number(pos) -- unsigned int
|
local n = mcl_vars.get_chunk_number(pos) -- unsigned int
|
||||||
for i, d in pairs(chunks) do
|
for i, d in pairs(chunks) do
|
||||||
@ -216,47 +232,45 @@ function mcl_vars.is_generated(pos)
|
|||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
-- "Trivial" (actually NOT) function to just read the node and some stuff to not just return "ignore", like mt 5.4 does.
|
---"Trivial" (actually NOT) function to just read the node and some stuff to not just return "ignore", like mt 5.4 does.
|
||||||
-- p: Position, if it's wrong, {name="error"} node will return.
|
---@param pos Vector Position, if it's wrong, `{name="error"}` node will return.
|
||||||
-- force: optional (default: false) - Do the maximum to still read the node within us_timeout.
|
---@param force boolean Optional (default: `false`), Do the maximum to still read the node within us_timeout.
|
||||||
-- us_timeout: optional (default: 244 = 0.000244 s = 1/80/80/80), set it at least to 3000000 to let mapgen to finish its job.
|
---@param us_timeout number Optional (default: `244 = 0.000244 s = 1/80/80/80`), set it at least to `3000000` to let mapgen to finish its job
|
||||||
--
|
---@return node # Node definition, eg. `{name="air"}`. Unfortunately still can return `{name="ignore"}`.
|
||||||
-- returns node definition, eg. {name="air"}. Unfortunately still can return {name="ignore"}.
|
function mcl_vars.get_node(pos, force, us_timeout)
|
||||||
function mcl_vars.get_node(p, force, us_timeout)
|
|
||||||
-- check initial circumstances
|
-- check initial circumstances
|
||||||
if not p or not p.x or not p.y or not p.z then return {name="error"} end
|
if not pos or not pos.x or not pos.y or not pos.z then return { name = "error" } end
|
||||||
|
|
||||||
-- try common way
|
-- try common way
|
||||||
local node = minetest.get_node(p)
|
local node = minetest.get_node(pos)
|
||||||
if node.name ~= "ignore" then
|
if node.name ~= "ignore" then
|
||||||
return node
|
return node
|
||||||
end
|
end
|
||||||
|
|
||||||
-- copy table to get sure it won't changed by other threads
|
-- copy vector to get sure it won't changed by other threads
|
||||||
local pos = {x=p.x,y=p.y,z=p.z}
|
local pos_copy = vector.copy(pos)
|
||||||
|
|
||||||
-- try LVM
|
-- try LVM
|
||||||
minetest.get_voxel_manip():read_from_map(pos, pos)
|
minetest.get_voxel_manip():read_from_map(pos_copy, pos_copy)
|
||||||
node = minetest.get_node(pos)
|
node = minetest.get_node(pos_copy)
|
||||||
if node.name ~= "ignore" or not force then
|
if node.name ~= "ignore" or not force then
|
||||||
return node
|
return node
|
||||||
end
|
end
|
||||||
|
|
||||||
-- all ways failed - need to emerge (or forceload if generated)
|
-- all ways failed - need to emerge (or forceload if generated)
|
||||||
local us_timeout = us_timeout or 244
|
if mcl_vars.is_generated(pos_copy) then
|
||||||
if mcl_vars.is_generated(pos) then
|
|
||||||
minetest.chat_send_all("IMPOSSIBLE! Please report this to MCL2 issue tracker!")
|
minetest.chat_send_all("IMPOSSIBLE! Please report this to MCL2 issue tracker!")
|
||||||
minetest.forceload_block(pos)
|
minetest.forceload_block(pos_copy)
|
||||||
else
|
else
|
||||||
minetest.emerge_area(pos, pos)
|
minetest.emerge_area(pos_copy, pos_copy)
|
||||||
end
|
end
|
||||||
|
|
||||||
local t = minetest.get_us_time()
|
local t = minetest.get_us_time()
|
||||||
|
|
||||||
node = minetest.get_node(pos)
|
node = minetest.get_node(pos_copy)
|
||||||
|
|
||||||
while (not node or node.name == "ignore") and (minetest.get_us_time() - t < us_timeout) do
|
while (not node or node.name == "ignore") and (minetest.get_us_time() - t < (us_timeout or 244)) do
|
||||||
node = minetest.get_node(pos)
|
node = minetest.get_node(pos_copy)
|
||||||
end
|
end
|
||||||
|
|
||||||
return node
|
return node
|
||||||
|
Loading…
Reference in New Issue
Block a user