forked from VoxeLibre/VoxeLibre
Merge branch 'master' of https://git.minetest.land/Wuzzy/MineClone2
This commit is contained in:
commit
6ebafe7735
|
@ -5,7 +5,7 @@ Wow, thank you! :-)
|
||||||
But first, some things to note:
|
But first, some things to note:
|
||||||
|
|
||||||
MineClone 2's development target is to make a free software clone of Minecraft,
|
MineClone 2's development target is to make a free software clone of Minecraft,
|
||||||
***version 1.11***, ***PC edition***.
|
***version 1.12***, ***PC edition***, *** + Optifine features supported by the Minetest Engine ***.
|
||||||
|
|
||||||
MineClone 2 is maintained by two persons. Namely, kay27 and EliasFleckenstein. You can find us
|
MineClone 2 is maintained by two persons. Namely, kay27 and EliasFleckenstein. You can find us
|
||||||
in the Minetest forums (forums.minetest.net), in IRC in the #minetest
|
in the Minetest forums (forums.minetest.net), in IRC in the #minetest
|
||||||
|
|
|
@ -86,7 +86,8 @@ Minetest to learn more.
|
||||||
## Project description
|
## Project description
|
||||||
The main goal of **MineClone 2** is to be a clone of Minecraft and to be released as free software.
|
The main goal of **MineClone 2** is to be a clone of Minecraft and to be released as free software.
|
||||||
|
|
||||||
* **Target of development: Minecraft, PC Edition, version 1.11** (later known as “Java Edition”)
|
* **Target of development: Minecraft, PC Edition, version 1.12** (later known as “Java Edition”)
|
||||||
|
* MineClone2 also includes Optifine features supported by the Minetest
|
||||||
* Features of later Minecraft versions might sneak in, but they have a low priority
|
* Features of later Minecraft versions might sneak in, but they have a low priority
|
||||||
* In general, Minecraft is aimed to be cloned as good as Minetest currently permits (no hacks)
|
* In general, Minecraft is aimed to be cloned as good as Minetest currently permits (no hacks)
|
||||||
* Cloning the gameplay has highest priority
|
* Cloning the gameplay has highest priority
|
||||||
|
|
|
@ -405,3 +405,53 @@ function mcl_util.get_object_center(obj)
|
||||||
pos.y = pos.y + (ymax - ymin) / 2.0
|
pos.y = pos.y + (ymax - ymin) / 2.0
|
||||||
return pos
|
return pos
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local get_node_emerge_queue = {}
|
||||||
|
local function ecb_get_far_node(blockpos, action, calls_remaining, param)
|
||||||
|
if calls_remaining <= 0 and param then
|
||||||
|
minetest.log("verbose","[mcl_util] ecb done for param = "..param.." node.name="..minetest.get_node(minetest.string_to_pos(param)).name)
|
||||||
|
get_node_emerge_queue[param] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function mcl_util.get_far_node(pos, force)
|
||||||
|
local node = minetest.get_node(pos)
|
||||||
|
if node.name ~= "ignore" then
|
||||||
|
return node
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.get_voxel_manip():read_from_map(pos, pos)
|
||||||
|
node = minetest.get_node(pos)
|
||||||
|
if node.name ~= "ignore" or not force then
|
||||||
|
return node
|
||||||
|
end
|
||||||
|
|
||||||
|
local blockpos = vector.multiply(vector.floor(vector.divide(pos, mcl_vars.MAP_BLOCKSIZE)), mcl_vars.MAP_BLOCKSIZE)
|
||||||
|
local key = minetest.pos_to_string(blockpos)
|
||||||
|
|
||||||
|
for i=1,2 do -- give engine 2 chances to emerge the data
|
||||||
|
if not get_node_emerge_queue[key] then
|
||||||
|
get_node_emerge_queue[key] = 1
|
||||||
|
minetest.log("verbose","[mcl_util] emerge during get_far_node("..minetest.pos_to_string(pos).."), key="..key..", blockpos="..minetest.pos_to_string(blockpos))
|
||||||
|
minetest.emerge_area(blockpos, vector.add(blockpos, mcl_vars.MAP_BLOCKSIZE-1), ecb_get_far_node, key)
|
||||||
|
end
|
||||||
|
|
||||||
|
while not get_node_emerge_queue[key] do end
|
||||||
|
minetest.log("verbose","[mcl_util] emerge finished for node "..minetest.pos_to_string(pos)..", key="..key..", blockpos="..minetest.pos_to_string(blockpos)..", node.name="..mcl_util.get_far_node(pos).name)
|
||||||
|
|
||||||
|
node = minetest.get_node(pos)
|
||||||
|
if node.name ~= "ignore" then
|
||||||
|
return node
|
||||||
|
end
|
||||||
|
|
||||||
|
minetest.get_voxel_manip():read_from_map(pos, pos)
|
||||||
|
node = minetest.get_node(pos)
|
||||||
|
if node.name ~= "ignore" or not force then
|
||||||
|
return node
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
node.name = "air" -- engine continuously returns "ignore" - probably it is a bug
|
||||||
|
minetest.swap_node(pos, node) -- engine continuously returns "ignore" - probably it is a bug
|
||||||
|
return node -- engine continuously returns "ignore" - probably it is a bug
|
||||||
|
end
|
||||||
|
|
|
@ -331,7 +331,7 @@ mcl_inventory.set_creative_formspec = function(player, start_i, pagenum, inv_siz
|
||||||
|
|
||||||
-- Show armor and player image
|
-- Show armor and player image
|
||||||
local player_preview
|
local player_preview
|
||||||
if minetest.settings:get_bool("3d_player_preview", true) then
|
if minetest.settings:get_bool("3d_player_preview") then
|
||||||
player_preview = mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "")
|
player_preview = mcl_player.get_player_formspec_model(player, 3.9, 1.4, 1.2333, 2.4666, "")
|
||||||
else
|
else
|
||||||
local img, img_player
|
local img, img_player
|
||||||
|
|
|
@ -65,7 +65,7 @@ local function set_inventory(player, armor_change_only)
|
||||||
|
|
||||||
-- Show armor and player image
|
-- Show armor and player image
|
||||||
local player_preview
|
local player_preview
|
||||||
if minetest.settings:get_bool("3d_player_preview", true) then
|
if minetest.settings:get_bool("3d_player_preview") then
|
||||||
player_preview = mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "")
|
player_preview = mcl_player.get_player_formspec_model(player, 1.0, 0.0, 2.25, 4.5, "")
|
||||||
else
|
else
|
||||||
local img, img_player
|
local img, img_player
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
function settlements.build_schematic(vm, data, va, pos, building, replace_wall, name)
|
function settlements.build_schematic(vm, data, va, pos, building, replace_wall, name)
|
||||||
-- get building node material for better integration to surrounding
|
-- get building node material for better integration to surrounding
|
||||||
local platform_material = minetest.get_node_or_nil(pos)
|
local platform_material = mcl_util.get_far_node(pos, true)
|
||||||
if not platform_material then
|
if not platform_material then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
mcl_util
|
||||||
mcl_core
|
mcl_core
|
||||||
mcl_loot
|
mcl_loot
|
||||||
mcl_farming?
|
mcl_farming?
|
||||||
|
|
|
@ -52,8 +52,7 @@ function settlements.terraform(settlement_info, pr)
|
||||||
else
|
else
|
||||||
-- write ground
|
-- write ground
|
||||||
local p = {x=pos.x+xi, y=pos.y+yi, z=pos.z+zi}
|
local p = {x=pos.x+xi, y=pos.y+yi, z=pos.z+zi}
|
||||||
minetest.forceload_block(p)
|
local node = mcl_util.get_far_node(p, true)
|
||||||
local node = minetest.get_node_or_nil(p)
|
|
||||||
if node and node.name ~= "air" then
|
if node and node.name ~= "air" then
|
||||||
minetest.swap_node(p,{name="air"})
|
minetest.swap_node(p,{name="air"})
|
||||||
end
|
end
|
||||||
|
|
|
@ -94,11 +94,8 @@ if mg_name ~= "singlenode" then
|
||||||
-- don't build settlements on (too) uneven terrain
|
-- don't build settlements on (too) uneven terrain
|
||||||
local height_difference = settlements.evaluate_heightmap(minp, maxp)
|
local height_difference = settlements.evaluate_heightmap(minp, maxp)
|
||||||
if height_difference > max_height_difference then return end
|
if height_difference > max_height_difference then return end
|
||||||
|
-- we need 'minetest.after' here to exit from emerging thread we probably currently in:
|
||||||
-- new way - slow :(((((
|
minetest.after(0.1, build_a_settlement_no_delay, vector.new(minp), vector.new(maxp), blockseed)
|
||||||
minetest.emerge_area(vector.subtract(minp,24), vector.add(maxp,24), ecb_build_a_settlement, {minp = vector.new(minp), maxp=vector.new(maxp), blockseed=blockseed})
|
|
||||||
-- old way - wait 3 seconds:
|
|
||||||
-- minetest.after(3, ecb_build_a_settlement, nil, 1, 0, {minp = vector.new(minp), maxp=vector.new(maxp), blockseed=blockseed})
|
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
-- manually place villages
|
-- manually place villages
|
||||||
|
|
|
@ -51,7 +51,7 @@ function settlements.find_surface(pos)
|
||||||
local itter -- count up or down
|
local itter -- count up or down
|
||||||
local cnt_max = 200
|
local cnt_max = 200
|
||||||
-- check, in which direction to look for surface
|
-- check, in which direction to look for surface
|
||||||
local surface_node = minetest.get_node_or_nil(p6)
|
local surface_node = mcl_util.get_far_node(p6, true)
|
||||||
if surface_node and string.find(surface_node.name,"air") then
|
if surface_node and string.find(surface_node.name,"air") then
|
||||||
itter = -1
|
itter = -1
|
||||||
else
|
else
|
||||||
|
@ -60,32 +60,16 @@ function settlements.find_surface(pos)
|
||||||
-- go through nodes an find surface
|
-- go through nodes an find surface
|
||||||
while cnt < cnt_max do
|
while cnt < cnt_max do
|
||||||
cnt = cnt+1
|
cnt = cnt+1
|
||||||
minetest.forceload_block(p6)
|
surface_node = mcl_util.get_far_node(p6, true)
|
||||||
surface_node = minetest.get_node_or_nil(p6)
|
|
||||||
|
|
||||||
if not surface_node then
|
|
||||||
-- Load the map at pos and try again
|
|
||||||
minetest.get_voxel_manip():read_from_map(p6, p6)
|
|
||||||
surface_node = minetest.get_node(p6)
|
|
||||||
if surface_node.name == "ignore" then
|
if surface_node.name == "ignore" then
|
||||||
settlements.debug("find_surface1: nil or ignore")
|
settlements.debug("find_surface1: nil or ignore")
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
-- if surface_node == nil or surface_node.name == "ignore" then
|
|
||||||
-- --return nil
|
|
||||||
-- local fl = minetest.forceload_block(p6)
|
|
||||||
-- if not fl then
|
|
||||||
--
|
|
||||||
-- return nil
|
|
||||||
-- end
|
|
||||||
-- end
|
|
||||||
--
|
|
||||||
-- Check Surface_node and Node above
|
-- Check Surface_node and Node above
|
||||||
--
|
--
|
||||||
if settlements.surface_mat[surface_node.name] then
|
if settlements.surface_mat[surface_node.name] then
|
||||||
local surface_node_plus_1 = minetest.get_node_or_nil({ x=p6.x, y=p6.y+1, z=p6.z})
|
local surface_node_plus_1 = mcl_util.get_far_node({ x=p6.x, y=p6.y+1, z=p6.z}, true)
|
||||||
if surface_node_plus_1 and surface_node and
|
if surface_node_plus_1 and surface_node and
|
||||||
(string.find(surface_node_plus_1.name,"air") or
|
(string.find(surface_node_plus_1.name,"air") or
|
||||||
string.find(surface_node_plus_1.name,"snow") or
|
string.find(surface_node_plus_1.name,"snow") or
|
||||||
|
@ -257,7 +241,7 @@ function settlements.initialize_nodes(settlement_info, pr)
|
||||||
for xi = 0,width do
|
for xi = 0,width do
|
||||||
for zi = 0,depth do
|
for zi = 0,depth do
|
||||||
local ptemp = {x=p.x+xi, y=p.y+yi, z=p.z+zi}
|
local ptemp = {x=p.x+xi, y=p.y+yi, z=p.z+zi}
|
||||||
local node = minetest.get_node(ptemp)
|
local node = mcl_util.get_far_node(ptemp, true)
|
||||||
if node.name == "mcl_furnaces:furnace" or
|
if node.name == "mcl_furnaces:furnace" or
|
||||||
node.name == "mcl_chests:chest" or
|
node.name == "mcl_chests:chest" or
|
||||||
node.name == "mcl_anvils:anvil" then
|
node.name == "mcl_anvils:anvil" then
|
||||||
|
|
Loading…
Reference in New Issue