Allow above ground dungeons, update mg_villages & cottages

master
Brandon 2015-11-29 14:19:23 -06:00
parent ba75b2a36f
commit 0b6844aa8d
18 changed files with 134 additions and 50 deletions

View File

@ -21,6 +21,8 @@ movement_liquid_fluidity_smooth = 0.5
movement_liquid_sink = 15
movement_gravity = 9.75
fall_bobbing_amount = 1.0
#
# Mapgen Stuff
#
@ -28,7 +30,7 @@ movement_gravity = 9.75
cloud_height = 160
mg_flags = trees, caves, dungeons, light
enable_floating_dungeons = false
enable_floating_dungeons = true
mgv7_spflags = mountains, ridges
mgv7_np_terrain_base = 4, 70, (600, 600, 600), 82341, 5, 0.6, 2.0

View File

@ -1,6 +1,6 @@
abm_counter = 0
abm_timer = 0
abm_limit = 5
abm_limit = 999
abm_time_limit = 1
function abm_limiter()

View File

@ -10,16 +10,22 @@ local function adventuretest_globalstep(dtime)
default.player_globalstep(dtime)
default.leaf_globalstep(dtime)
energy_globalstep(dtime)
if minetest.setting_getbool("enable_damage") then
if hunger ~= nil then
hunger.global_step(dtime)
end
end
itemdrop_globalstep(dtime)
armor_globalstep(dtime)
wieldview_globalstep(dtime)
blacksmith_globalstep(dtime)
if blacksmith_globalstep ~= nil then
blacksmith_globalstep(dtime)
end
throwing_globalstep(dtime)
magic_globalstep(dtime)
mobs.global_step(dtime)
if mobs ~= nil then
mobs.global_step(dtime)
end
abm_globalstep(dtime)
--ambience_globalstep(dtime)
end

View File

@ -1,2 +1 @@
default
plants_lib
default

View File

@ -93,6 +93,11 @@ if( not( minetest.registered_nodes["default:tree"])) then
end
end
if( minetest.get_modpath("moreblocks")
and minetest.registered_nodes[ "moreblocks:slab_wood" ]) then
cottages.craftitem_slab_wood = "moreblocks:slab_wood";
end
if( not( minetest.registered_nodes["wool:white"])) then
cottages.craftitem_wool = "cottages:wool";
end

View File

@ -5,3 +5,4 @@ homedecor?
intllib?
trees?
wool?
moreblocks?

View File

@ -173,6 +173,16 @@ end
drawtype = "mesh",
mesh = "cottages_tub.obj",
tiles = {"cottages_barrel.png" },
selection_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5,-0.1, 0.5},
}},
collision_box = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5,-0.1, 0.5},
}},
groups = { tree = 1, snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2
},
is_ground_content = false,

View File

