forked from VoxeLibre/VoxeLibre
master #5
|
@ -3,12 +3,19 @@ local mod_doc = minetest.get_modpath("doc")
|
||||||
|
|
||||||
-- Chest Entity
|
-- Chest Entity
|
||||||
local animate_chests = (minetest.settings:get_bool("animated_chests") ~= false)
|
local animate_chests = (minetest.settings:get_bool("animated_chests") ~= false)
|
||||||
local entity_animation_speed = 25
|
|
||||||
local entity_animations = {
|
local entity_animations = {
|
||||||
["open"] = {x = 0, y = 10},
|
shulker = {
|
||||||
["open_partly"] = {x = 0, y = 7},
|
speed = 50,
|
||||||
["close"] = {x = 10, y = 20},
|
open = {x = 45, y = 95},
|
||||||
["close_partly"] = {x = 13, y = 20},
|
close = {x = 95, y = 145},
|
||||||
|
},
|
||||||
|
chest = {
|
||||||
|
speed = 25,
|
||||||
|
open = {x = 0, y = 10},
|
||||||
|
open_partly = {x = 0, y = 7},
|
||||||
|
close = {x = 10, y = 20},
|
||||||
|
close_partly = {x = 13, y = 20},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
minetest.register_entity("mcl_chests:chest", {
|
minetest.register_entity("mcl_chests:chest", {
|
||||||
|
@ -21,9 +28,10 @@ minetest.register_entity("mcl_chests:chest", {
|
||||||
},
|
},
|
||||||
|
|
||||||
set_animation = function(self, animname)
|
set_animation = function(self, animname)
|
||||||
local anim = entity_animations[animname]
|
local anim_table = entity_animations[self.animation_type]
|
||||||
|
local anim = anim_table[animname]
|
||||||
if not anim then return end
|
if not anim then return end
|
||||||
self.object:set_animation(anim, entity_animation_speed, 0, false)
|
self.object:set_animation(anim, anim_table.speed, 0, false)
|
||||||
end,
|
end,
|
||||||
|
|
||||||
open = function(self, playername, partly)
|
open = function(self, playername, partly)
|
||||||
|
@ -54,10 +62,11 @@ minetest.register_entity("mcl_chests:chest", {
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
|
||||||
initialize = function(self, node_pos, node_name, textures, dir, double, sound_prefix, mesh_prefix)
|
initialize = function(self, node_pos, node_name, textures, dir, double, sound_prefix, mesh_prefix, animation_type)
|
||||||
self.node_pos = node_pos
|
self.node_pos = node_pos
|
||||||
self.node_name = node_name
|
self.node_name = node_name
|
||||||
self.sound_prefix = sound_prefix
|
self.sound_prefix = sound_prefix
|
||||||
|
self.animation_type = animation_type
|
||||||
local obj = self.object
|
local obj = self.object
|
||||||
obj:set_properties({
|
obj:set_properties({
|
||||||
textures = textures,
|
textures = textures,
|
||||||
|
@ -117,19 +126,22 @@ local function find_entity(pos)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local function create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, dir, entity_pos)
|
local function get_entity_info(pos, param2, double, dir, entity_pos)
|
||||||
dir = dir or minetest.facedir_to_dir(param2)
|
dir = dir or minetest.facedir_to_dir(param2)
|
||||||
entity_pos = entity_pos or get_entity_pos(pos, dir, double)
|
return dir, get_entity_pos(pos, dir, double)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, animation_type, dir, entity_pos)
|
||||||
|
dir, entity_pos = get_entity_info(pos, param2, double, dir, entity_pos)
|
||||||
local obj = minetest.add_entity(entity_pos, "mcl_chests:chest")
|
local obj = minetest.add_entity(entity_pos, "mcl_chests:chest")
|
||||||
local luaentity = obj:get_luaentity()
|
local luaentity = obj:get_luaentity()
|
||||||
luaentity:initialize(pos, node_name, textures, dir, double, sound_prefix, mesh_prefix)
|
luaentity:initialize(pos, node_name, textures, dir, double, sound_prefix, mesh_prefix, animation_type)
|
||||||
return luaentity
|
return luaentity
|
||||||
end
|
end
|
||||||
|
|
||||||
local function find_or_create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, dir)
|
local function find_or_create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, animation_type, dir, entity_pos)
|
||||||
local dir = dir or minetest.facedir_to_dir(param2)
|
dir, entity_pos = get_entity_info(pos, param2, double, dir, entity_pos)
|
||||||
local entity_pos = get_entity_pos(pos, dir, double)
|
return find_entity(entity_pos) or create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, animation_type, dir, entity_pos)
|
||||||
return find_entity(entity_pos) or create_entity(pos, node_name, textures, param2, double, sound_prefix, mesh_prefix, dir, entity_pos)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local no_rotate, simple_rotate
|
local no_rotate, simple_rotate
|
||||||
|
@ -139,7 +151,8 @@ if minetest.get_modpath("screwdriver") then
|
||||||
if screwdriver.rotate_simple(pos, node, user, mode, new_param2) ~= false then
|
if screwdriver.rotate_simple(pos, node, user, mode, new_param2) ~= false then
|
||||||
local nodename = node.name
|
local nodename = node.name
|
||||||
local nodedef = minetest.registered_nodes[nodename]
|
local nodedef = minetest.registered_nodes[nodename]
|
||||||
find_or_create_entity(pos, nodename, nodedef._chest_entity_textures, new_param2, false, nodedef._chest_entity_sound, nodedef._chest_entity_mesh):set_yaw(minetest.facedir_to_dir(new_param2))
|
local dir = minetest.facedir_to_dir(new_param2)
|
||||||
|
find_or_create_entity(pos, nodename, nodedef._chest_entity_textures, new_param2, false, nodedef._chest_entity_sound, nodedef._chest_entity_mesh, nodedef._chest_entity_animation_type, dir):set_yaw(dir)
|
||||||
else
|
else
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
@ -161,12 +174,13 @@ local function back_is_blocked(pos, dir)
|
||||||
return not def or def.groups.opaque == 1 or not def2 or def2.groups.opaque == 1
|
return not def or def.groups.opaque == 1 or not def2 or def2.groups.opaque == 1
|
||||||
end
|
end
|
||||||
-- To be called if a player opened a chest
|
-- To be called if a player opened a chest
|
||||||
local player_chest_open = function(player, pos, node_name, textures, param2, double, sound, mesh)
|
local player_chest_open = function(player, pos, node_name, textures, param2, double, sound, mesh, shulker)
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
open_chests[name] = {pos = pos, node_name = node_name, textures = textures, param2 = param2, double = double, sound = sound, mesh = mesh}
|
open_chests[name] = {pos = pos, node_name = node_name, textures = textures, param2 = param2, double = double, sound = sound, mesh = mesh, shulker = shulker}
|
||||||
if animate_chests then
|
if animate_chests then
|
||||||
local dir = minetest.facedir_to_dir(param2)
|
local dir = minetest.facedir_to_dir(param2)
|
||||||
find_or_create_entity(pos, node_name, textures, param2, double, sound, mesh, dir):open(name, back_is_blocked(pos, dir) or double and back_is_blocked(mcl_util.get_double_container_neighbor_pos(pos, param2, node_name:sub(-4)), dir))
|
local blocked = not shulker and (back_is_blocked(pos, dir) or double and back_is_blocked(mcl_util.get_double_container_neighbor_pos(pos, param2, node_name:sub(-4)), dir))
|
||||||
|
find_or_create_entity(pos, node_name, textures, param2, double, sound, mesh, shulker and "shulker" or "chest", dir):open(name, blocked)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -198,11 +212,11 @@ local chest_update_after_close = function(pos)
|
||||||
|
|
||||||
if node.name == "mcl_chests:trapped_chest_on_small" then
|
if node.name == "mcl_chests:trapped_chest_on_small" then
|
||||||
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_small", param2 = node.param2})
|
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_small", param2 = node.param2})
|
||||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_small")
|
find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small")
|
||||||
mesecon.receptor_off(pos, trapped_chest_mesecons_rules)
|
mesecon.receptor_off(pos, trapped_chest_mesecons_rules)
|
||||||
elseif node.name == "mcl_chests:trapped_chest_on_left" then
|
elseif node.name == "mcl_chests:trapped_chest_on_left" then
|
||||||
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2})
|
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2})
|
||||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_left")
|
find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left")
|
||||||
mesecon.receptor_off(pos, trapped_chest_mesecons_rules)
|
mesecon.receptor_off(pos, trapped_chest_mesecons_rules)
|
||||||
|
|
||||||
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left")
|
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left")
|
||||||
|
@ -214,7 +228,7 @@ local chest_update_after_close = function(pos)
|
||||||
|
|
||||||
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right")
|
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right")
|
||||||
minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2})
|
minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2})
|
||||||
find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_left")
|
find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left")
|
||||||
mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules)
|
mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -227,7 +241,7 @@ local player_chest_close = function(player)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
if animate_chests then
|
if animate_chests then
|
||||||
find_or_create_entity(open_chest.pos, open_chest.node_name, open_chest.textures, open_chest.param2, open_chest.double, open_chest.sound, open_chest.mesh):close(name)
|
find_or_create_entity(open_chest.pos, open_chest.node_name, open_chest.textures, open_chest.param2, open_chest.double, open_chest.sound, open_chest.mesh, open_chest.shulker and "shulker" or "chest"):close(name)
|
||||||
end
|
end
|
||||||
chest_update_after_close(open_chest.pos)
|
chest_update_after_close(open_chest.pos)
|
||||||
|
|
||||||
|
@ -374,6 +388,7 @@ minetest.register_node(small_name, {
|
||||||
_chest_entity_textures = small_textures,
|
_chest_entity_textures = small_textures,
|
||||||
_chest_entity_sound = "default_chest",
|
_chest_entity_sound = "default_chest",
|
||||||
_chest_entity_mesh = "mcl_chests_chest",
|
_chest_entity_mesh = "mcl_chests_chest",
|
||||||
|
_chest_entity_animation_type = "chest",
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
stack_max = 64,
|
stack_max = 64,
|
||||||
|
@ -410,15 +425,15 @@ minetest.register_node(small_name, {
|
||||||
minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_right",param2=param2})
|
minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_right",param2=param2})
|
||||||
local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right")
|
local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "right")
|
||||||
minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_left", param2 = param2 })
|
minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_left", param2 = param2 })
|
||||||
create_entity(p, "mcl_chests:"..canonical_basename.."_left", left_textures, param2, true, "default_chest", "mcl_chests_chest")
|
create_entity(p, "mcl_chests:"..canonical_basename.."_left", left_textures, param2, true, "default_chest", "mcl_chests_chest", "chest")
|
||||||
elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == "mcl_chests:"..canonical_basename.."_small" then
|
elseif minetest.get_node(mcl_util.get_double_container_neighbor_pos(pos, param2, "left")).name == "mcl_chests:"..canonical_basename.."_small" then
|
||||||
minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_left",param2=param2})
|
minetest.swap_node(pos, {name="mcl_chests:"..canonical_basename.."_left",param2=param2})
|
||||||
create_entity(pos, "mcl_chests:"..canonical_basename.."_left", left_textures, param2, true, "default_chest", "mcl_chests_chest")
|
create_entity(pos, "mcl_chests:"..canonical_basename.."_left", left_textures, param2, true, "default_chest", "mcl_chests_chest", "chest")
|
||||||
local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left")
|
local p = mcl_util.get_double_container_neighbor_pos(pos, param2, "left")
|
||||||
minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_right", param2 = param2 })
|
minetest.swap_node(p, { name = "mcl_chests:"..canonical_basename.."_right", param2 = param2 })
|
||||||
else
|
else
|
||||||
minetest.swap_node(pos, { name = "mcl_chests:"..canonical_basename.."_small", param2 = param2 })
|
minetest.swap_node(pos, { name = "mcl_chests:"..canonical_basename.."_small", param2 = param2 })
|
||||||
create_entity(pos, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest")
|
create_entity(pos, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest", "chest")
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||||
|
@ -498,6 +513,7 @@ minetest.register_node(left_name, {
|
||||||
_chest_entity_textures = left_textures,
|
_chest_entity_textures = left_textures,
|
||||||
_chest_entity_sound = "default_chest",
|
_chest_entity_sound = "default_chest",
|
||||||
_chest_entity_mesh = "mcl_chests_chest",
|
_chest_entity_mesh = "mcl_chests_chest",
|
||||||
|
_chest_entity_animation_type = "chest",
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
groups = {handy=1,axey=1, container=5,not_in_creative_inventory=1, material_wood=1,flammable=-1,chest_entity=1,double_chest=1},
|
groups = {handy=1,axey=1, container=5,not_in_creative_inventory=1, material_wood=1,flammable=-1,chest_entity=1,double_chest=1},
|
||||||
|
@ -512,7 +528,7 @@ minetest.register_node(left_name, {
|
||||||
n.name = "mcl_chests:"..canonical_basename.."_small"
|
n.name = "mcl_chests:"..canonical_basename.."_small"
|
||||||
minetest.swap_node(pos, n)
|
minetest.swap_node(pos, n)
|
||||||
end
|
end
|
||||||
create_entity(pos, left_name, left_textures, param2, true, "default_chest", "mcl_chests_chest")
|
create_entity(pos, left_name, left_textures, param2, true, "default_chest", "mcl_chests_chest", "chest")
|
||||||
end,
|
end,
|
||||||
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||||
minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name"))
|
minetest.get_meta(pos):set_string("name", itemstack:get_meta():get_string("name"))
|
||||||
|
@ -533,7 +549,7 @@ minetest.register_node(left_name, {
|
||||||
close_forms(canonical_basename, p)
|
close_forms(canonical_basename, p)
|
||||||
|
|
||||||
minetest.swap_node(p, { name = small_name, param2 = param2 })
|
minetest.swap_node(p, { name = small_name, param2 = param2 })
|
||||||
create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest")
|
create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest", "chest")
|
||||||
end,
|
end,
|
||||||
after_dig_node = drop_items_chest,
|
after_dig_node = drop_items_chest,
|
||||||
on_blast = on_chest_blast,
|
on_blast = on_chest_blast,
|
||||||
|
@ -680,7 +696,7 @@ minetest.register_node("mcl_chests:"..basename.."_right", {
|
||||||
close_forms(canonical_basename, p)
|
close_forms(canonical_basename, p)
|
||||||
|
|
||||||
minetest.swap_node(p, { name = small_name, param2 = param2 })
|
minetest.swap_node(p, { name = small_name, param2 = param2 })
|
||||||
create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest")
|
create_entity(p, small_name, small_textures, param2, false, "default_chest", "mcl_chests_chest", "chest")
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
end,
|
end,
|
||||||
after_dig_node = drop_items_chest,
|
after_dig_node = drop_items_chest,
|
||||||
|
@ -845,7 +861,7 @@ register_chest("trapped_chest",
|
||||||
}},
|
}},
|
||||||
function(pos, node, clicker)
|
function(pos, node, clicker)
|
||||||
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_small", param2 = node.param2})
|
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_small", param2 = node.param2})
|
||||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_on_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_on_small")
|
find_or_create_entity(pos, "mcl_chests:trapped_chest_on_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_small")
|
||||||
mesecon.receptor_on(pos, trapped_chest_mesecons_rules)
|
mesecon.receptor_on(pos, trapped_chest_mesecons_rules)
|
||||||
end,
|
end,
|
||||||
function(pos, node, clicker)
|
function(pos, node, clicker)
|
||||||
|
@ -853,7 +869,7 @@ register_chest("trapped_chest",
|
||||||
meta:set_int("players", 1)
|
meta:set_int("players", 1)
|
||||||
|
|
||||||
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2})
|
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2})
|
||||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_on_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_on_left")
|
find_or_create_entity(pos, "mcl_chests:trapped_chest_on_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left")
|
||||||
mesecon.receptor_on(pos, trapped_chest_mesecons_rules)
|
mesecon.receptor_on(pos, trapped_chest_mesecons_rules)
|
||||||
|
|
||||||
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left")
|
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left")
|
||||||
|
@ -867,7 +883,7 @@ register_chest("trapped_chest",
|
||||||
mesecon.receptor_on(pos, trapped_chest_mesecons_rules)
|
mesecon.receptor_on(pos, trapped_chest_mesecons_rules)
|
||||||
|
|
||||||
minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2})
|
minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_on_left", param2 = node.param2})
|
||||||
find_or_create_entity(pos_other, "mcl_chests:trapped_chest_on_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_on_left")
|
find_or_create_entity(pos_other, "mcl_chests:trapped_chest_on_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_on_left")
|
||||||
mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules)
|
mesecon.receptor_on(pos_other, trapped_chest_mesecons_rules)
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
|
@ -888,13 +904,13 @@ local function close_if_trapped_chest(pos, player)
|
||||||
|
|
||||||
if node.name == "mcl_chests:trapped_chest_on_small" then
|
if node.name == "mcl_chests:trapped_chest_on_small" then
|
||||||
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_small", param2 = node.param2})
|
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_small", param2 = node.param2})
|
||||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_small")
|
find_or_create_entity(pos, "mcl_chests:trapped_chest_small", {"mcl_chests_trapped.png"}, node.param2, false, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_small")
|
||||||
mesecon.receptor_off(pos, trapped_chest_mesecons_rules)
|
mesecon.receptor_off(pos, trapped_chest_mesecons_rules)
|
||||||
|
|
||||||
player_chest_close(player)
|
player_chest_close(player)
|
||||||
elseif node.name == "mcl_chests:trapped_chest_on_left" then
|
elseif node.name == "mcl_chests:trapped_chest_on_left" then
|
||||||
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2})
|
minetest.swap_node(pos, {name="mcl_chests:trapped_chest_left", param2 = node.param2})
|
||||||
find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_left")
|
find_or_create_entity(pos, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left")
|
||||||
mesecon.receptor_off(pos, trapped_chest_mesecons_rules)
|
mesecon.receptor_off(pos, trapped_chest_mesecons_rules)
|
||||||
|
|
||||||
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left")
|
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "left")
|
||||||
|
@ -908,7 +924,7 @@ local function close_if_trapped_chest(pos, player)
|
||||||
|
|
||||||
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right")
|
local pos_other = mcl_util.get_double_container_neighbor_pos(pos, node.param2, "right")
|
||||||
minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2})
|
minetest.swap_node(pos_other, {name="mcl_chests:trapped_chest_left", param2 = node.param2})
|
||||||
find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest"):reinitialize("mcl_chests:trapped_chest_left")
|
find_or_create_entity(pos_other, "mcl_chests:trapped_chest_left", {"mcl_chests_trapped_double.png"}, node.param2, true, "default_chest", "mcl_chests_chest", "chest"):reinitialize("mcl_chests:trapped_chest_left")
|
||||||
mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules)
|
mesecon.receptor_off(pos_other, trapped_chest_mesecons_rules)
|
||||||
|
|
||||||
player_chest_close(player)
|
player_chest_close(player)
|
||||||
|
@ -995,6 +1011,7 @@ minetest.register_node("mcl_chests:ender_chest_small", {
|
||||||
_chest_entity_textures = {"mcl_chests_ender.png"},
|
_chest_entity_textures = {"mcl_chests_ender.png"},
|
||||||
_chest_entity_sound = "mcl_chests_enderchest",
|
_chest_entity_sound = "mcl_chests_enderchest",
|
||||||
_chest_entity_mesh = "mcl_chests_chest",
|
_chest_entity_mesh = "mcl_chests_chest",
|
||||||
|
_chest_entity_animation_type = "chest",
|
||||||
tiles = {"mcl_chests_blank.png"},
|
tiles = {"mcl_chests_blank.png"},
|
||||||
--[[{"mcl_chests_ender_chest_top.png", "mcl_chests_ender_chest_bottom.png",
|
--[[{"mcl_chests_ender_chest_top.png", "mcl_chests_ender_chest_bottom.png",
|
||||||
"mcl_chests_ender_chest_right.png", "mcl_chests_ender_chest_left.png",
|
"mcl_chests_ender_chest_right.png", "mcl_chests_ender_chest_left.png",
|
||||||
|
@ -1011,10 +1028,10 @@ minetest.register_node("mcl_chests:ender_chest_small", {
|
||||||
on_construct = function(pos)
|
on_construct = function(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
meta:set_string("formspec", formspec_ender_chest)
|
meta:set_string("formspec", formspec_ender_chest)
|
||||||
create_entity(pos, "mcl_chests:ender_chest_small", {"mcl_chests_ender.png"}, minetest.get_node(pos).param2, false, "mcl_chests_enderchest", "mcl_chests_chest")
|
create_entity(pos, "mcl_chests:ender_chest_small", {"mcl_chests_ender.png"}, minetest.get_node(pos).param2, false, "mcl_chests_enderchest", "mcl_chests_chest", "chest")
|
||||||
end,
|
end,
|
||||||
on_rightclick = function(pos, node, clicker)
|
on_rightclick = function(pos, node, clicker)
|
||||||
player_chest_open(clicker, pos, "mcl_chests:ender_chest_small", {"mcl_chests_ender.png"}, minetest.get_node(pos).param2, false, "mcl_chests_enderchest", "mcl_chests_chest")
|
player_chest_open(clicker, pos, "mcl_chests:ender_chest_small", {"mcl_chests_ender.png"}, node.param2, false, "mcl_chests_enderchest", "mcl_chests_chest")
|
||||||
end,
|
end,
|
||||||
on_receive_fields = function(pos, formname, fields, sender)
|
on_receive_fields = function(pos, formname, fields, sender)
|
||||||
if fields.quit then
|
if fields.quit then
|
||||||
|
@ -1027,16 +1044,6 @@ minetest.register_node("mcl_chests:ender_chest_small", {
|
||||||
on_rotate = simple_rotate,
|
on_rotate = simple_rotate,
|
||||||
})
|
})
|
||||||
|
|
||||||
minetest.register_lbm({
|
|
||||||
label = "Update shulker box formspecs (0.51.0)",
|
|
||||||
name = "mcl_chests:update_formspecs_0_51_0",
|
|
||||||
nodenames = { "group:shulker_box" },
|
|
||||||
action = function(pos, node)
|
|
||||||
minetest.registered_nodes[node.name].on_construct(pos)
|
|
||||||
minetest.log("action", "[mcl_chests] Node formspec updated at "..minetest.pos_to_string(pos))
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
minetest.register_on_joinplayer(function(player)
|
minetest.register_on_joinplayer(function(player)
|
||||||
local inv = player:get_inventory()
|
local inv = player:get_inventory()
|
||||||
inv:set_size("enderchest", 9*3)
|
inv:set_size("enderchest", 9*3)
|
||||||
|
@ -1129,6 +1136,8 @@ for color, desc in pairs(boxtypes) do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local small_name = "mcl_chests:"..color.."_shulker_box_small"
|
||||||
|
|
||||||
minetest.register_node("mcl_chests:"..color.."_shulker_box", {
|
minetest.register_node("mcl_chests:"..color.."_shulker_box", {
|
||||||
description = desc,
|
description = desc,
|
||||||
_tt_help = S("27 inventory slots") .. "\n" .. S("Can be carried around with its contents"),
|
_tt_help = S("27 inventory slots") .. "\n" .. S("Can be carried around with its contents"),
|
||||||
|
@ -1136,43 +1145,26 @@ for color, desc in pairs(boxtypes) do
|
||||||
_doc_items_entry_name = entry_name,
|
_doc_items_entry_name = entry_name,
|
||||||
_doc_items_longdesc = longdesc,
|
_doc_items_longdesc = longdesc,
|
||||||
_doc_items_usagehelp = usagehelp,
|
_doc_items_usagehelp = usagehelp,
|
||||||
tiles = {
|
tiles = {mob_texture},
|
||||||
"mcl_chests_"..color.."_shulker_box_top.png", -- top
|
drawtype = "mesh",
|
||||||
|
mesh = "mcl_chests_shulker.obj",
|
||||||
|
--[["mcl_chests_"..color.."_shulker_box_top.png", -- top
|
||||||
"[combine:16x16:-32,-28="..mob_texture, -- bottom
|
"[combine:16x16:-32,-28="..mob_texture, -- bottom
|
||||||
"[combine:16x16:0,-36="..mob_texture..":0,-16="..mob_texture, -- side
|
"[combine:16x16:0,-36="..mob_texture..":0,-16="..mob_texture, -- side
|
||||||
"[combine:16x16:-32,-36="..mob_texture..":-32,-16="..mob_texture, -- side
|
"[combine:16x16:-32,-36="..mob_texture..":-32,-16="..mob_texture, -- side
|
||||||
"[combine:16x16:-16,-36="..mob_texture..":-16,-16="..mob_texture, -- side
|
"[combine:16x16:-16,-36="..mob_texture..":-16,-16="..mob_texture, -- side
|
||||||
"[combine:16x16:-48,-36="..mob_texture..":-48,-16="..mob_texture, -- side
|
"[combine:16x16:-48,-36="..mob_texture..":-48,-16="..mob_texture, -- side]]--
|
||||||
},
|
groups = {handy=1,pickaxey=1, container=3, deco_block=1, dig_by_piston=1, shulker_box=1, old_shulker_box_node=1},
|
||||||
groups = {handy=1,pickaxey=1, container=3, deco_block=1, dig_by_piston=1, shulker_box=1},
|
|
||||||
is_ground_content = false,
|
is_ground_content = false,
|
||||||
sounds = mcl_sounds.node_sound_stone_defaults(),
|
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||||
stack_max = 1,
|
stack_max = 1,
|
||||||
drop = "",
|
drop = "",
|
||||||
paramtype = "light",
|
paramtype = "light",
|
||||||
paramtype2 = "facedir",
|
paramtype2 = "facedir",
|
||||||
-- TODO: Make shulker boxes rotatable
|
|
||||||
-- This doesn't work, it just destroys the inventory:
|
|
||||||
-- on_place = minetest.rotate_node,
|
|
||||||
on_construct = function(pos)
|
on_construct = function(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
local node = minetest.get_node(pos)
|
||||||
meta:set_string("formspec", formspec_shulker_box(nil))
|
node.name = small_name
|
||||||
local inv = meta:get_inventory()
|
minetest.set_node(pos, node)
|
||||||
inv:set_size("main", 9*3)
|
|
||||||
end,
|
|
||||||
_on_dispense = function(stack, pos, droppos, dropnode, dropdir)
|
|
||||||
-- Place shulker box as node
|
|
||||||
if minetest.registered_nodes[dropnode.name].buildable_to then
|
|
||||||
minetest.set_node(droppos, {name = stack:get_name(), param2 = minetest.dir_to_facedir(dropdir)})
|
|
||||||
local ninv = minetest.get_inventory({type="node", pos=droppos})
|
|
||||||
local imetadata = stack:get_metadata()
|
|
||||||
local iinv_main = minetest.deserialize(imetadata)
|
|
||||||
ninv:set_list("main", iinv_main)
|
|
||||||
ninv:set_size("main", 9*3)
|
|
||||||
set_shulkerbox_meta(minetest.get_meta(droppos), stack:get_meta())
|
|
||||||
stack:take_item()
|
|
||||||
end
|
|
||||||
return stack
|
|
||||||
end,
|
end,
|
||||||
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||||
local nmeta = minetest.get_meta(pos)
|
local nmeta = minetest.get_meta(pos)
|
||||||
|
@ -1193,6 +1185,79 @@ for color, desc in pairs(boxtypes) do
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
end,
|
end,
|
||||||
|
_on_dispense = function(stack, pos, droppos, dropnode, dropdir)
|
||||||
|
-- Place shulker box as node
|
||||||
|
if minetest.registered_nodes[dropnode.name].buildable_to then
|
||||||
|
minetest.set_node(droppos, {name = small_name, param2 = minetest.dir_to_facedir(dropdir)})
|
||||||
|
local ninv = minetest.get_inventory({type="node", pos=droppos})
|
||||||
|
local imetadata = stack:get_metadata()
|
||||||
|
local iinv_main = minetest.deserialize(imetadata)
|
||||||
|
ninv:set_list("main", iinv_main)
|
||||||
|
ninv:set_size("main", 9*3)
|
||||||
|
set_shulkerbox_meta(minetest.get_meta(droppos), stack:get_meta())
|
||||||
|
stack:take_item()
|
||||||
|
end
|
||||||
|
return stack
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
minetest.register_node(small_name, {
|
||||||
|
description = desc,
|
||||||
|
_tt_help = S("27 inventory slots") .. "\n" .. S("Can be carried around with its contents"),
|
||||||
|
_doc_items_create_entry = create_entry,
|
||||||
|
_doc_items_entry_name = entry_name,
|
||||||
|
_doc_items_longdesc = longdesc,
|
||||||
|
_doc_items_usagehelp = usagehelp,
|
||||||
|
drawtype = "nodebox",
|
||||||
|
tiles = {"mcl_chests_blank.png"},
|
||||||
|
_chest_entity_textures = {mob_texture},
|
||||||
|
_chest_entity_sound = "mcl_chests_shulker",
|
||||||
|
_chest_entity_mesh = "mcl_chests_shulker",
|
||||||
|
_chest_entity_animation_type = "shulker",
|
||||||
|
groups = {handy=1,pickaxey=1, container=3, deco_block=1, dig_by_piston=1, shulker_box=1, chest_entity=1, not_in_creative_inventory=1},
|
||||||
|
is_ground_content = false,
|
||||||
|
sounds = mcl_sounds.node_sound_stone_defaults(),
|
||||||
|
stack_max = 1,
|
||||||
|
drop = "",
|
||||||
|
paramtype = "light",
|
||||||
|
paramtype2 = "facedir",
|
||||||
|
-- TODO: Make shulker boxes rotatable
|
||||||
|
-- This doesn't work, it just destroys the inventory:
|
||||||
|
-- on_place = minetest.rotate_node,
|
||||||
|
on_construct = function(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
meta:set_string("formspec", formspec_shulker_box(nil))
|
||||||
|
local inv = meta:get_inventory()
|
||||||
|
inv:set_size("main", 9*3)
|
||||||
|
create_entity(pos, small_name, {mob_texture}, minetest.get_node(pos).param2, false, "mcl_chests_shulker", "mcl_chests_shulker", "shulker")
|
||||||
|
end,
|
||||||
|
after_place_node = function(pos, placer, itemstack, pointed_thing)
|
||||||
|
local nmeta = minetest.get_meta(pos)
|
||||||
|
local imetadata = itemstack:get_metadata()
|
||||||
|
local iinv_main = minetest.deserialize(imetadata)
|
||||||
|
local ninv = nmeta:get_inventory()
|
||||||
|
ninv:set_list("main", iinv_main)
|
||||||
|
ninv:set_size("main", 9*3)
|
||||||
|
set_shulkerbox_meta(nmeta, itemstack:get_meta())
|
||||||
|
|
||||||
|
if minetest.is_creative_enabled(placer:get_player_name()) then
|
||||||
|
if not ninv:is_empty("main") then
|
||||||
|
return nil
|
||||||
|
else
|
||||||
|
return itemstack
|
||||||
|
end
|
||||||
|
else
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
end,
|
||||||
|
on_rightclick = function(pos, node, clicker)
|
||||||
|
player_chest_open(clicker, pos, small_name, {mob_texture}, node.param2, false, "mcl_chests_shulker", "mcl_chests_shulker", true)
|
||||||
|
end,
|
||||||
|
on_receive_fields = function(pos, formname, fields, sender)
|
||||||
|
if fields.quit then
|
||||||
|
player_chest_close(sender)
|
||||||
|
end
|
||||||
|
end,
|
||||||
on_destruct = function(pos)
|
on_destruct = function(pos)
|
||||||
local meta = minetest.get_meta(pos)
|
local meta = minetest.get_meta(pos)
|
||||||
local inv = meta:get_inventory()
|
local inv = meta:get_inventory()
|
||||||
|
@ -1238,6 +1303,7 @@ for color, desc in pairs(boxtypes) do
|
||||||
|
|
||||||
if mod_doc and not is_canonical then
|
if mod_doc and not is_canonical then
|
||||||
doc.add_entry_alias("nodes", "mcl_chests:"..canonical_shulker_color.."_shulker_box", "nodes", "mcl_chests:"..color.."_shulker_box")
|
doc.add_entry_alias("nodes", "mcl_chests:"..canonical_shulker_color.."_shulker_box", "nodes", "mcl_chests:"..color.."_shulker_box")
|
||||||
|
doc.add_entry_alias("nodes", "mcl_chests:"..canonical_shulker_color.."_shulker_box_small", "nodes", "mcl_chests:"..color.."_shulker_box_small")
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_craft({
|
minetest.register_craft({
|
||||||
|
@ -1282,7 +1348,7 @@ local function select_and_spawn_entity(pos, node)
|
||||||
local node_name = node.name
|
local node_name = node.name
|
||||||
local node_def = minetest.registered_nodes[node_name]
|
local node_def = minetest.registered_nodes[node_name]
|
||||||
local double_chest = minetest.get_item_group(node_name, "double_chest") > 0
|
local double_chest = minetest.get_item_group(node_name, "double_chest") > 0
|
||||||
create_entity(pos, node_name, node_def._chest_entity_textures, node.param2, double_chest, node_def._chest_entity_sound, node_def._chest_entity_mesh)
|
create_entity(pos, node_name, node_def._chest_entity_textures, node.param2, double_chest, node_def._chest_entity_sound, node_def._chest_entity_mesh, node_def._chest_entity_animation_type)
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_lbm({
|
minetest.register_lbm({
|
||||||
|
@ -1296,7 +1362,7 @@ minetest.register_lbm({
|
||||||
minetest.register_lbm({
|
minetest.register_lbm({
|
||||||
label = "Replace old chest nodes",
|
label = "Replace old chest nodes",
|
||||||
name = "mcl_chests:replace_old",
|
name = "mcl_chests:replace_old",
|
||||||
nodenames = {"mcl_chests:chest", "mcl_chests:trapped_chest", "mcl_chests:trapped_chest_on", "mcl_chests:ender_chest"},
|
nodenames = {"mcl_chests:chest", "mcl_chests:trapped_chest", "mcl_chests:trapped_chest_on", "mcl_chests:ender_chest", "group:old_shulker_box_node"},
|
||||||
run_at_every_load = true,
|
run_at_every_load = true,
|
||||||
action = function(pos, node)
|
action = function(pos, node)
|
||||||
local node_name = node.name
|
local node_name = node.name
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1,159 @@
|
||||||
|
# Blender v2.79 (sub 0) OBJ File: 'shulkerbox2.blend'
|
||||||
|
# www.blender.org
|
||||||
|
mtllib shulkerbox2.mtl
|
||||||
|
o low1_Cube.006
|
||||||
|
v -0.500000 -0.500001 0.500000
|
||||||
|
v -0.500000 0.062499 0.500000
|
||||||
|
v -0.500000 -0.500001 -0.500000
|
||||||
|
v -0.500000 0.062499 -0.500000
|
||||||
|
v 0.500000 -0.500001 0.500000
|
||||||
|
v 0.500000 0.062499 0.500000
|
||||||
|
v 0.500000 -0.500001 -0.500000
|
||||||
|
v 0.500000 0.062499 -0.500000
|
||||||
|
vt 0.250000 0.187500
|
||||||
|
vt -0.000000 0.187500
|
||||||
|
vt -0.000000 0.312500
|
||||||
|
vt 0.250000 0.312500
|
||||||
|
vt 1.000000 0.187500
|
||||||
|
vt 0.750000 0.187500
|
||||||
|
vt 0.750000 0.312500
|
||||||
|
vt 1.000000 0.312500
|
||||||
|
vt 0.500000 0.187500
|
||||||
|
vt 0.500000 0.312500
|
||||||
|
vt 0.750000 0.562500
|
||||||
|
vt 0.750000 0.312500
|
||||||
|
vt 0.500000 0.312500
|
||||||
|
vt 0.500000 0.562500
|
||||||
|
vt 0.500000 0.562500
|
||||||
|
vt 0.250000 0.562500
|
||||||
|
vn 1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 1.0000
|
||||||
|
vn -1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 -1.0000
|
||||||
|
vn 0.0000 1.0000 0.0000
|
||||||
|
vn 0.0000 -1.0000 0.0000
|
||||||
|
usemtl None
|
||||||
|
s off
|
||||||
|
f 1/1/1 3/2/1 4/3/1 2/4/1
|
||||||
|
f 3/5/2 7/6/2 8/7/2 4/8/2
|
||||||
|
f 7/6/3 5/9/3 6/10/3 8/7/3
|
||||||
|
f 5/9/4 1/1/4 2/4/4 6/10/4
|
||||||
|
f 3/11/5 1/12/5 5/13/5 7/14/5
|
||||||
|
f 8/15/6 6/10/6 2/4/6 4/16/6
|
||||||
|
o top1_Cube.005
|
||||||
|
v -0.500313 -0.220552 0.500313
|
||||||
|
v -0.500313 0.530073 0.500313
|
||||||
|
v -0.500313 -0.220552 -0.500313
|
||||||
|
v -0.500313 0.530073 -0.500313
|
||||||
|
v 0.500313 -0.220552 0.500313
|
||||||
|
v 0.500313 0.530073 0.500313
|
||||||
|
v 0.500313 -0.220552 -0.500313
|
||||||
|
v 0.500313 0.530073 -0.500313
|
||||||
|
vt 0.250000 0.562500
|
||||||
|
vt -0.000000 0.562500
|
||||||
|
vt -0.000000 0.750000
|
||||||
|
vt 0.250000 0.750000
|
||||||
|
vt 1.000000 0.562500
|
||||||
|
vt 0.750000 0.562500
|
||||||
|
vt 0.750000 0.750000
|
||||||
|
vt 1.000000 0.750000
|
||||||
|
vt 0.500000 0.562500
|
||||||
|
vt 0.500000 0.750000
|
||||||
|
vt 0.750000 1.000000
|
||||||
|
vt 0.750000 0.750000
|
||||||
|
vt 0.500000 0.750000
|
||||||
|
vt 0.500000 1.000000
|
||||||
|
vt 0.500000 1.000000
|
||||||
|
vt 0.250000 1.000000
|
||||||
|
vn 1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 1.0000
|
||||||
|
vn -1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 -1.0000
|
||||||
|
vn 0.0000 1.0000 0.0000
|
||||||
|
vn 0.0000 -1.0000 0.0000
|
||||||
|
usemtl None
|
||||||
|
s off
|
||||||
|
f 9/17/7 11/18/7 12/19/7 10/20/7
|
||||||
|
f 11/21/8 15/22/8 16/23/8 12/24/8
|
||||||
|
f 15/22/9 13/25/9 14/26/9 16/23/9
|
||||||
|
f 13/25/10 9/17/10 10/20/10 14/26/10
|
||||||
|
f 11/27/11 9/28/11 13/29/11 15/30/11
|
||||||
|
f 16/31/12 14/26/12 10/20/12 12/32/12
|
||||||
|
o top2_Cube.002
|
||||||
|
v -0.500247 -0.220392 0.500247
|
||||||
|
v -0.500247 0.530234 0.500247
|
||||||
|
v -0.500247 -0.220392 -0.500378
|
||||||
|
v -0.500247 0.530234 -0.500378
|
||||||
|
v 0.500378 -0.220392 0.500247
|
||||||
|
v 0.500378 0.530234 0.500247
|
||||||
|
v 0.500378 -0.220392 -0.500378
|
||||||
|
v 0.500378 0.530234 -0.500378
|
||||||
|
vt 0.250000 0.562500
|
||||||
|
vt 0.250000 0.750000
|
||||||
|
vt -0.000000 0.750000
|
||||||
|
vt -0.000000 0.562500
|
||||||
|
vt 1.000000 0.562500
|
||||||
|
vt 1.000000 0.750000
|
||||||
|
vt 0.750000 0.750000
|
||||||
|
vt 0.750000 0.562500
|
||||||
|
vt 0.500000 0.750000
|
||||||
|
vt 0.500000 0.562500
|
||||||
|
vt 0.750000 1.000000
|
||||||
|
vt 0.500000 1.000000
|
||||||
|
vt 0.500000 0.750000
|
||||||
|
vt 0.750000 0.750000
|
||||||
|
vt 0.500000 1.000000
|
||||||
|
vt 0.250000 1.000000
|
||||||
|
vn -1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 -1.0000
|
||||||
|
vn 1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 1.0000
|
||||||
|
vn 0.0000 -1.0000 0.0000
|
||||||
|
vn 0.0000 1.0000 0.0000
|
||||||
|
usemtl None
|
||||||
|
s off
|
||||||
|
f 17/33/13 18/34/13 20/35/13 19/36/13
|
||||||
|
f 19/37/14 20/38/14 24/39/14 23/40/14
|
||||||
|
f 23/40/15 24/39/15 22/41/15 21/42/15
|
||||||
|
f 21/42/16 22/41/16 18/34/16 17/33/16
|
||||||
|
f 19/43/17 23/44/17 21/45/17 17/46/17
|
||||||
|
f 24/47/18 20/48/18 18/34/18 22/41/18
|
||||||
|
o low2_Cube.001
|
||||||
|
v -0.499935 -0.499936 0.499935
|
||||||
|
v -0.499935 0.062565 0.499935
|
||||||
|
v -0.499935 -0.499936 -0.500066
|
||||||
|
v -0.499935 0.062565 -0.500066
|
||||||
|
v 0.500066 -0.499936 0.499935
|
||||||
|
v 0.500066 0.062565 0.499935
|
||||||
|
v 0.500066 -0.499936 -0.500066
|
||||||
|
v 0.500066 0.062565 -0.500066
|
||||||
|
vt 0.250000 0.187500
|
||||||
|
vt 0.250000 0.312500
|
||||||
|
vt -0.000000 0.312500
|
||||||
|
vt -0.000000 0.187500
|
||||||
|
vt 1.000000 0.187500
|
||||||
|
vt 1.000000 0.312500
|
||||||
|
vt 0.750000 0.312500
|
||||||
|
vt 0.750000 0.187500
|
||||||
|
vt 0.500000 0.312500
|
||||||
|
vt 0.500000 0.187500
|
||||||
|
vt 0.750000 0.562500
|
||||||
|
vt 0.500000 0.562500
|
||||||
|
vt 0.500000 0.312500
|
||||||
|
vt 0.750000 0.312500
|
||||||
|
vt 0.500000 0.562500
|
||||||
|
vt 0.250000 0.562500
|
||||||
|
vn -1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 -1.0000
|
||||||
|
vn 1.0000 0.0000 0.0000
|
||||||
|
vn 0.0000 0.0000 1.0000
|
||||||
|
vn 0.0000 -1.0000 0.0000
|
||||||
|
vn 0.0000 1.0000 0.0000
|
||||||
|
usemtl None
|
||||||
|
s off
|
||||||
|
f 25/49/19 26/50/19 28/51/19 27/52/19
|
||||||
|
f 27/53/20 28/54/20 32/55/20 31/56/20
|
||||||
|
f 31/56/21 32/55/21 30/57/21 29/58/21
|
||||||
|
f 29/58/22 30/57/22 26/50/22 25/49/22
|
||||||
|
f 27/59/23 31/60/23 29/61/23 25/62/23
|
||||||
|
f 32/63/24 28/64/24 26/50/24 30/57/24
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -899,99 +899,118 @@ local treelight = 9
|
||||||
|
|
||||||
local sapling_grow_action = function(tree_id, soil_needed, one_by_one, two_by_two, sapling)
|
local sapling_grow_action = function(tree_id, soil_needed, one_by_one, two_by_two, sapling)
|
||||||
return function(pos)
|
return function(pos)
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
if meta:get("grown") then return end
|
||||||
-- Checks if the sapling at pos has enough light and the correct soil
|
-- Checks if the sapling at pos has enough light and the correct soil
|
||||||
local sapling_is_growable = function(pos)
|
local light = minetest.get_node_light(pos)
|
||||||
local light = minetest.get_node_light(pos)
|
if not light then return end
|
||||||
local soilnode = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
|
local low_light = (light < treelight)
|
||||||
local soiltype = minetest.get_item_group(soilnode.name, "soil_sapling")
|
|
||||||
return soiltype >= soil_needed and light and light >= treelight and not minetest.get_meta(pos):get("grown")
|
local delta = 1
|
||||||
|
local current_game_time = minetest.get_day_count() + minetest.get_timeofday()
|
||||||
|
|
||||||
|
local last_game_time = tonumber(meta:get_string("last_gametime"))
|
||||||
|
meta:set_string("last_gametime", tostring(current_game_time))
|
||||||
|
|
||||||
|
if last_game_time then
|
||||||
|
delta = current_game_time - last_game_time
|
||||||
|
elseif low_light then
|
||||||
|
return
|
||||||
end
|
end
|
||||||
if sapling_is_growable(pos) then
|
|
||||||
-- Increase and check growth stage
|
|
||||||
local meta = minetest.get_meta(pos)
|
|
||||||
local stage = meta:get_int("stage")
|
|
||||||
if stage == nil then stage = 0 end
|
|
||||||
stage = stage + 1
|
|
||||||
if stage >= 3 then
|
|
||||||
meta:set_string("grown", "true")
|
|
||||||
-- This sapling grows in a special way when there are 4 saplings in a 2×2 pattern
|
|
||||||
if two_by_two then
|
|
||||||
-- Check 8 surrounding saplings and try to find a 2×2 pattern
|
|
||||||
local is_sapling = function(pos, sapling)
|
|
||||||
return minetest.get_node(pos).name == sapling
|
|
||||||
end
|
|
||||||
local p2 = {x=pos.x+1, y=pos.y, z=pos.z}
|
|
||||||
local p3 = {x=pos.x, y=pos.y, z=pos.z-1}
|
|
||||||
local p4 = {x=pos.x+1, y=pos.y, z=pos.z-1}
|
|
||||||
local p5 = {x=pos.x-1, y=pos.y, z=pos.z-1}
|
|
||||||
local p6 = {x=pos.x-1, y=pos.y, z=pos.z}
|
|
||||||
local p7 = {x=pos.x-1, y=pos.y, z=pos.z+1}
|
|
||||||
local p8 = {x=pos.x, y=pos.y, z=pos.z+1}
|
|
||||||
local p9 = {x=pos.x+1, y=pos.y, z=pos.z+1}
|
|
||||||
local s2 = is_sapling(p2, sapling)
|
|
||||||
local s3 = is_sapling(p3, sapling)
|
|
||||||
local s4 = is_sapling(p4, sapling)
|
|
||||||
local s5 = is_sapling(p5, sapling)
|
|
||||||
local s6 = is_sapling(p6, sapling)
|
|
||||||
local s7 = is_sapling(p7, sapling)
|
|
||||||
local s8 = is_sapling(p8, sapling)
|
|
||||||
local s9 = is_sapling(p9, sapling)
|
|
||||||
-- In a 9×9 field there are 4 possible 2×2 squares. We check them all.
|
|
||||||
if s2 and s3 and s4 and check_tree_growth(pos, tree_id, { two_by_two = true }) then
|
|
||||||
-- Success: Remove saplings and place tree
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
minetest.remove_node(p2)
|
|
||||||
minetest.remove_node(p3)
|
|
||||||
minetest.remove_node(p4)
|
|
||||||
mcl_core.generate_tree(pos, tree_id, { two_by_two = true })
|
|
||||||
return
|
|
||||||
elseif s3 and s5 and s6 and check_tree_growth(p6, tree_id, { two_by_two = true }) then
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
minetest.remove_node(p3)
|
|
||||||
minetest.remove_node(p5)
|
|
||||||
minetest.remove_node(p6)
|
|
||||||
mcl_core.generate_tree(p6, tree_id, { two_by_two = true })
|
|
||||||
return
|
|
||||||
elseif s6 and s7 and s8 and check_tree_growth(p7, tree_id, { two_by_two = true }) then
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
minetest.remove_node(p6)
|
|
||||||
minetest.remove_node(p7)
|
|
||||||
minetest.remove_node(p8)
|
|
||||||
mcl_core.generate_tree(p7, tree_id, { two_by_two = true })
|
|
||||||
return
|
|
||||||
elseif s2 and s8 and s9 and check_tree_growth(p8, tree_id, { two_by_two = true }) then
|
|
||||||
minetest.remove_node(pos)
|
|
||||||
minetest.remove_node(p2)
|
|
||||||
minetest.remove_node(p8)
|
|
||||||
minetest.remove_node(p9)
|
|
||||||
mcl_core.generate_tree(p8, tree_id, { two_by_two = true })
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if one_by_one and tree_id == OAK_TREE_ID then
|
if low_light then
|
||||||
-- There is a chance that this tree wants to grow as a balloon oak
|
if delta < 1.2 then return end
|
||||||
if math.random(1, 12) == 1 then
|
if minetest.get_node_light(pos, 0.5) < treelight then return end
|
||||||
-- Check if there is room for that
|
end
|
||||||
if check_tree_growth(pos, tree_id, { balloon = true }) then
|
|
||||||
minetest.set_node(pos, {name="air"})
|
|
||||||
mcl_core.generate_tree(pos, tree_id, { balloon = true })
|
|
||||||
return
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- If this sapling can grow alone
|
-- TODO: delta is [days] missed in inactive area. Currently we just add it to stage, which is far from a perfect calculation...
|
||||||
if one_by_one and check_tree_growth(pos, tree_id) then
|
|
||||||
-- Single sapling
|
local soilnode = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z})
|
||||||
minetest.set_node(pos, {name="air"})
|
local soiltype = minetest.get_item_group(soilnode.name, "soil_sapling")
|
||||||
local r = math.random(1, 12)
|
if soiltype < soil_needed then return end
|
||||||
mcl_core.generate_tree(pos, tree_id)
|
|
||||||
|
-- Increase and check growth stage
|
||||||
|
local meta = minetest.get_meta(pos)
|
||||||
|
local stage = meta:get_int("stage")
|
||||||
|
if stage == nil then stage = 0 end
|
||||||
|
stage = stage + math.max(1, math.floor(delta))
|
||||||
|
if stage >= 3 then
|
||||||
|
meta:set_string("grown", "true")
|
||||||
|
-- This sapling grows in a special way when there are 4 saplings in a 2×2 pattern
|
||||||
|
if two_by_two then
|
||||||
|
-- Check 8 surrounding saplings and try to find a 2×2 pattern
|
||||||
|
local is_sapling = function(pos, sapling)
|
||||||
|
return minetest.get_node(pos).name == sapling
|
||||||
|
end
|
||||||
|
local p2 = {x=pos.x+1, y=pos.y, z=pos.z}
|
||||||
|
local p3 = {x=pos.x, y=pos.y, z=pos.z-1}
|
||||||
|
local p4 = {x=pos.x+1, y=pos.y, z=pos.z-1}
|
||||||
|
local p5 = {x=pos.x-1, y=pos.y, z=pos.z-1}
|
||||||
|
local p6 = {x=pos.x-1, y=pos.y, z=pos.z}
|
||||||
|
local p7 = {x=pos.x-1, y=pos.y, z=pos.z+1}
|
||||||
|
local p8 = {x=pos.x, y=pos.y, z=pos.z+1}
|
||||||
|
local p9 = {x=pos.x+1, y=pos.y, z=pos.z+1}
|
||||||
|
local s2 = is_sapling(p2, sapling)
|
||||||
|
local s3 = is_sapling(p3, sapling)
|
||||||
|
local s4 = is_sapling(p4, sapling)
|
||||||
|
local s5 = is_sapling(p5, sapling)
|
||||||
|
local s6 = is_sapling(p6, sapling)
|
||||||
|
local s7 = is_sapling(p7, sapling)
|
||||||
|
local s8 = is_sapling(p8, sapling)
|
||||||
|
local s9 = is_sapling(p9, sapling)
|
||||||
|
-- In a 9×9 field there are 4 possible 2×2 squares. We check them all.
|
||||||
|
if s2 and s3 and s4 and check_tree_growth(pos, tree_id, { two_by_two = true }) then
|
||||||
|
-- Success: Remove saplings and place tree
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
minetest.remove_node(p2)
|
||||||
|
minetest.remove_node(p3)
|
||||||
|
minetest.remove_node(p4)
|
||||||
|
mcl_core.generate_tree(pos, tree_id, { two_by_two = true })
|
||||||
|
return
|
||||||
|
elseif s3 and s5 and s6 and check_tree_growth(p6, tree_id, { two_by_two = true }) then
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
minetest.remove_node(p3)
|
||||||
|
minetest.remove_node(p5)
|
||||||
|
minetest.remove_node(p6)
|
||||||
|
mcl_core.generate_tree(p6, tree_id, { two_by_two = true })
|
||||||
|
return
|
||||||
|
elseif s6 and s7 and s8 and check_tree_growth(p7, tree_id, { two_by_two = true }) then
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
minetest.remove_node(p6)
|
||||||
|
minetest.remove_node(p7)
|
||||||
|
minetest.remove_node(p8)
|
||||||
|
mcl_core.generate_tree(p7, tree_id, { two_by_two = true })
|
||||||
|
return
|
||||||
|
elseif s2 and s8 and s9 and check_tree_growth(p8, tree_id, { two_by_two = true }) then
|
||||||
|
minetest.remove_node(pos)
|
||||||
|
minetest.remove_node(p2)
|
||||||
|
minetest.remove_node(p8)
|
||||||
|
minetest.remove_node(p9)
|
||||||
|
mcl_core.generate_tree(p8, tree_id, { two_by_two = true })
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
else
|
|
||||||
meta:set_int("stage", stage)
|
|
||||||
end
|
end
|
||||||
|
if one_by_one and tree_id == OAK_TREE_ID then
|
||||||
|
-- There is a chance that this tree wants to grow as a balloon oak
|
||||||
|
if math.random(1, 12) == 1 then
|
||||||
|
-- Check if there is room for that
|
||||||
|
if check_tree_growth(pos, tree_id, { balloon = true }) then
|
||||||
|
minetest.set_node(pos, {name="air"})
|
||||||
|
mcl_core.generate_tree(pos, tree_id, { balloon = true })
|
||||||
|
return
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-- If this sapling can grow alone
|
||||||
|
if one_by_one and check_tree_growth(pos, tree_id) then
|
||||||
|
-- Single sapling
|
||||||
|
minetest.set_node(pos, {name="air"})
|
||||||
|
local r = math.random(1, 12)
|
||||||
|
mcl_core.generate_tree(pos, tree_id)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
else
|
||||||
|
meta:set_int("stage", stage)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1040,7 +1059,14 @@ minetest.register_abm({
|
||||||
neighbors = {"group:soil_sapling"},
|
neighbors = {"group:soil_sapling"},
|
||||||
interval = 25,
|
interval = 25,
|
||||||
chance = 2,
|
chance = 2,
|
||||||
action = grow_oak,
|
action = grow_oak
|
||||||
|
})
|
||||||
|
minetest.register_lbm({
|
||||||
|
label = "Add growth for unloaded oak tree",
|
||||||
|
name = "mcl_core:lbm_oak",
|
||||||
|
nodenames = {"mcl_core:sapling"},
|
||||||
|
run_at_every_load = true,
|
||||||
|
action = grow_oak
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Dark oak tree
|
-- Dark oak tree
|
||||||
|
@ -1050,7 +1076,14 @@ minetest.register_abm({
|
||||||
neighbors = {"group:soil_sapling"},
|
neighbors = {"group:soil_sapling"},
|
||||||
interval = 25,
|
interval = 25,
|
||||||
chance = 2,
|
chance = 2,
|
||||||
action = grow_dark_oak,
|
action = grow_dark_oak
|
||||||
|
})
|
||||||
|
minetest.register_lbm({
|
||||||
|
label = "Add growth for unloaded dark oak tree",
|
||||||
|
name = "mcl_core:lbm_dark_oak",
|
||||||
|
nodenames = {"mcl_core:darksapling"},
|
||||||
|
run_at_every_load = true,
|
||||||
|
action = grow_dark_oak
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Jungle Tree
|
-- Jungle Tree
|
||||||
|
@ -1060,7 +1093,14 @@ minetest.register_abm({
|
||||||
neighbors = {"group:soil_sapling"},
|
neighbors = {"group:soil_sapling"},
|
||||||
interval = 25,
|
interval = 25,
|
||||||
chance = 2,
|
chance = 2,
|
||||||
action = grow_jungle_tree,
|
action = grow_jungle_tree
|
||||||
|
})
|
||||||
|
minetest.register_lbm({
|
||||||
|
label = "Add growth for unloaded jungle tree",
|
||||||
|
name = "mcl_core:lbm_jungle_tree",
|
||||||
|
nodenames = {"mcl_core:junglesapling"},
|
||||||
|
run_at_every_load = true,
|
||||||
|
action = grow_jungle_tree
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Spruce tree
|
-- Spruce tree
|
||||||
|
@ -1072,6 +1112,13 @@ minetest.register_abm({
|
||||||
chance = 2,
|
chance = 2,
|
||||||
action = grow_spruce
|
action = grow_spruce
|
||||||
})
|
})
|
||||||
|
minetest.register_lbm({
|
||||||
|
label = "Add growth for unloaded spruce tree",
|
||||||
|
name = "mcl_core:lbm_spruce",
|
||||||
|
nodenames = {"mcl_core:sprucesapling"},
|
||||||
|
run_at_every_load = true,
|
||||||
|
action = grow_spruce
|
||||||
|
})
|
||||||
|
|
||||||
-- Birch tree
|
-- Birch tree
|
||||||
minetest.register_abm({
|
minetest.register_abm({
|
||||||
|
@ -1080,7 +1127,14 @@ minetest.register_abm({
|
||||||
neighbors = {"group:soil_sapling"},
|
neighbors = {"group:soil_sapling"},
|
||||||
interval = 25,
|
interval = 25,
|
||||||
chance = 2,
|
chance = 2,
|
||||||
action = grow_birch,
|
action = grow_birch
|
||||||
|
})
|
||||||
|
minetest.register_lbm({
|
||||||
|
label = "Add growth for unloaded birch tree",
|
||||||
|
name = "mcl_core:lbm_birch",
|
||||||
|
nodenames = {"mcl_core:birchsapling"},
|
||||||
|
run_at_every_load = true,
|
||||||
|
action = grow_birch
|
||||||
})
|
})
|
||||||
|
|
||||||
-- Acacia tree
|
-- Acacia tree
|
||||||
|
@ -1090,7 +1144,14 @@ minetest.register_abm({
|
||||||
neighbors = {"group:soil_sapling"},
|
neighbors = {"group:soil_sapling"},
|
||||||
interval = 20,
|
interval = 20,
|
||||||
chance = 2,
|
chance = 2,
|
||||||
action = grow_acacia,
|
action = grow_acacia
|
||||||
|
})
|
||||||
|
minetest.register_lbm({
|
||||||
|
label = "Add growth for unloaded acacia tree",
|
||||||
|
name = "mcl_core:lbm_acacia",
|
||||||
|
nodenames = {"mcl_core:acaciasapling"},
|
||||||
|
run_at_every_load = true,
|
||||||
|
action = grow_acacia
|
||||||
})
|
})
|
||||||
|
|
||||||
local function leafdecay_particles(pos, node)
|
local function leafdecay_particles(pos, node)
|
||||||
|
|
|
@ -61,8 +61,7 @@ function settlements.initialize_settlement_info(pr)
|
||||||
local count_buildings = {}
|
local count_buildings = {}
|
||||||
|
|
||||||
-- count_buildings table reset
|
-- count_buildings table reset
|
||||||
for k,v in pairs(schematic_table) do
|
for k,v in pairs(settlements.schematic_table) do
|
||||||
-- local name = schematic_table[v]["name"]
|
|
||||||
count_buildings[v["name"]] = 0
|
count_buildings[v["name"]] = 0
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -74,96 +73,6 @@ function settlements.initialize_settlement_info(pr)
|
||||||
return count_buildings, number_of_buildings, number_built
|
return count_buildings, number_of_buildings, number_built
|
||||||
end
|
end
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- fill settlement_info with LVM
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
function settlements.create_site_plan_lvm(maxp, minp, pr)
|
|
||||||
local settlement_info = {}
|
|
||||||
local building_all_info
|
|
||||||
local possible_rotations = {"0", "90", "180", "270"}
|
|
||||||
-- find center of chunk
|
|
||||||
local center = {
|
|
||||||
x=maxp.x-half_map_chunk_size,
|
|
||||||
y=maxp.y,
|
|
||||||
z=maxp.z-half_map_chunk_size
|
|
||||||
}
|
|
||||||
-- find center_surface of chunk
|
|
||||||
local center_surface, surface_material = settlements.find_surface_lvm(center, minp)
|
|
||||||
-- go build settlement around center
|
|
||||||
if not center_surface then return false end
|
|
||||||
|
|
||||||
-- add settlement to list
|
|
||||||
table.insert(settlements_in_world, center_surface)
|
|
||||||
-- save list to file
|
|
||||||
settlements.save()
|
|
||||||
-- initialize all settlement_info table
|
|
||||||
local count_buildings, number_of_buildings, number_built = settlements.initialize_settlement_info(pr)
|
|
||||||
-- first building is townhall in the center
|
|
||||||
building_all_info = schematic_table[1]
|
|
||||||
local rotation = possible_rotations[ pr:next(1, #possible_rotations ) ]
|
|
||||||
-- add to settlement info table
|
|
||||||
local index = 1
|
|
||||||
settlement_info[index] = {
|
|
||||||
pos = center_surface,
|
|
||||||
name = building_all_info["name"],
|
|
||||||
hsize = building_all_info["hsize"],
|
|
||||||
rotat = rotation,
|
|
||||||
surface_mat = surface_material
|
|
||||||
}
|
|
||||||
-- increase index for following buildings
|
|
||||||
index = index + 1
|
|
||||||
-- now some buildings around in a circle, radius = size of town center
|
|
||||||
local x, z, r = center_surface.x, center_surface.z, building_all_info["hsize"]
|
|
||||||
-- draw j circles around center and increase radius by math.random(2,5)
|
|
||||||
for j = 1,20 do
|
|
||||||
if number_built < number_of_buildings then
|
|
||||||
-- set position on imaginary circle
|
|
||||||
for j = 0, 360, 15 do
|
|
||||||
local angle = j * math.pi / 180
|
|
||||||
local ptx, ptz = x + r * math.cos( angle ), z + r * math.sin( angle )
|
|
||||||
ptx = settlements.round(ptx, 0)
|
|
||||||
ptz = settlements.round(ptz, 0)
|
|
||||||
local pos1 = { x=ptx, y=center_surface.y+50, z=ptz}
|
|
||||||
local pos_surface, surface_material = settlements.find_surface_lvm(pos1, minp)
|
|
||||||
if not pos_surface then break end
|
|
||||||
|
|
||||||
local randomized_schematic_table = shuffle(schematic_table, pr)
|
|
||||||
-- pick schematic
|
|
||||||
local size = #randomized_schematic_table
|
|
||||||
for i = size, 1, -1 do
|
|
||||||
-- already enough buildings of that type?
|
|
||||||
if count_buildings[randomized_schematic_table[i]["name"]] < randomized_schematic_table[i]["max_num"]*number_of_buildings then
|
|
||||||
building_all_info = randomized_schematic_table[i]
|
|
||||||
-- check distance to other buildings
|
|
||||||
local distance_to_other_buildings_ok = settlements.check_distance(settlement_info, pos_surface, building_all_info["hsize"])
|
|
||||||
if distance_to_other_buildings_ok then
|
|
||||||
-- count built houses
|
|
||||||
count_buildings[building_all_info["name"]] = count_buildings[building_all_info["name"]] +1
|
|
||||||
|
|
||||||
rotation = possible_rotations[ pr:next(1, #possible_rotations ) ]
|
|
||||||
number_built = number_built + 1
|
|
||||||
settlement_info[index] = {
|
|
||||||
pos = pos_surface,
|
|
||||||
name = building_all_info["name"],
|
|
||||||
hsize = building_all_info["hsize"],
|
|
||||||
rotat = rotation,
|
|
||||||
surface_mat = surface_material
|
|
||||||
}
|
|
||||||
index = index + 1
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if number_of_buildings == number_built then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
r = r + pr:next(2,5)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
settlements.debug("really ".. number_built)
|
|
||||||
return settlement_info
|
|
||||||
end
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
-- fill settlement_info
|
-- fill settlement_info
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
function settlements.create_site_plan(maxp, minp, pr)
|
function settlements.create_site_plan(maxp, minp, pr)
|
||||||
|
@ -188,7 +97,7 @@ function settlements.create_site_plan(maxp, minp, pr)
|
||||||
-- initialize all settlement_info table
|
-- initialize all settlement_info table
|
||||||
local count_buildings, number_of_buildings, number_built = settlements.initialize_settlement_info(pr)
|
local count_buildings, number_of_buildings, number_built = settlements.initialize_settlement_info(pr)
|
||||||
-- first building is townhall in the center
|
-- first building is townhall in the center
|
||||||
building_all_info = schematic_table[1]
|
building_all_info = settlements.schematic_table[1]
|
||||||
local rotation = possible_rotations[ pr:next(1, #possible_rotations ) ]
|
local rotation = possible_rotations[ pr:next(1, #possible_rotations ) ]
|
||||||
-- add to settlement info table
|
-- add to settlement info table
|
||||||
local index = 1
|
local index = 1
|
||||||
|
@ -216,7 +125,7 @@ function settlements.create_site_plan(maxp, minp, pr)
|
||||||
local pos_surface, surface_material = settlements.find_surface(pos1)
|
local pos_surface, surface_material = settlements.find_surface(pos1)
|
||||||
if not pos_surface then break end
|
if not pos_surface then break end
|
||||||
|
|
||||||
local randomized_schematic_table = shuffle(schematic_table, pr)
|
local randomized_schematic_table = shuffle(settlements.schematic_table, pr)
|
||||||
-- pick schematic
|
-- pick schematic
|
||||||
local size = #randomized_schematic_table
|
local size = #randomized_schematic_table
|
||||||
for i = size, 1, -1 do
|
for i = size, 1, -1 do
|
||||||
|
@ -255,60 +164,10 @@ end
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- evaluate settlement_info and place schematics
|
-- evaluate settlement_info and place schematics
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
function settlements.place_schematics_lvm(settlement_info, pr)
|
|
||||||
for i, built_house in ipairs(settlement_info) do
|
|
||||||
for j, schem in ipairs(schematic_table) do
|
|
||||||
if settlement_info[i]["name"] == schem["name"] then
|
|
||||||
building_all_info = schem
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local pos = settlement_info[i]["pos"]
|
|
||||||
local rotation = settlement_info[i]["rotat"]
|
|
||||||
-- get building node material for better integration to surrounding
|
|
||||||
local platform_material = settlement_info[i]["surface_mat"]
|
|
||||||
platform_material_name = minetest.get_name_from_content_id(platform_material)
|
|
||||||
-- pick random material
|
|
||||||
local material = wallmaterial[pr:next(1,#wallmaterial)]
|
|
||||||
--
|
|
||||||
local building = building_all_info["mts"]
|
|
||||||
local replace_wall = building_all_info["rplc"]
|
|
||||||
-- schematic conversion to lua
|
|
||||||
local schem_lua = minetest.serialize_schematic(building,
|
|
||||||
"lua",
|
|
||||||
{lua_use_comments = false, lua_num_indent_spaces = 0}).." return(schematic)"
|
|
||||||
-- replace material
|
|
||||||
if replace_wall == "y" then
|
|
||||||
schem_lua = schem_lua:gsub("mcl_core:cobble", material)
|
|
||||||
end
|
|
||||||
schem_lua = schem_lua:gsub("mcl_core:dirt_with_grass", platform_material_name)
|
|
||||||
|
|
||||||
--[[ Disable special junglewood for now.
|
|
||||||
-- special material for spawning npcs
|
|
||||||
schem_lua = schem_lua:gsub("mcl_core:junglewood", "settlements:junglewood")
|
|
||||||
--]]
|
|
||||||
-- format schematic string
|
|
||||||
local schematic = loadstring(schem_lua)()
|
|
||||||
-- build foundation for the building an make room above
|
|
||||||
-- place schematic
|
|
||||||
|
|
||||||
minetest.place_schematic_on_vmanip(
|
|
||||||
vm,
|
|
||||||
pos,
|
|
||||||
schematic,
|
|
||||||
rotation,
|
|
||||||
nil,
|
|
||||||
true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
-- evaluate settlement_info and place schematics
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
function settlements.place_schematics(settlement_info, pr)
|
function settlements.place_schematics(settlement_info, pr)
|
||||||
local building_all_info
|
local building_all_info
|
||||||
for i, built_house in ipairs(settlement_info) do
|
for i, built_house in ipairs(settlement_info) do
|
||||||
for j, schem in ipairs(schematic_table) do
|
for j, schem in ipairs(settlements.schematic_table) do
|
||||||
if settlement_info[i]["name"] == schem["name"] then
|
if settlement_info[i]["name"] == schem["name"] then
|
||||||
building_all_info = schem
|
building_all_info = schem
|
||||||
break
|
break
|
||||||
|
@ -318,10 +177,10 @@ function settlements.place_schematics(settlement_info, pr)
|
||||||
local pos = settlement_info[i]["pos"]
|
local pos = settlement_info[i]["pos"]
|
||||||
local rotation = settlement_info[i]["rotat"]
|
local rotation = settlement_info[i]["rotat"]
|
||||||
-- get building node material for better integration to surrounding
|
-- get building node material for better integration to surrounding
|
||||||
local platform_material = settlement_info[i]["surface_mat"]
|
local platform_material = settlement_info[i]["surface_mat"]
|
||||||
--platform_material_name = minetest.get_name_from_content_id(platform_material)
|
--platform_material_name = minetest.get_name_from_content_id(platform_material)
|
||||||
-- pick random material
|
-- pick random material
|
||||||
local material = wallmaterial[pr:next(1,#wallmaterial)]
|
--local material = wallmaterial[pr:next(1,#wallmaterial)]
|
||||||
--
|
--
|
||||||
local building = building_all_info["mts"]
|
local building = building_all_info["mts"]
|
||||||
local replace_wall = building_all_info["rplc"]
|
local replace_wall = building_all_info["rplc"]
|
||||||
|
@ -330,8 +189,28 @@ function settlements.place_schematics(settlement_info, pr)
|
||||||
"lua",
|
"lua",
|
||||||
{lua_use_comments = false, lua_num_indent_spaces = 0}).." return(schematic)"
|
{lua_use_comments = false, lua_num_indent_spaces = 0}).." return(schematic)"
|
||||||
-- replace material
|
-- replace material
|
||||||
if replace_wall == "y" then
|
if replace_wall then
|
||||||
schem_lua = schem_lua:gsub("mcl_core:cobble", material)
|
--Note, block substitution isn't matching node names exactly; so nodes that are to be substituted that have the same prefixes cause bugs.
|
||||||
|
-- Example: Attempting to swap out 'mcl_core:stonebrick'; which has multiple, additional sub-variants: (carved, cracked, mossy). Will currently cause issues, so leaving disabled.
|
||||||
|
if platform_material == "mcl_core:snow" or platform_material == "mcl_core:dirt_with_grass_snow" or platform_material == "mcl_core:podzol" then
|
||||||
|
schem_lua = schem_lua:gsub("mcl_core:tree", "mcl_core:sprucetree")
|
||||||
|
schem_lua = schem_lua:gsub("mcl_core:wood", "mcl_core:sprucewood")
|
||||||
|
--schem_lua = schem_lua:gsub("mcl_fences:fence", "mcl_fences:spruce_fence")
|
||||||
|
--schem_lua = schem_lua:gsub("mcl_stairs:slab_wood_top", "mcl_stairs:slab_sprucewood_top")
|
||||||
|
--schem_lua = schem_lua:gsub("mcl_stairs:stair_wood", "mcl_stairs:stair_sprucewood")
|
||||||
|
--schem_lua = schem_lua:gsub("mesecons_pressureplates:pressure_plate_wood_off", "mesecons_pressureplates:pressure_plate_sprucewood_off")
|
||||||
|
elseif platform_material == "mcl_core:sand" or platform_material == "mcl_core:redsand" then
|
||||||
|
schem_lua = schem_lua:gsub("mcl_core:tree", "mcl_core:sandstonecarved")
|
||||||
|
schem_lua = schem_lua:gsub("mcl_core:cobble", "mcl_core:sandstone")
|
||||||
|
schem_lua = schem_lua:gsub("mcl_core:wood", "mcl_core:sandstonesmooth")
|
||||||
|
--schem_lua = schem_lua:gsub("mcl_fences:fence", "mcl_fences:birch_fence")
|
||||||
|
--schem_lua = schem_lua:gsub("mcl_stairs:slab_wood_top", "mcl_stairs:slab_birchwood_top")
|
||||||
|
--schem_lua = schem_lua:gsub("mcl_stairs:stair_wood", "mcl_stairs:stair_birchwood")
|
||||||
|
--schem_lua = schem_lua:gsub("mesecons_pressureplates:pressure_plate_wood_off", "mesecons_pressureplates:pressure_plate_birchwood_off")
|
||||||
|
--schem_lua = schem_lua:gsub("mcl_stairs:stair_stonebrick", "mcl_stairs:stair_redsandstone")
|
||||||
|
--schem_lua = schem_lua:gsub("mcl_core:stonebrick", "mcl_core:redsandstonesmooth")
|
||||||
|
schem_lua = schem_lua:gsub("mcl_core:brick_block", "mcl_core:redsandstone")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
schem_lua = schem_lua:gsub("mcl_core:dirt_with_grass", platform_material)
|
schem_lua = schem_lua:gsub("mcl_core:dirt_with_grass", platform_material)
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,7 @@ settlements.debug = function(message)
|
||||||
minetest.log("verbose", "[mcl_villages] "..message)
|
minetest.log("verbose", "[mcl_villages] "..message)
|
||||||
end
|
end
|
||||||
|
|
||||||
-- switch for lvm
|
--[[ Manually set in 'buildings.lua'
|
||||||
settlements.lvm = false
|
|
||||||
|
|
||||||
settlements.last_settlement = os.time()
|
|
||||||
|
|
||||||
-- material to replace cobblestone with
|
-- material to replace cobblestone with
|
||||||
wallmaterial = {
|
wallmaterial = {
|
||||||
"mcl_core:junglewood",
|
"mcl_core:junglewood",
|
||||||
|
@ -23,6 +19,7 @@ wallmaterial = {
|
||||||
"mcl_core:sandstone",
|
"mcl_core:sandstone",
|
||||||
"mcl_core:sandstonesmooth2"
|
"mcl_core:sandstonesmooth2"
|
||||||
}
|
}
|
||||||
|
--]]
|
||||||
settlements.surface_mat = {}
|
settlements.surface_mat = {}
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- Set array to list
|
-- Set array to list
|
||||||
|
@ -38,7 +35,7 @@ function settlements.grundstellungen()
|
||||||
"mcl_core:sand",
|
"mcl_core:sand",
|
||||||
"mcl_core:redsand",
|
"mcl_core:redsand",
|
||||||
--"mcl_core:silver_sand",
|
--"mcl_core:silver_sand",
|
||||||
"mcl_core:snowblock"
|
"mcl_core:snow"
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
--
|
--
|
||||||
|
@ -52,27 +49,27 @@ schem_path = settlements.modpath.."/schematics/"
|
||||||
--
|
--
|
||||||
-- list of schematics
|
-- list of schematics
|
||||||
--
|
--
|
||||||
schematic_table = {
|
local basic_pseudobiome_villages = minetest.settings:get_bool("basic_pseudobiome_villages", false)
|
||||||
{name = "large_house", mts = schem_path.."large_house.mts", hwidth = 11, hdepth = 12, hheight = 9, hsize = 14, max_num = 0.08, rplc = "n"},
|
|
||||||
{name = "blacksmith", mts = schem_path.."blacksmith.mts", hwidth = 7, hdepth = 7, hheight = 13, hsize = 13, max_num = 0.055, rplc = "n"},
|
settlements.schematic_table = {
|
||||||
{name = "butcher", mts = schem_path.."butcher.mts", hwidth = 11, hdepth = 8, hheight = 10, hsize = 14, max_num = 0.03, rplc = "n"},
|
{name = "large_house", mts = schem_path.."large_house.mts", hwidth = 11, hdepth = 12, hheight = 9, hsize = 14, max_num = 0.08 , rplc = basic_pseudobiome_villages },
|
||||||
{name = "church", mts = schem_path.."church.mts", hwidth = 13, hdepth = 13, hheight = 14, hsize = 15, max_num = 0.04, rplc = "n"},
|
{name = "blacksmith", mts = schem_path.."blacksmith.mts", hwidth = 7, hdepth = 7, hheight = 13, hsize = 13, max_num = 0.055, rplc = basic_pseudobiome_villages },
|
||||||
{name = "farm", mts = schem_path.."farm.mts", hwidth = 7, hdepth = 7, hheight = 13, hsize = 13, max_num = 0.1, rplc = "n"},
|
{name = "butcher", mts = schem_path.."butcher.mts", hwidth = 11, hdepth = 8, hheight = 10, hsize = 14, max_num = 0.03 , rplc = basic_pseudobiome_villages },
|
||||||
{name = "lamp", mts = schem_path.."lamp.mts", hwidth = 3, hdepth = 3, hheight = 13, hsize = 10, max_num = 0.1, rplc = "n"},
|
{name = "church", mts = schem_path.."church.mts", hwidth = 13, hdepth = 13, hheight = 14, hsize = 15, max_num = 0.04 , rplc = basic_pseudobiome_villages },
|
||||||
{name = "library", mts = schem_path.."library.mts", hwidth = 12, hdepth = 12, hheight = 8, hsize = 13, max_num = 0.04, rplc = "n"},
|
{name = "farm", mts = schem_path.."farm.mts", hwidth = 7, hdepth = 7, hheight = 13, hsize = 13, max_num = 0.1 , rplc = basic_pseudobiome_villages },
|
||||||
{name = "medium_house", mts = schem_path.."medium_house.mts", hwidth = 8, hdepth = 12, hheight = 8, hsize = 14, max_num = 0.08, rplc = "n"},
|
{name = "lamp", mts = schem_path.."lamp.mts", hwidth = 3, hdepth = 3, hheight = 13, hsize = 10, max_num = 0.1 , rplc = false },
|
||||||
{name = "small_house", mts = schem_path.."small_house.mts", hwidth = 9, hdepth = 7, hheight = 8, hsize = 13, max_num = 0.7, rplc = "n"},
|
{name = "library", mts = schem_path.."library.mts", hwidth = 12, hdepth = 12, hheight = 8, hsize = 13, max_num = 0.04 , rplc = basic_pseudobiome_villages },
|
||||||
{name = "tavern", mts = schem_path.."tavern.mts", hwidth = 11, hdepth = 10, hheight = 10, hsize = 13, max_num = 0.050, rplc = "n"},
|
{name = "medium_house", mts = schem_path.."medium_house.mts", hwidth = 8, hdepth = 12, hheight = 8, hsize = 14, max_num = 0.08 , rplc = basic_pseudobiome_villages },
|
||||||
{name = "well", mts = schem_path.."well.mts", hwidth = 6, hdepth = 8, hheight = 6, hsize = 10, max_num = 0.045, rplc = "n"},
|
{name = "small_house", mts = schem_path.."small_house.mts", hwidth = 9, hdepth = 7, hheight = 8, hsize = 13, max_num = 0.7 , rplc = basic_pseudobiome_villages },
|
||||||
|
{name = "tavern", mts = schem_path.."tavern.mts", hwidth = 11, hdepth = 10, hheight = 10, hsize = 13, max_num = 0.050, rplc = basic_pseudobiome_villages },
|
||||||
|
{name = "well", mts = schem_path.."well.mts", hwidth = 6, hdepth = 8, hheight = 6, hsize = 10, max_num = 0.045, rplc = basic_pseudobiome_villages },
|
||||||
}
|
}
|
||||||
|
|
||||||
--
|
--
|
||||||
-- list of settlements, load on server start up
|
-- list of settlements, load on server start up
|
||||||
--
|
--
|
||||||
settlements_in_world = {}
|
settlements_in_world = {}
|
||||||
--
|
--
|
||||||
-- min_distance between settlements
|
|
||||||
--
|
|
||||||
settlements.min_dist_settlements = 64
|
|
||||||
--
|
--
|
||||||
-- maximum allowed difference in height for building a sttlement
|
-- maximum allowed difference in height for building a sttlement
|
||||||
--
|
--
|
||||||
|
|
|
@ -1,23 +1,22 @@
|
||||||
--
|
--
|
||||||
function settlements.convert_mts_to_lua()
|
function settlements.convert_mts_to_lua()
|
||||||
local building = schem_path.."townhall.mts"
|
local building = schem_path.."townhall.mts"
|
||||||
local str = minetest.serialize_schematic(building, "lua", {lua_use_comments = true, lua_num_indent_spaces = 0}).." return(schematic)"
|
local str = minetest.serialize_schematic(building, "lua", {lua_use_comments = true, lua_num_indent_spaces = 0}).." return(schematic)"
|
||||||
local schematic = loadstring(str)()
|
local schematic = loadstring(str)()
|
||||||
local file = io.open(schem_path.."church"..".lua", "w")
|
local file = io.open(schem_path.."church"..".lua", "w")
|
||||||
file:write(dump(schematic))
|
file:write(dump(schematic))
|
||||||
file:close()
|
file:close()
|
||||||
print(dump(schematic))
|
print(dump(schematic))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function settlements.mts_save()
|
function settlements.mts_save()
|
||||||
local f = assert(io.open(schem_path.."hut.lua", "r"))
|
local f = assert(io.open(schem_path.."hut.lua", "r"))
|
||||||
local content = f:read("*all").." return(schematic2)"
|
local content = f:read("*all").." return(schematic2)"
|
||||||
f:close()
|
f:close()
|
||||||
|
|
||||||
local schematic2 = loadstring("schematic2 = "..content)()
|
local schematic2 = loadstring("schematic2 = "..content)()
|
||||||
local seb = minetest.serialize_schematic(schematic2, "mts", {})
|
local seb = minetest.serialize_schematic(schematic2, "mts", {})
|
||||||
local filename = schem_path .. "hut2" .. ".mts"
|
local filename = schem_path .. "hut2" .. ".mts"
|
||||||
filename = filename:gsub("\"", "\\\""):gsub("\\", "\\\\")
|
filename = filename:gsub("\"", "\\\""):gsub("\\", "\\\\")
|
||||||
local file, err = io.open(filename, "wb")
|
local file, err = io.open(filename, "wb")
|
||||||
|
@ -27,4 +26,4 @@ function settlements.mts_save()
|
||||||
file:close()
|
file:close()
|
||||||
end
|
end
|
||||||
print("Wrote: " .. filename)
|
print("Wrote: " .. filename)
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,28 +1,6 @@
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- function to fill empty space below baseplate when building on a hill
|
-- function to fill empty space below baseplate when building on a hill
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
function settlements.ground_lvm(pos, pr) -- role model: Wendelsteinkircherl, Brannenburg
|
|
||||||
local c_dirt = minetest.get_content_id("mcl_core:dirt")
|
|
||||||
local c_stone = minetest.get_content_id("mcl_core:stone")
|
|
||||||
--
|
|
||||||
local p2 = vector.new(pos)
|
|
||||||
local cnt = 0
|
|
||||||
local mat = c_dirt
|
|
||||||
p2.y = p2.y-1
|
|
||||||
while true do
|
|
||||||
cnt = cnt+1
|
|
||||||
if cnt > 20 then break end
|
|
||||||
if cnt>pr:next(2,4) then mat = c_stone end
|
|
||||||
--minetest.swap_node(p2, {name="mcl_core:"..mat})
|
|
||||||
local vi = va:index(p2.x, p2.y, p2.z)
|
|
||||||
data[vi] = mat
|
|
||||||
p2.y = p2.y-1
|
|
||||||
end
|
|
||||||
-- return data
|
|
||||||
end
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
-- function to fill empty space below baseplate when building on a hill
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
function settlements.ground(pos, pr) -- role model: Wendelsteinkircherl, Brannenburg
|
function settlements.ground(pos, pr) -- role model: Wendelsteinkircherl, Brannenburg
|
||||||
local p2 = vector.new(pos)
|
local p2 = vector.new(pos)
|
||||||
local cnt = 0
|
local cnt = 0
|
||||||
|
@ -41,113 +19,47 @@ end
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- function clear space above baseplate
|
-- function clear space above baseplate
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
function settlements.terraform_lvm(settlement_info, pr)
|
|
||||||
local c_air = minetest.get_content_id("air")
|
|
||||||
local fheight
|
|
||||||
local fwidth
|
|
||||||
local fdepth
|
|
||||||
|
|
||||||
|
|
||||||
for i, built_house in ipairs(settlement_info) do
|
|
||||||
-- pick right schematic_info to current built_house
|
|
||||||
for j, schem in ipairs(schematic_table) do
|
|
||||||
if settlement_info[i]["name"] == schem["name"]
|
|
||||||
then
|
|
||||||
schematic_data = schem
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
local pos = settlement_info[i]["pos"]
|
|
||||||
if settlement_info[i]["rotat"] == "0" or settlement_info[i]["rotat"] == "180"
|
|
||||||
then
|
|
||||||
fwidth = schematic_data["hwidth"]
|
|
||||||
fdepth = schematic_data["hdepth"]
|
|
||||||
else
|
|
||||||
fwidth = schematic_data["hdepth"]
|
|
||||||
fdepth = schematic_data["hwidth"]
|
|
||||||
end
|
|
||||||
fheight = schematic_data["hheight"] * 3 -- remove trees and leaves above
|
|
||||||
--
|
|
||||||
-- now that every info is available -> create platform and clear space above
|
|
||||||
--
|
|
||||||
for zi = 0,fdepth-1 do
|
|
||||||
for yi = 0,fheight do
|
|
||||||
for xi = 0,fwidth-1 do
|
|
||||||
if yi == 0 then
|
|
||||||
local p = {x=pos.x+xi, y=pos.y, z=pos.z+zi}
|
|
||||||
settlements.ground_lvm(p, pr)
|
|
||||||
else
|
|
||||||
--break --todo
|
|
||||||
-- write ground
|
|
||||||
local vi = va:index(pos.x+xi, pos.y+yi, pos.z+zi)
|
|
||||||
if data[vi] ~= c_air
|
|
||||||
--local node = minetest.get_node_or_nil({x=p5.x+xi, y=p5.y+yi, z=p5.z+zi})
|
|
||||||
--if node then
|
|
||||||
--if node.name ~= "air"
|
|
||||||
then
|
|
||||||
--minetest.swap_node({x=pos.x+xi, y=pos.y+yi, z=pos.z+zi},{name="air"})
|
|
||||||
data[vi] = c_air
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
-- function clear space above baseplate
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
function settlements.terraform(settlement_info, pr)
|
function settlements.terraform(settlement_info, pr)
|
||||||
local fheight
|
local fheight, fwidth, fdepth, schematic_data
|
||||||
local fwidth
|
|
||||||
local fdepth
|
|
||||||
local schematic_data
|
|
||||||
|
|
||||||
for i, built_house in ipairs(settlement_info) do
|
for i, built_house in ipairs(settlement_info) do
|
||||||
-- pick right schematic_info to current built_house
|
-- pick right schematic_info to current built_house
|
||||||
for j, schem in ipairs(schematic_table) do
|
for j, schem in ipairs(settlements.schematic_table) do
|
||||||
if settlement_info[i]["name"] == schem["name"]
|
if settlement_info[i]["name"] == schem["name"] then
|
||||||
then
|
schematic_data = schem
|
||||||
schematic_data = schem
|
break
|
||||||
break
|
end
|
||||||
end
|
end
|
||||||
end
|
local pos = settlement_info[i]["pos"]
|
||||||
local pos = settlement_info[i]["pos"]
|
if settlement_info[i]["rotat"] == "0" or settlement_info[i]["rotat"] == "180" then
|
||||||
if settlement_info[i]["rotat"] == "0" or settlement_info[i]["rotat"] == "180"
|
fwidth = schematic_data["hwidth"]
|
||||||
then
|
fdepth = schematic_data["hdepth"]
|
||||||
fwidth = schematic_data["hwidth"]
|
else
|
||||||
fdepth = schematic_data["hdepth"]
|
fwidth = schematic_data["hdepth"]
|
||||||
else
|
fdepth = schematic_data["hwidth"]
|
||||||
fwidth = schematic_data["hdepth"]
|
end
|
||||||
fdepth = schematic_data["hwidth"]
|
--fheight = schematic_data["hheight"] * 3 -- remove trees and leaves above
|
||||||
end
|
fheight = schematic_data["hheight"] -- remove trees and leaves above
|
||||||
--fheight = schematic_data["hheight"] * 3 -- remove trees and leaves above
|
--
|
||||||
fheight = schematic_data["hheight"] -- remove trees and leaves above
|
-- now that every info is available -> create platform and clear space above
|
||||||
--
|
--
|
||||||
-- now that every info is available -> create platform and clear space above
|
for xi = 0,fwidth-1 do
|
||||||
--
|
for zi = 0,fdepth-1 do
|
||||||
for xi = 0,fwidth-1 do
|
for yi = 0,fheight *3 do
|
||||||
for zi = 0,fdepth-1 do
|
if yi == 0 then
|
||||||
for yi = 0,fheight *3 do
|
local p = {x=pos.x+xi, y=pos.y, z=pos.z+zi}
|
||||||
if yi == 0 then
|
settlements.ground(p, pr)
|
||||||
local p = {x=pos.x+xi, y=pos.y, z=pos.z+zi}
|
else
|
||||||
settlements.ground(p, pr)
|
-- write ground
|
||||||
else
|
local p = {x=pos.x+xi, y=pos.y+yi, z=pos.z+zi}
|
||||||
-- write ground
|
minetest.forceload_block(p)
|
||||||
local p = {x=pos.x+xi, y=pos.y+yi, z=pos.z+zi}
|
local node = minetest.get_node_or_nil(p)
|
||||||
minetest.forceload_block(p)
|
if node and node.name ~= "air" then
|
||||||
local node = minetest.get_node_or_nil(p)
|
minetest.swap_node(p,{name="air"})
|
||||||
if node then
|
end
|
||||||
if node.name ~= "air"
|
end
|
||||||
then
|
end
|
||||||
minetest.swap_node(p,{name="air"})
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,20 +1,12 @@
|
||||||
-- eclipse debugging lines
|
|
||||||
--require("debugger")(idehost, ideport, idekey)
|
|
||||||
|
|
||||||
--zerobrane debugging lines
|
|
||||||
--package.cpath = package.cpath .. ";/usr/share/lua/5.2/?.so"
|
|
||||||
--package.path = package.path .. ";/usr/share/zbstudio/lualibs/mobdebug/?.lua"
|
|
||||||
--require('mobdebug').start()
|
|
||||||
|
|
||||||
settlements = {}
|
settlements = {}
|
||||||
settlements.modpath = minetest.get_modpath("mcl_villages");
|
settlements.modpath = minetest.get_modpath("mcl_villages")
|
||||||
|
|
||||||
dofile(settlements.modpath.."/const.lua")
|
dofile(settlements.modpath.."/const.lua")
|
||||||
dofile(settlements.modpath.."/utils.lua")
|
dofile(settlements.modpath.."/utils.lua")
|
||||||
dofile(settlements.modpath.."/foundation.lua")
|
dofile(settlements.modpath.."/foundation.lua")
|
||||||
dofile(settlements.modpath.."/buildings.lua")
|
dofile(settlements.modpath.."/buildings.lua")
|
||||||
dofile(settlements.modpath.."/paths.lua")
|
dofile(settlements.modpath.."/paths.lua")
|
||||||
dofile(settlements.modpath.."/convert_lua_mts.lua")
|
--dofile(settlements.modpath.."/convert_lua_mts.lua")
|
||||||
--
|
--
|
||||||
-- load settlements on server
|
-- load settlements on server
|
||||||
--
|
--
|
||||||
|
@ -55,42 +47,20 @@ end
|
||||||
-- on map generation, try to build a settlement
|
-- on map generation, try to build a settlement
|
||||||
--
|
--
|
||||||
local function build_a_settlement_no_delay(minp, maxp, blockseed)
|
local function build_a_settlement_no_delay(minp, maxp, blockseed)
|
||||||
local settlement_info
|
|
||||||
local pr = PseudoRandom(blockseed)
|
local pr = PseudoRandom(blockseed)
|
||||||
--
|
|
||||||
-- fill settlement_info with buildings and their data
|
-- fill settlement_info with buildings and their data
|
||||||
--
|
local settlement_info = settlements.create_site_plan(maxp, minp, pr)
|
||||||
if settlements.lvm == true then
|
|
||||||
-- get LVM of current chunk
|
|
||||||
local vm, data, va, emin, emax = settlements.getlvm(minp, maxp)
|
|
||||||
settlement_info = settlements.create_site_plan_lvm(maxp, minp, pr)
|
|
||||||
else
|
|
||||||
settlement_info = settlements.create_site_plan(maxp, minp, pr)
|
|
||||||
end
|
|
||||||
if not settlement_info then return end
|
if not settlement_info then return end
|
||||||
|
|
||||||
-- evaluate settlement_info and prepair terrain
|
-- evaluate settlement_info and prepair terrain
|
||||||
if settlements.lvm == true then
|
settlements.terraform(settlement_info, pr)
|
||||||
settlements.terraform_lvm(settlement_info, pr)
|
|
||||||
else
|
|
||||||
settlements.terraform(settlement_info, pr)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- evaluate settlement_info and build paths between buildings
|
-- evaluate settlement_info and build paths between buildings
|
||||||
if settlements.lvm == true then
|
settlements.paths(settlement_info)
|
||||||
settlements.paths_lvm(settlement_info, minp)
|
|
||||||
else
|
|
||||||
settlements.paths(settlement_info)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- evaluate settlement_info and place schematics
|
-- evaluate settlement_info and place schematics
|
||||||
if settlements.lvm == true then
|
settlements.place_schematics(settlement_info, pr)
|
||||||
vm:set_data(data)
|
|
||||||
settlements.place_schematics_lvm(settlement_info, pr)
|
|
||||||
vm:write_to_map(true)
|
|
||||||
else
|
|
||||||
settlements.place_schematics(settlement_info, pr)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- evaluate settlement_info and initialize furnaces and chests
|
-- evaluate settlement_info and initialize furnaces and chests
|
||||||
settlements.initialize_nodes(settlement_info, pr)
|
settlements.initialize_nodes(settlement_info, pr)
|
||||||
|
@ -112,126 +82,27 @@ minetest.register_on_generated(function(minp, maxp, blockseed)
|
||||||
-- don't build settlement underground
|
-- don't build settlement underground
|
||||||
if maxp.y < 0 then return end
|
if maxp.y < 0 then return end
|
||||||
|
|
||||||
-- don't build settlements too close to each other
|
|
||||||
--[[
|
|
||||||
local center_of_chunk = {
|
|
||||||
x=maxp.x-half_map_chunk_size,
|
|
||||||
y=maxp.y-half_map_chunk_size,
|
|
||||||
z=maxp.z-half_map_chunk_size
|
|
||||||
}
|
|
||||||
local dist_ok = settlements.check_distance_other_settlements(center_of_chunk)
|
|
||||||
if dist_ok == false then return end
|
|
||||||
]]
|
|
||||||
|
|
||||||
-- 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
|
||||||
|
|
||||||
|
-- new way - slow :(((((
|
||||||
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})
|
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:
|
-- 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})
|
-- minetest.after(3, ecb_build_a_settlement, nil, 1, 0, {minp = vector.new(minp), maxp=vector.new(maxp), blockseed=blockseed})
|
||||||
end)
|
end)
|
||||||
|
|
||||||
--
|
-- manually place villages
|
||||||
-- manually place buildings, for debugging only
|
if minetest.is_creative_enabled("") then
|
||||||
--
|
minetest.register_craftitem("mcl_villages:tool", {
|
||||||
minetest.register_craftitem("mcl_villages:tool", {
|
description = "mcl_villages build tool",
|
||||||
description = "mcl_villages build tool",
|
inventory_image = "default_tool_woodshovel.png",
|
||||||
inventory_image = "default_tool_woodshovel.png",
|
-- build ssettlement
|
||||||
|
on_place = function(itemstack, placer, pointed_thing)
|
||||||
--[[ Disable on_use for now.
|
if not pointed_thing.under then return end
|
||||||
-- build single house
|
local minp = vector.subtract( pointed_thing.under, half_map_chunk_size)
|
||||||
--
|
local maxp = vector.add( pointed_thing.under, half_map_chunk_size)
|
||||||
on_use = function(itemstack, placer, pointed_thing)
|
build_a_settlement_no_delay(minp, maxp, math.random(0,32767))
|
||||||
local center_surface = pointed_thing.under
|
end
|
||||||
if center_surface then
|
})
|
||||||
local building_all_info = {name = "blacksmith",
|
end
|
||||||
mts = schem_path.."blacksmith.mts",
|
|
||||||
hsize = 13,
|
|
||||||
max_num = 0.9,
|
|
||||||
rplc = "n"}
|
|
||||||
settlements.build_schematic(center_surface,
|
|
||||||
building_all_info["mts"],
|
|
||||||
building_all_info["rplc"],
|
|
||||||
building_all_info["name"])
|
|
||||||
|
|
||||||
-- settlements.convert_mts_to_lua()
|
|
||||||
-- settlements.mts_save()
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
--]]
|
|
||||||
--
|
|
||||||
-- build ssettlement
|
|
||||||
--
|
|
||||||
on_place = function(itemstack, placer, pointed_thing)
|
|
||||||
local pr = PseudoRandom(math.random(0,32767))
|
|
||||||
-- enable debug routines
|
|
||||||
local center_surface = pointed_thing.under
|
|
||||||
if center_surface then
|
|
||||||
local minp = {
|
|
||||||
x=center_surface.x-half_map_chunk_size,
|
|
||||||
y=center_surface.y-half_map_chunk_size,
|
|
||||||
z=center_surface.z-half_map_chunk_size
|
|
||||||
}
|
|
||||||
local maxp = {
|
|
||||||
x=center_surface.x+half_map_chunk_size,
|
|
||||||
y=center_surface.y+half_map_chunk_size,
|
|
||||||
z=center_surface.z+half_map_chunk_size
|
|
||||||
}
|
|
||||||
--
|
|
||||||
-- get LVM of current chunk
|
|
||||||
--
|
|
||||||
local vm, data, va, emin, emax = settlements.getlvm(minp, maxp)
|
|
||||||
--
|
|
||||||
-- fill settlement_info with buildings and their data
|
|
||||||
--
|
|
||||||
local start_time = os.time()
|
|
||||||
local settlement_info
|
|
||||||
if settlements.lvm == true then
|
|
||||||
settlement_info = settlements.create_site_plan_lvm(maxp, minp, pr)
|
|
||||||
else
|
|
||||||
settlement_info = settlements.create_site_plan(maxp, minp, pr)
|
|
||||||
end
|
|
||||||
if not settlement_info then return end
|
|
||||||
--
|
|
||||||
-- evaluate settlement_info and prepair terrain
|
|
||||||
--
|
|
||||||
if settlements.lvm == true then
|
|
||||||
settlements.terraform_lvm(settlement_info, pr)
|
|
||||||
else
|
|
||||||
settlements.terraform(settlement_info, pr)
|
|
||||||
end
|
|
||||||
|
|
||||||
--
|
|
||||||
-- evaluate settlement_info and build paths between buildings
|
|
||||||
--
|
|
||||||
if settlements.lvm == true then
|
|
||||||
settlements.paths_lvm(settlement_info, minp)
|
|
||||||
else
|
|
||||||
settlements.paths(settlement_info)
|
|
||||||
end
|
|
||||||
--
|
|
||||||
-- evaluate settlement_info and place schematics
|
|
||||||
--
|
|
||||||
if settlements.lvm == true then
|
|
||||||
vm:set_data(data)
|
|
||||||
settlements.place_schematics_lvm(settlement_info, pr)
|
|
||||||
vm:write_to_map(true)
|
|
||||||
else
|
|
||||||
settlements.place_schematics(settlement_info, pr)
|
|
||||||
end
|
|
||||||
|
|
||||||
--
|
|
||||||
-- evaluate settlement_info and initialize furnaces and chests
|
|
||||||
--
|
|
||||||
settlements.initialize_nodes(settlement_info, pr)
|
|
||||||
local end_time = os.time()
|
|
||||||
minetest.chat_send_all("Time ".. end_time - start_time)
|
|
||||||
--
|
|
||||||
--settlements.convert_mts_to_lua()
|
|
||||||
--settlements.mts_save()
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
|
@ -1,99 +1,6 @@
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- generate paths between buildings
|
-- generate paths between buildings
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
function settlements.paths_lvm(settlement_info, minp)
|
|
||||||
local c_grasspath = minetest.get_content_id("mcl_core:grass_path")
|
|
||||||
local starting_point
|
|
||||||
local end_point
|
|
||||||
local distance
|
|
||||||
--for k,v in pairs(settlement_info) do
|
|
||||||
starting_point = settlement_info[1]["pos"]
|
|
||||||
for o,p in pairs(settlement_info) do
|
|
||||||
|
|
||||||
end_point = settlement_info[o]["pos"]
|
|
||||||
if starting_point ~= end_point
|
|
||||||
then
|
|
||||||
-- loop until end_point is reched (distance == 0)
|
|
||||||
while true do
|
|
||||||
|
|
||||||
-- define surrounding pos to starting_point
|
|
||||||
local north_p = {x=starting_point.x+1, y=starting_point.y, z=starting_point.z}
|
|
||||||
local south_p = {x=starting_point.x-1, y=starting_point.y, z=starting_point.z}
|
|
||||||
local west_p = {x=starting_point.x, y=starting_point.y, z=starting_point.z+1}
|
|
||||||
local east_p = {x=starting_point.x, y=starting_point.y, z=starting_point.z-1}
|
|
||||||
-- measure distance to end_point
|
|
||||||
local dist_north_p_to_end = math.sqrt(
|
|
||||||
((north_p.x - end_point.x)*(north_p.x - end_point.x))+
|
|
||||||
((north_p.z - end_point.z)*(north_p.z - end_point.z))
|
|
||||||
)
|
|
||||||
local dist_south_p_to_end = math.sqrt(
|
|
||||||
((south_p.x - end_point.x)*(south_p.x - end_point.x))+
|
|
||||||
((south_p.z - end_point.z)*(south_p.z - end_point.z))
|
|
||||||
)
|
|
||||||
local dist_west_p_to_end = math.sqrt(
|
|
||||||
((west_p.x - end_point.x)*(west_p.x - end_point.x))+
|
|
||||||
((west_p.z - end_point.z)*(west_p.z - end_point.z))
|
|
||||||
)
|
|
||||||
local dist_east_p_to_end = math.sqrt(
|
|
||||||
((east_p.x - end_point.x)*(east_p.x - end_point.x))+
|
|
||||||
((east_p.z - end_point.z)*(east_p.z - end_point.z))
|
|
||||||
)
|
|
||||||
-- evaluate which pos is closer to the end_point
|
|
||||||
if dist_north_p_to_end <= dist_south_p_to_end and
|
|
||||||
dist_north_p_to_end <= dist_west_p_to_end and
|
|
||||||
dist_north_p_to_end <= dist_east_p_to_end
|
|
||||||
then
|
|
||||||
starting_point = north_p
|
|
||||||
distance = dist_north_p_to_end
|
|
||||||
|
|
||||||
elseif dist_south_p_to_end <= dist_north_p_to_end and
|
|
||||||
dist_south_p_to_end <= dist_west_p_to_end and
|
|
||||||
dist_south_p_to_end <= dist_east_p_to_end
|
|
||||||
then
|
|
||||||
starting_point = south_p
|
|
||||||
distance = dist_south_p_to_end
|
|
||||||
|
|
||||||
elseif dist_west_p_to_end <= dist_north_p_to_end and
|
|
||||||
dist_west_p_to_end <= dist_south_p_to_end and
|
|
||||||
dist_west_p_to_end <= dist_east_p_to_end
|
|
||||||
then
|
|
||||||
starting_point = west_p
|
|
||||||
distance = dist_west_p_to_end
|
|
||||||
|
|
||||||
elseif dist_east_p_to_end <= dist_north_p_to_end and
|
|
||||||
dist_east_p_to_end <= dist_south_p_to_end and
|
|
||||||
dist_east_p_to_end <= dist_west_p_to_end
|
|
||||||
then
|
|
||||||
starting_point = east_p
|
|
||||||
distance = dist_east_p_to_end
|
|
||||||
end
|
|
||||||
-- find surface of new starting point
|
|
||||||
local surface_point, surface_mat = settlements.find_surface_lvm(starting_point, minp)
|
|
||||||
-- replace surface node with mcl_core:grass_path
|
|
||||||
if surface_point
|
|
||||||
then
|
|
||||||
local vi = va:index(surface_point.x, surface_point.y, surface_point.z)
|
|
||||||
data[vi] = c_grasspath
|
|
||||||
|
|
||||||
--minetest.swap_node(surface_point,{name="mcl_core:grass_path"})
|
|
||||||
-- don't set y coordinate, surface might be too low or high
|
|
||||||
starting_point.x = surface_point.x
|
|
||||||
starting_point.z = surface_point.z
|
|
||||||
end
|
|
||||||
if distance <= 1 or
|
|
||||||
starting_point == end_point
|
|
||||||
then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
--end
|
|
||||||
--return data
|
|
||||||
end
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
-- generate paths between buildings
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
function settlements.paths(settlement_info)
|
function settlements.paths(settlement_info)
|
||||||
local starting_point
|
local starting_point
|
||||||
local end_point
|
local end_point
|
||||||
|
@ -164,7 +71,11 @@ function settlements.paths(settlement_info)
|
||||||
-- replace surface node with mcl_core:grass_path
|
-- replace surface node with mcl_core:grass_path
|
||||||
if surface_point
|
if surface_point
|
||||||
then
|
then
|
||||||
minetest.swap_node(surface_point,{name="mcl_core:grass_path"})
|
if surface_mat == "mcl_core:sand" or surface_mat == "mcl_core:redsand" then
|
||||||
|
minetest.swap_node(surface_point,{name="mcl_core:sandstonesmooth2"})
|
||||||
|
else
|
||||||
|
minetest.swap_node(surface_point,{name="mcl_core:grass_path"})
|
||||||
|
end
|
||||||
-- don't set y coordinate, surface might be too low or high
|
-- don't set y coordinate, surface might be too low or high
|
||||||
starting_point.x = surface_point.x
|
starting_point.x = surface_point.x
|
||||||
starting_point.z = surface_point.z
|
starting_point.z = surface_point.z
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
mcl_villages = {}
|
|
||||||
|
|
||||||
local c_dirt_with_grass = minetest.get_content_id("mcl_core:dirt_with_grass")
|
local c_dirt_with_grass = minetest.get_content_id("mcl_core:dirt_with_grass")
|
||||||
local c_dirt_with_snow = minetest.get_content_id("mcl_core:dirt_with_grass_snow")
|
local c_dirt_with_snow = minetest.get_content_id("mcl_core:dirt_with_grass_snow")
|
||||||
--local c_dirt_with_dry_grass = minetest.get_content_id("mcl_core:dirt_with_dry_grass")
|
--local c_dirt_with_dry_grass = minetest.get_content_id("mcl_core:dirt_with_dry_grass")
|
||||||
|
@ -9,7 +7,7 @@ local c_desert_sand = minetest.get_content_id("mcl_core:redsand"
|
||||||
--local c_silver_sand = minetest.get_content_id("mcl_core:silver_sand")
|
--local c_silver_sand = minetest.get_content_id("mcl_core:silver_sand")
|
||||||
--
|
--
|
||||||
local c_air = minetest.get_content_id("air")
|
local c_air = minetest.get_content_id("air")
|
||||||
local c_snow = minetest.get_content_id("mcl_core:snowblock")
|
local c_snow = minetest.get_content_id("mcl_core:snow")
|
||||||
local c_fern_1 = minetest.get_content_id("mcl_flowers:fern")
|
local c_fern_1 = minetest.get_content_id("mcl_flowers:fern")
|
||||||
local c_fern_2 = minetest.get_content_id("mcl_flowers:fern")
|
local c_fern_2 = minetest.get_content_id("mcl_flowers:fern")
|
||||||
local c_fern_3 = minetest.get_content_id("mcl_flowers:fern")
|
local c_fern_3 = minetest.get_content_id("mcl_flowers:fern")
|
||||||
|
@ -43,56 +41,6 @@ function settlements.round(num, numDecimalPlaces)
|
||||||
return math.floor(num * mult + 0.5) / mult
|
return math.floor(num * mult + 0.5) / mult
|
||||||
end
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
-- function to find surface block y coordinate
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
function settlements.find_surface_lvm(pos, minp)
|
|
||||||
--ab hier altes verfahren
|
|
||||||
local p6 = vector.new(pos)
|
|
||||||
local surface_mat = {
|
|
||||||
c_dirt_with_grass,
|
|
||||||
c_dirt_with_snow,
|
|
||||||
--c_dirt_with_dry_grass,
|
|
||||||
c_podzol,
|
|
||||||
c_sand,
|
|
||||||
c_desert_sand
|
|
||||||
}
|
|
||||||
local cnt = 0
|
|
||||||
local itter -- count up or down
|
|
||||||
local cnt_max = 200
|
|
||||||
-- starting point for looking for surface
|
|
||||||
local vi = va:index(p6.x, p6.y, p6.z)
|
|
||||||
if data[vi] == nil then return nil end
|
|
||||||
local tmp = minetest.get_name_from_content_id(data[vi])
|
|
||||||
if data[vi] == c_air then
|
|
||||||
itter = -1
|
|
||||||
else
|
|
||||||
itter = 1
|
|
||||||
end
|
|
||||||
while cnt < cnt_max do
|
|
||||||
cnt = cnt+1
|
|
||||||
local vi = va:index(p6.x, p6.y, p6.z)
|
|
||||||
-- local tmp = minetest.get_name_from_content_id(data[vi])
|
|
||||||
-- if vi == nil
|
|
||||||
-- then
|
|
||||||
-- return nil
|
|
||||||
-- end
|
|
||||||
for i, mats in ipairs(surface_mat) do
|
|
||||||
local node_check = va:index(p6.x, p6.y+1, p6.z)
|
|
||||||
if node_check and vi and data[vi] == mats and
|
|
||||||
(data[node_check] ~= c_water_source and
|
|
||||||
data[node_check] ~= c_water_flowing
|
|
||||||
)
|
|
||||||
then
|
|
||||||
local tmp = minetest.get_name_from_content_id(data[node_check])
|
|
||||||
return p6, mats
|
|
||||||
end
|
|
||||||
end
|
|
||||||
p6.y = p6.y + itter
|
|
||||||
if p6.y < 0 then return nil end
|
|
||||||
end
|
|
||||||
return nil --]]
|
|
||||||
end
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- function to find surface block y coordinate
|
-- function to find surface block y coordinate
|
||||||
-- returns surface postion
|
-- returns surface postion
|
||||||
|
@ -169,79 +117,58 @@ end
|
||||||
-- check distance for new building
|
-- check distance for new building
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
function settlements.check_distance(settlement_info, building_pos, building_size)
|
function settlements.check_distance(settlement_info, building_pos, building_size)
|
||||||
local distance
|
local distance
|
||||||
for i, built_house in ipairs(settlement_info) do
|
for i, built_house in ipairs(settlement_info) do
|
||||||
distance = math.sqrt(
|
distance = math.sqrt(
|
||||||
((building_pos.x - built_house["pos"].x)*(building_pos.x - built_house["pos"].x))+
|
((building_pos.x - built_house["pos"].x)*(building_pos.x - built_house["pos"].x))+
|
||||||
((building_pos.z - built_house["pos"].z)*(building_pos.z - built_house["pos"].z)))
|
((building_pos.z - built_house["pos"].z)*(building_pos.z - built_house["pos"].z)))
|
||||||
if distance < building_size or
|
if distance < building_size or distance < built_house["hsize"] then
|
||||||
distance < built_house["hsize"]
|
|
||||||
then
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
-- save list of generated settlements
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
function settlements.save()
|
|
||||||
local file = io.open(minetest.get_worldpath().."/settlements.txt", "w")
|
|
||||||
if file then
|
|
||||||
file:write(minetest.serialize(settlements_in_world))
|
|
||||||
file:close()
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
-- load list of generated settlements
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
function settlements.load()
|
|
||||||
local file = io.open(minetest.get_worldpath().."/settlements.txt", "r")
|
|
||||||
if file then
|
|
||||||
local table = minetest.deserialize(file:read("*all"))
|
|
||||||
if type(table) == "table" then
|
|
||||||
return table
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return {}
|
|
||||||
end
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
-- check distance to other settlements
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
--[[
|
|
||||||
function settlements.check_distance_other_settlements(center_new_chunk)
|
|
||||||
-- local min_dist_settlements = 300
|
|
||||||
for i, pos in ipairs(settlements_in_world) do
|
|
||||||
local distance = vector.distance(center_new_chunk, pos)
|
|
||||||
-- minetest.chat_send_all("dist ".. distance)
|
|
||||||
if distance < settlements.min_dist_settlements then
|
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
]]
|
-------------------------------------------------------------------------------
|
||||||
|
-- save list of generated settlements
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
function settlements.save()
|
||||||
|
local file = io.open(minetest.get_worldpath().."/settlements.txt", "w")
|
||||||
|
if file then
|
||||||
|
file:write(minetest.serialize(settlements_in_world))
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
-- load list of generated settlements
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
function settlements.load()
|
||||||
|
local file = io.open(minetest.get_worldpath().."/settlements.txt", "r")
|
||||||
|
if file then
|
||||||
|
local table = minetest.deserialize(file:read("*all"))
|
||||||
|
if type(table) == "table" then
|
||||||
|
return table
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return {}
|
||||||
|
end
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- fill chests
|
-- fill chests
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
function settlements.fill_chest(pos, pr)
|
function settlements.fill_chest(pos, pr)
|
||||||
-- find chests within radius
|
-- initialize chest (mts chests don't have meta)
|
||||||
--local chestpos = minetest.find_node_near(pos, 6, {"mcl_core:chest"})
|
local meta = minetest.get_meta(pos)
|
||||||
local chestpos = pos
|
if meta:get_string("infotext") ~= "Chest" then
|
||||||
-- initialize chest (mts chests don't have meta)
|
-- For MineClone2 0.70 or before
|
||||||
local meta = minetest.get_meta(chestpos)
|
-- minetest.registered_nodes["mcl_chests:chest"].on_construct(pos)
|
||||||
if meta:get_string("infotext") ~= "Chest" then
|
--
|
||||||
-- For MineClone2 0.70 or before
|
-- For MineClone2 after commit 09ab1482b5 (the new entity chests)
|
||||||
-- minetest.registered_nodes["mcl_chests:chest"].on_construct(chestpos)
|
minetest.registered_nodes["mcl_chests:chest_small"].on_construct(pos)
|
||||||
--
|
end
|
||||||
-- For MineClone2 after commit 09ab1482b5 (the new entity chests)
|
-- fill chest
|
||||||
minetest.registered_nodes["mcl_chests:chest_small"].on_construct(chestpos)
|
local inv = minetest.get_inventory( {type="node", pos=pos} )
|
||||||
end
|
|
||||||
-- fill chest
|
local function get_treasures(pr)
|
||||||
local inv = minetest.get_inventory( {type="node", pos=chestpos} )
|
local loottable = {{
|
||||||
function mcl_villages.get_treasures(pr)
|
|
||||||
local loottable = {
|
|
||||||
{
|
|
||||||
stacks_min = 3,
|
stacks_min = 3,
|
||||||
stacks_max = 8,
|
stacks_max = 8,
|
||||||
items = {
|
items = {
|
||||||
|
@ -263,14 +190,13 @@ function settlements.fill_chest(pos, pr)
|
||||||
{ itemstring = "mobs_mc:gold_horse_armor", weight = 1 },
|
{ itemstring = "mobs_mc:gold_horse_armor", weight = 1 },
|
||||||
{ itemstring = "mobs_mc:diamond_horse_armor", weight = 1 },
|
{ itemstring = "mobs_mc:diamond_horse_armor", weight = 1 },
|
||||||
}
|
}
|
||||||
},
|
}}
|
||||||
}
|
|
||||||
local items = mcl_loot.get_multi_loot(loottable, pr)
|
local items = mcl_loot.get_multi_loot(loottable, pr)
|
||||||
return items
|
return items
|
||||||
end
|
end
|
||||||
|
|
||||||
local items = mcl_villages.get_treasures(pr)
|
local items = get_treasures(pr)
|
||||||
mcl_loot.fill_inventory(inv, "main", items)
|
mcl_loot.fill_inventory(inv, "main", items)
|
||||||
end
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
|
@ -315,23 +241,23 @@ end
|
||||||
local building_all_info
|
local building_all_info
|
||||||
function settlements.initialize_nodes(settlement_info, pr)
|
function settlements.initialize_nodes(settlement_info, pr)
|
||||||
for i, built_house in ipairs(settlement_info) do
|
for i, built_house in ipairs(settlement_info) do
|
||||||
for j, schem in ipairs(schematic_table) do
|
for j, schem in ipairs(settlements.schematic_table) do
|
||||||
if settlement_info[i]["name"] == schem["name"] then
|
if settlement_info[i]["name"] == schem["name"] then
|
||||||
building_all_info = schem
|
building_all_info = schem
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local width = building_all_info["hwidth"]
|
local width = building_all_info["hwidth"]
|
||||||
local depth = building_all_info["hdepth"]
|
local depth = building_all_info["hdepth"]
|
||||||
local height = building_all_info["hheight"]
|
local height = building_all_info["hheight"]
|
||||||
|
|
||||||
local p = settlement_info[i]["pos"]
|
local p = settlement_info[i]["pos"]
|
||||||
for yi = 1,height do
|
for yi = 1,height do
|
||||||
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 = minetest.get_node(ptemp)
|
||||||
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
|
||||||
|
@ -402,32 +328,11 @@ function settlements.evaluate_heightmap()
|
||||||
return height_diff
|
return height_diff
|
||||||
end
|
end
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
-- get LVM of current chunk
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
function settlements.getlvm(minp, maxp)
|
|
||||||
local vm = minetest.get_voxel_manip()
|
|
||||||
local emin, emax = vm:read_from_map(minp, maxp)
|
|
||||||
local va = VoxelArea:new{
|
|
||||||
MinEdge = emin,
|
|
||||||
MaxEdge = emax
|
|
||||||
}
|
|
||||||
local data = vm:get_data()
|
|
||||||
return vm, data, va, emin, emax
|
|
||||||
end
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
-- get LVM of current chunk
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
function settlements.setlvm(vm, data)
|
|
||||||
-- Write data
|
|
||||||
vm:set_data(data)
|
|
||||||
vm:write_to_map(true)
|
|
||||||
end
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
-- Set array to list
|
-- Set array to list
|
||||||
-- https://stackoverflow.com/questions/656199/search-for-an-item-in-a-lua-list
|
-- https://stackoverflow.com/questions/656199/search-for-an-item-in-a-lua-list
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
function settlements.Set (list)
|
function settlements.Set (list)
|
||||||
local set = {}
|
local set = {}
|
||||||
for _, l in ipairs(list) do set[l] = true end
|
for _, l in ipairs(list) do set[l] = true end
|
||||||
return set
|
return set
|
||||||
end
|
end
|
||||||
|
|
|
@ -130,6 +130,8 @@ mcl_superflat_classic (Classic superflat map generation) bool false
|
||||||
# game by a lot.
|
# game by a lot.
|
||||||
mcl_node_particles (Block particles detail level) enum none high,medium,low,none
|
mcl_node_particles (Block particles detail level) enum none high,medium,low,none
|
||||||
|
|
||||||
|
# If enabled, this will substitute a few blocks in village schematics so they blend into normal, snowy, and sandy areas. Defaults to false.
|
||||||
|
basic_pseudobiome_villages (Enables very basic, and experimental "pseudobiome-based" villages) bool false
|
||||||
|
|
||||||
# If enabled, will run an LBM to fix the top 1/2 of double plants in mcimported worlds; defaults to true.
|
# If enabled, will run an LBM to fix the top 1/2 of double plants in mcimported worlds; defaults to true.
|
||||||
fix_doubleplants (Mcimport double plant fixes) bool true
|
fix_doubleplants (Mcimport double plant fixes) bool true
|
||||||
|
|
Loading…
Reference in New Issue