@ -188,7 +188,7 @@ minetest.register_abm({
})
minetest.register_abm({
nodenames = {"default:dirt_with_grass"},
nodenames = {"default:dirt_with_grass","default:dirt_with_snow"},
interval = 2,
chance = 20,
action = function(pos, node)

View File

@ -48,7 +48,7 @@ minetest.register_on_generated( function (minp, maxp, blockseed)
for k,v in ipairs(notify.dungeon) do
--print(minetest.pos_to_string(v))
-- find the size of this room
if v.y < 0 then
--if v.y < 0 then
local center = {x=v.x,y=v.y,z=v.z}
local ycheck = {x=center.x,y=center.y,z=center.z}
@ -137,7 +137,7 @@ minetest.register_on_generated( function (minp, maxp, blockseed)
local d = { mob = "mobs:dungeon_master", pos={x=center.x,y=(center.y+1),z=center.z} }
table.insert(spawn,d)
end
end
--end
end
vm:set_data(data)
vm:calc_lighting(emin,emax)

View File

@ -40,6 +40,10 @@ mg_villages.MAX_HEIGHT_TREATED = 200;
-- choose the debug level you want
mg_villages.DEBUG_LEVEL = mg_villages.DEBUG_LEVEL_NONE
-- if set to true (or anything else but nil or false), highlandpools by paramat (see
-- https://forum.minetest.net/viewtopic.php?t=8400) will be created
mg_villages.CREATE_HIGHLANDPOOLS = true
-- background image for the /vmap command
-- RealTest comes with a diffrent texture
if( minetest.get_modpath('grounds') and minetest.get_modpath('joiner_table')) then

View File

@ -66,6 +66,8 @@ dofile(mg_villages.modpath.."/fill_chest.lua")
-- terrain blending for individual houses
dofile(mg_villages.modpath.."/terrain_blend.lua")
-- highlandpools
dofile(mg_villages.modpath.."/highlandpools.lua")
-- the interface for the mapgen;
-- also takes care of spawning the player
dofile(mg_villages.modpath.."/mapgen.lua")

View File

@ -94,10 +94,11 @@ end
mg_villages.check_if_ground = function( ci )
-- pre-generate a list of no-ground-nodes for caching
if( #replacements_group.node_is_ground < 1 ) then
if( replacements_group.node_is_ground[ minetest.get_content_id('air')]==nil) then
local no_ground_nodes = {'air','ignore','default:sandstonebrick','default:cactus','default:wood','default:junglewood',
'default:pinewood','default:pinetree',
'default:pine_wood','default:pine_tree','default:acacia_wood','default:acacia_tree',
'ethereal:mushroom_pore','ethereal:mushroom_trunk','ethereal:bamboo', 'ethereal:mushroom'};
-- TODO: add all those other tree and leaf nodes that might be added by mapgen
for _,name in ipairs( no_ground_nodes ) do
replacements_group.node_is_ground[ minetest.get_content_id( name )] = false;
end
@ -137,12 +138,13 @@ end
-- sets evrything at x,z and above height target_height to air;
-- the area below gets filled up in a suitable way (i.e. dirt with grss - dirt - stone)
mg_villages.lower_or_raise_terrain_at_point = function( x, z, target_height, minp, maxp, vm, data, param2_data, a, cid, vh, treepos, has_artificial_snow, blend )
mg_villages.lower_or_raise_terrain_at_point = function( x, z, target_height, minp, maxp, vm, data, param2_data, a, cid, vh, treepos, has_artificial_snow, blend, force_ground, force_underground )
local surface_node = nil;
local has_snow = has_artificial_snow;
local tree = false;
local jtree = false;
local ptree = false;
local atree = false;
local old_height = maxp.y;
local y = maxp.y;
@ -183,6 +185,9 @@ mg_villages.lower_or_raise_terrain_at_point = function( x, z, target_height, min
-- pinetrees
elseif( ci == cid.c_ptree and data[a:index( x, y-1, z)]==cid.c_ptree) then
ptree = true;
-- acacia
elseif( ci == cid.c_atree and data[a:index( x, y-1, z)]==cid.c_atree) then
atree = true;
elseif( not( surface_node) and ci ~= cid.c_air and ci ~= cid.c_ignore and mg_villages.check_if_ground( ci ) == true) then
-- we have found a surface of some kind
surface_node = ci;
@ -216,7 +221,11 @@ mg_villages.lower_or_raise_terrain_at_point = function( x, z, target_height, min
end
local below_1 = cid.c_dirt;
local below_2 = cid.c_stone;
if( surface_node == cid.c_desert_sand ) then
if( force_ground and force_underground ) then
below_1 = force_ground;
below_2 = force_underground;
surface_node = below_1;
elseif( surface_node == cid.c_desert_sand ) then
below_1 = cid.c_desert_sand;
below_2 = cid.c_desert_stone;
elseif( surface_node == cid.c_sand ) then
@ -269,6 +278,9 @@ mg_villages.lower_or_raise_terrain_at_point = function( x, z, target_height, min
elseif( ptree and not( mg_villages.ethereal_trees ) and treepos) then
data[ a:index( x, target_height+1, z)] = cid.c_psapling
table.insert( treepos, {x=x, y=target_height+1, z=z, typ=2, snow=has_artificial_snow});
elseif( atree and not( mg_villages.ethereal_trees ) and treepos) then
data[ a:index( x, target_height+1, z)] = cid.c_asapling
table.insert( treepos, {x=x, y=target_height+1, z=z, typ=3, snow=has_artificial_snow});
elseif( has_snow ) then
data[ a:index( x, target_height+1, z)] = cid.c_snow;
end
@ -306,6 +318,20 @@ mg_villages.flatten_village_area = function( villages, minp, maxp, vm, data, par
for z = minp.z, maxp.z do
for x = minp.x, maxp.x do
for village_nr, village in ipairs(villages) do
local force_ground = nil;
local force_underground = nil;
if( village.village_type
and mg_villages.village_type_data[ village.village_type ]
and mg_villages.village_type_data[ village.village_type ].force_ground
and mg_villages.village_type_data[ village.village_type ].force_underground ) then
force_ground = minetest.get_content_id(mg_villages.village_type_data[ village.village_type ].force_ground);
force_underground = minetest.get_content_id(mg_villages.village_type_data[ village.village_type ].force_underground);
if( not( force_ground ) or force_ground < 0 or force_ground == cid.c_ignore
or not( force_underground ) or force_underground < 0 or force_underground == cid.c_ignore ) then
force_ground = nil;
force_underground = nil;
end
end
-- is village_nr the village that is the one that is relevant for this spot?
if( village_area[ x ][ z ][ 1 ] > 0
and village_area[ x ][ z ][ 1 ]==village_nr
@ -319,11 +345,11 @@ mg_villages.flatten_village_area = function( villages, minp, maxp, vm, data, par
if( village_area[ x ][ z ][ 2 ] > 0 ) then -- inside a village
mg_villages.lower_or_raise_terrain_at_point( x, z, village.vh, minp, maxp, vm, data, param2_data, a, cid, village.vh,
nil, has_artificial_snow, 0 );
nil, has_artificial_snow, 0, force_ground, force_underground );
elseif( mg_villages.ENABLE_TERRAIN_BLEND and village_area[ x ][ z ][ 2 ] < 0) then
mg_villages.lower_or_raise_terrain_at_point( x, z, maxp.y, minp, maxp, vm, data, param2_data, a, cid, village.vh,
treepos, has_artificial_snow, -1* village_area[ x ][ z ][ 2 ]);
treepos, has_artificial_snow, -1* village_area[ x ][ z ][ 2 ],
force_ground, force_underground);
end
end -- PM ^
end
@ -337,6 +363,8 @@ mg_villages.flatten_village_area = function( villages, minp, maxp, vm, data, par
plant_id = cid.c_sapling;
elseif( tree.typ == 2 ) then
plant_id = cid.c_psapling;
elseif( tree.typ == 3 ) then
plant_id = cid.c_asapling;
end
mg_villages.grow_a_tree( {x=tree.x, y=tree.y, z=tree.z}, plant_id, minp, maxp, data, a, cid, nil, tree.snow ) -- no pseudorandom present
end
@ -692,9 +720,13 @@ mg_villages.grow_a_tree = function( pos, plant_id, minp, maxp, data, a, cid, pr,
mg_villages.grow_jungletree( data, a, pos, math.random(1,100000), snow)
return true;
-- a pine tree
elseif( plant_id == cid.c_psapling and minetest.registered_nodes[ 'default:pinetree']) then
elseif( plant_id == cid.c_psapling and minetest.registered_nodes[ 'default:pine_tree']) then
mg_villages.grow_pinetree( data, a, pos, snow);
return true;
-- an acacia tree; it does not have its own grow function
elseif( plant_id == cid.c_asapling and minetest.registered_nodes[ 'default:acacia_tree']) then
data[ a:index( pos.x, pos.y, pos.z )] = cid.c_asapling;
return true;
-- a savannatree from the mg mod
elseif( plant_id == cid.c_savannasapling and mg_villages.add_savannatree) then
mg_villages.add_savannatree( data, a, pos.x, pos.y, pos.z, minp, maxp, pr) -- TODO: snow
@ -842,7 +874,7 @@ mg_villages.save_data = function()
end
mg_villages.place_villages_via_voxelmanip = function( villages, minp, maxp, vm, data, param2_data, a, top )
mg_villages.place_villages_via_voxelmanip = function( villages, minp, maxp, vm, data, param2_data, a, top, seed )
local t1 = minetest.get_us_time();
local cid = {}
@ -861,8 +893,10 @@ mg_villages.place_villages_via_voxelmanip = function( villages, minp, maxp, vm,
cid.c_sapling = minetest.get_content_id( 'default:sapling');
cid.c_jtree = minetest.get_content_id( 'default:jungletree');
cid.c_jsapling = minetest.get_content_id( 'default:junglesapling');
cid.c_ptree = minetest.get_content_id( 'default:pinetree');
cid.c_ptree = minetest.get_content_id( 'default:pine_tree');
cid.c_psapling = minetest.get_content_id( 'default:pine_sapling');
cid.c_atree = minetest.get_content_id( 'default:acacia_tree');
cid.c_asapling = minetest.get_content_id( 'default:acacia_sapling');
cid.c_water = minetest.get_content_id( 'default:water_source'); -- PM ^
cid.c_stone_with_coal = minetest.get_content_id( 'default:stone_with_coal');
cid.c_sandstone = minetest.get_content_id( 'default:sandstone');
@ -907,6 +941,8 @@ mg_villages.place_villages_via_voxelmanip = function( villages, minp, maxp, vm,
if( not( village.artificial_snow ) and village.vs > 15) then
if( mg_villages.artificial_snow_probability and math.random( 1, mg_villages.artificial_snow_probability )==1
-- forbid artificial snow for some village types
and not( mg_villages.village_type_data[ village.village_type ].no_snow )
and minetest.registered_nodes['default:snow']) then
village.artificial_snow = 1;
else
@ -1027,6 +1063,11 @@ mg_villages.place_villages_via_voxelmanip = function( villages, minp, maxp, vm,
mg_villages.village_area_fill_with_plants( village_area, villages, tmin, tmax, data, param2_data, a, cid );
t1 = time_elapsed( t1, 'fill_with_plants' );
if( mg_villages.CREATE_HIGHLANDPOOLS ) then
mg_villages.do_highlandpools(minp, maxp, seed, vm, a, data, village_area);
end
t1 = time_elapsed( t1, 'create highlandpools' );
vm:set_data(data)
vm:set_param2_data(param2_data)
t1 = time_elapsed( t1, 'vm data set' );
@ -1160,7 +1201,7 @@ minetest.register_on_generated(function(minp, maxp, seed)
end
if( villages and #villages > 0 ) then
mg_villages.place_villages_via_voxelmanip( villages, minp, maxp, nil, nil, nil, nil, nil );
mg_villages.place_villages_via_voxelmanip( villages, minp, maxp, nil, nil, nil, nil, nil, seed );
end
end)

View File

@ -7,12 +7,19 @@ minetest.register_node("mg_villages:road", {
sounds = default.node_sound_dirt_defaults({
footstep = {name="default_gravel_footstep", gain=0.5},
dug = {name="default_gravel_footstep", gain=1.0},
}),
}),
paramtype = "light",
paramtype2 = "facedir",
drawtype = "nodebox",
node_box = {
type = "fixed",
fixed = { { -0.5, -0.5, -0.5, 0.5, 0.5-2/16, 0.5}, },
},
})
mg_villages.road_node = minetest.get_content_id( 'mg_villages:road' );
-- do not drop snow on roads
if( minetest.get_modpath('moresnow' )) then
if( moresnow ) then
moresnow.snow_cover[ mg_villages.road_node ] = moresnow.c_air;
end

View File

@ -10,17 +10,19 @@ mg_villages.get_town_id_at_pos = function( pos )
local node = minetest.get_node( pos );
-- leaves can be digged in villages
if( node
and node.name
and minetest.registered_nodes[ node.name ]
and minetest.registered_nodes[ node.name ].groups
and minetest.registered_nodes[ node.name ].groups.leaves ) then
return nil;
-- bones can be digged in villages
elseif( node
and node.name
and node.name == 'bones:bones' ) then
return nil;
if( node and node.name ) then
if( minetest.registered_nodes[ node.name ]
and minetest.registered_nodes[ node.name ].groups
and minetest.registered_nodes[ node.name ].groups.leaves ) then
return nil;
elseif( node.name=='default:snow' ) then
return nil;
-- bones can be digged in villages
elseif( node.name == 'bones:bones' ) then
return nil;
else
return id;
end
else
return id;
end
@ -289,7 +291,7 @@ end
mg_villages.form_input_handler = function( player, formname, fields)
mg_villages.print(mg_villages.DEBUG_LEVEL_NORMAL,minetest.serialize(fields));
-- mg_villages.print(mg_villages.DEBUG_LEVEL_NORMAL,minetest.serialize(fields));
if( not( mg_villages.ENABLE_PROTECTION )) then
return false;
end

View File

@ -168,8 +168,10 @@ end
mg_villages.replace_tree_trunk = function( replacements, wood_type )
if( wood_type == 'default:junglewood' ) then
table.insert( replacements, {'default:tree', 'default:jungletree'});
elseif( wood_type == 'default:pinewood' ) then
table.insert( replacements, {'default:tree', 'default:pinetree'});
elseif( wood_type == 'default:pine_wood' ) then
table.insert( replacements, {'default:tree', 'default:pine_tree'});
elseif( wood_type == 'default:acacia_wood' ) then
table.insert( replacements, {'default:tree', 'default:acacia_tree'});
elseif( wood_type == 'mg:savannawood' ) then
table.insert( replacements, {'default:tree', 'mg:savannatree'});
elseif( wood_type == 'mg:pinewood' ) then
@ -266,8 +268,10 @@ end
mg_villages.replace_saplings = function( replacements, wood_type )
if( wood_type == 'default:junglewood' ) then
table.insert( replacements, {'default:sapling', 'default:junglesapling'});
elseif( wood_type == 'default:pinewood' ) then
elseif( wood_type == 'default:pine_wood' ) then
table.insert( replacements, {'default:sapling', 'default:pine_sapling'});
elseif( wood_type == 'default:acacia_wood' ) then
table.insert( replacements, {'default:sapling', 'default:acacia_sapling'});
elseif( wood_type == 'mg:savannawood' ) then
table.insert( replacements, {'default:sapling', 'mg:savannasapling'});
elseif( wood_type == 'mg:pinewood' ) then
@ -374,7 +378,7 @@ mg_villages.replacements_taoki = function( housetype, pr, replacements )
wood_type = mg_villages.replace_materials( replacements, pr,
{'default:wood'},
{''},
{'default:wood', 'default:junglewood', 'default:pinewood', 'mg:pinewood', 'mg:savannawood',
{'default:wood', 'default:junglewood', 'default:pine_wood', 'default:acacia_wood', 'mg:pinewood', 'mg:savannawood',
'default:clay', 'default:brick', 'default:sandstone',
'default:stonebrick', 'default:desert_stonebrick','default:sandstonebrick', 'default:sandstone','default:stone','default:desert_stone',
'default:coalblock','default:steelblock','default:goldblock', 'default:bronzeblock', 'default:copperblock', 'wool:white',
@ -400,7 +404,7 @@ mg_villages.replacements_taoki = function( housetype, pr, replacements )
mg_villages.replace_materials( replacements, pr,
{'stairs:stair_wood'},
{'stairs:stair_'},
{'stonebrick', 'stone', 'sandstone', 'cobble', 'wood', 'junglewood', 'pinewood' },
{'stonebrick', 'stone', 'sandstone', 'cobble', 'wood', 'junglewood', 'pine_wood', 'acaica_wood' },
'wood');
-- brick roofs are a bit odd; but then...
@ -408,7 +412,7 @@ mg_villages.replacements_taoki = function( housetype, pr, replacements )
mg_villages.replace_materials( replacements, pr,
{'stairs:stair_brick', 'stairs:slab_brick', 'default:brick'},
{'stairs:stair_', 'stairs:slab_', 'default:' },
{ 'brick', 'stone', 'cobble', 'stonebrick', 'wood', 'junglewood', 'pinewood', 'sandstone' },
{ 'brick', 'stone', 'cobble', 'stonebrick', 'wood', 'junglewood', 'pine_wood', 'acacia_wood', 'sandstone' },
'brick' );
return replacements;
@ -429,7 +433,7 @@ mg_villages.replacements_nore = function( housetype, pr, replacements )
local wood_type = mg_villages.replace_materials( replacements, pr,
{'default:wood'},
{''},
{ 'default:wood', 'default:junglewood', 'default:pinewood', 'mg:savannawood', 'mg:pinewood' },
{ 'default:wood', 'default:junglewood', 'default:pine_wood', 'default:acacia_wood', 'mg:savannawood', 'mg:pinewood' },
'default:wood');
mg_villages.replace_tree_trunk( replacements, wood_type );
mg_villages.replace_saplings( replacements, wood_type );
@ -451,7 +455,7 @@ mg_villages.replacements_lumberjack = function( housetype, pr, replacements )
local wood_type = mg_villages.replace_materials( replacements, pr,
{'default:wood'},
{''},
{ 'default:wood', 'default:junglewood', 'default:pinewood', 'mg:savannawood', 'mg:pinewood' },
{ 'default:wood', 'default:junglewood', 'default:pine_wood', 'default:acacia_wood', 'mg:savannawood', 'mg:pinewood' },
'default:wood');
mg_villages.replace_tree_trunk( replacements, wood_type );
mg_villages.replace_saplings( replacements, wood_type );
@ -539,7 +543,7 @@ mg_villages.replacements_chateau = function( housetype, pr, replacements )
local wood_type = mg_villages.replace_materials( replacements, pr,
{'default:wood'},
{''},
{ 'default:wood', 'default:junglewood', 'default:pinewood', 'mg:savannawood', 'mg:pinewood'}, --, 'default:brick', 'default:sandstone', 'default:desert_cobble' },
{ 'default:wood', 'default:junglewood', 'default:pine_wood', 'default:acacia_wood', 'mg:savannawood', 'mg:pinewood'}, --, 'default:brick', 'default:sandstone', 'default:desert_cobble' },
'default:wood');
mg_villages.replace_tree_trunk( replacements, wood_type );
mg_villages.replace_saplings( replacements, wood_type );
@ -713,7 +717,7 @@ mg_villages.replacements_medieval = function( housetype, pr, replacements )
-- loam and clay are mentioned multiple times because those are the most likely building materials in reality
local materials = {'cottages:loam', 'cottages:loam', 'cottages:loam', 'cottages:loam', 'cottages:loam',
'default:clay', 'default:clay', 'default:clay', 'default:clay', 'default:clay',
'default:wood','default:junglewood', 'default:pinewood', 'default:sandstone',
'default:wood','default:junglewood', 'default:pine_wood', 'default:acacia_wood', 'default:sandstone',
'default:desert_stone','default:brick','default:cobble','default:stonebrick',
'default:desert_stonebrick','default:sandstonebrick','default:stone',
'mg:savannawood', 'mg:savannawood', 'mg:savannawood', 'mg:savannawood',

View File

@ -127,7 +127,7 @@ mg_villages.grow_pinetree = function(data, a, pos, snow)
local c_air = minetest.get_content_id("air")
local c_ignore = minetest.get_content_id("ignore")
local c_pinetree = minetest.get_content_id("default:pinetree")
local c_pinetree = minetest.get_content_id("default:pine_tree")
local c_pine_needles = minetest.get_content_id("default:pine_needles")
local c_snow = minetest.get_content_id("default:snow")
local c_snowblock = minetest.get_content_id("default:snowblock")

View File

@ -48,7 +48,7 @@ mg_villages.villages_at_point = function(minp, noise1)
local height = pr:next(1, 5)
-- villages of a size >= 40 are always placed at a height of 1
if( size >= 40 ) then
height = 5;
height = 1;
-- slightly smaller but still relatively large villages have a deterministic height now as well
elseif( size >= 30 ) then
height = 40-height;
@ -813,7 +813,7 @@ mg_villages.house_in_one_mapchunk = function( minp, mapchunk_size, vnoise )
if( mg_villages.all_villages and mg_villages.all_villages[ village_id ] and mg_villages.all_villages[ village_id ].optimal_height) then
village.optimal_height = mg_villages.all_villages[ village_id ].optimal_height;
--village.vh = mg_villages.all_villages[ village_id ].optimal_height;
village.vh = mg_villages.all_villages[ village_id ].optimal_height;
village.artificial_snow = mg_villages.all_villages[ village_id ].artificial_snow;
end

View File

@ -58,7 +58,8 @@ minetest.register_abm({
nodenames = {"mobs:spawner"},
interval = 60,
chance = 5,
action = function(pos, node, active_object_count, active_object_count_wider)
action = function(pos, node, active_object_count, active_object_count_wider)
if abm_limiter() then return end
local meta = minetest.get_meta(pos)
local entity = meta:get_string("entity")
local active_objects = meta:get_int("active_objects")