From f1db3a156e1ac0f8bf688e22ed480956a66928ed Mon Sep 17 00:00:00 2001 From: Duane Date: Wed, 15 Jun 2016 12:37:27 -0500 Subject: [PATCH] Add asteroid belt. --- abms.lua | 38 +++++++++++++++++++ asteroids.lua | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++ mapgen.lua | 9 ++++- skyseagen.lua | 4 +- treegen.lua | 2 +- 5 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 asteroids.lua diff --git a/abms.lua b/abms.lua index 23f8861..0ac71a4 100644 --- a/abms.lua +++ b/abms.lua @@ -9,6 +9,7 @@ local hunger_delay = 60 local dps_count = hunger_delay -- maximum number of mobs near player in fortresses local fortress_mob_count = 5 +local players_in_orbit = {} local mushrooms = {"flowers:mushroom_brown", "flowers:mushroom_red"} local hunger_mod = minetest.get_modpath("hunger") @@ -109,6 +110,20 @@ minetest.register_globalstep(function(dtime) end end + if pos.y >= 11168 and pos.y <= 15168 then + if not players_in_orbit[player:get_player_name()] then + player:set_physics_override({gravity=0.1}) + player:set_sky("#000000", "plain", {}) + players_in_orbit[player:get_player_name()] = true + end + elseif players_in_orbit[player:get_player_name()] then + player:set_sky("#000000", "regular", {}) + minetest.after(20, function() + player:set_physics_override({gravity=1}) + end) + players_in_orbit[player:get_player_name()] = false + end + -- environmental damage if fun_caves.DEBUG and player:get_hp() < 20 then -- Regenerate the player while testing. @@ -221,6 +236,29 @@ minetest.register_abm({ -- creation ------------------------------------------------------------ +-- vacuum sucks +minetest.register_abm({ + nodenames = {"fun_caves:vacuum"}, + neighbors = {"air"}, + interval = fun_caves.time_factor, + chance = 1, + action = function(pos, node) + if pos.y <= 11168 or pos.y >= 15168 then + return + end + + local p1 = vector.subtract(pos, 1) + local p2 = vector.add(pos, 1) + local positions = minetest.find_nodes_in_area(p1, p2, {"air"}) + for _, p3 in pairs(positions) do + local node2 = minetest.get_node_or_nil(p3) + if node2 and node2.name == 'air' then + minetest.set_node(p3, {name = 'fun_caves:vacuum'}) + end + end + end +}) + -- fungal spread minetest.register_abm({ nodenames = fungal_tree_leaves, diff --git a/asteroids.lua b/asteroids.lua new file mode 100644 index 0000000..d7cb7f3 --- /dev/null +++ b/asteroids.lua @@ -0,0 +1,101 @@ +local max_depth = 31000 + + +newnode = fun_caves.clone_node("default:water_source") +newnode.description = "Water" +newnode.liquid_range = 0 +newnode.liquid_viscosity = 1 +newnode.liquid_renewable = false +newnode.liquid_renewable = false +newnode.liquid_alternative_flowing = "fun_caves:asteroid_water" +newnode.liquid_alternative_source = "fun_caves:asteroid_water" +newnode.drowning = 0 +newnode.light_source = 2 +newnode.sunlight_propagates = true +newnode.post_effect_color = {a = 50, r = 30, g = 60, b = 90}, +minetest.register_node("fun_caves:asteroid_water", newnode) + +bucket.liquids['fun_caves:asteroid_water'] = { + source = 'fun_caves:asteroid_water', + flowing = 'fun_caves:asteroid_water', + itemname = 'bucket:bucket_water', +} + +minetest.register_node("fun_caves:vacuum", { + description = "Vacuum", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + drawtype = "glasslike", + sunlight_propagates = true, + drowning = 1, + post_effect_color = {a = 20, r = 220, g = 200, b = 200}, + tiles = {'fun_caves_blank.png'}, + alpha = 0.1, + paramtype = "light", +}) + + +local asteroid_noise_1 = {offset = 0, scale = 1, seed = -7620, spread = {x = 40, y = 40, z = 40}, octaves = 3, persist = 1, lacunarity = 2} +local plant_noise = {offset = 0.0, scale = 1.0, spread = {x = 200, y = 200, z = 200}, seed = -2525, octaves = 3, persist = 0.7, lacunarity = 2.0} +local biome_noise = {offset = 0.0, scale = 1.0, spread = {x = 400, y = 400, z = 400}, seed = -1471, octaves = 3, persist = 0.5, lacunarity = 2.0} + +fun_caves.asteroids = function(minp, maxp, data, p2data, area, node) + if minp.y < 11168 or minp.y > 15168 then + return + end + + math.randomseed(minetest.get_us_time()) + local density = 4 + math.abs(minp.y - 13168) / 500 + local empty = false + if math.random(math.floor(density)) ~= 1 then + empty = true + --return + end + + local csize = vector.add(vector.subtract(maxp, minp), 1) + local map_max = {x = csize.x, y = csize.y, z = csize.z} + local map_min = {x = minp.x, y = minp.y, z = minp.z} + + local asteroid_1 = minetest.get_perlin_map(asteroid_noise_1, map_max):get3dMap_flat(map_min) + + local write = false + + local index = 0 + local index3d = 0 + for z = minp.z, maxp.z do + local dz = z - minp.z + for x = minp.x, maxp.x do + local dx = x - minp.x + index = index + 1 + index3d = (z - minp.z) * (csize.y) * csize.x + (x - minp.x) + 1 + local ivm = area:index(x, minp.y, z) + + for y = minp.y, maxp.y do + local dy = y - minp.y + if empty then + data[ivm] = node['fun_caves:vacuum'] + write = true + else + local dist2 = (40 - dy) ^ 2 + (40 - dx) ^ 2 + (40 - dz) ^ 2 + if dist2 < (40 - math.abs(asteroid_1[index3d]) * 30) ^ 2 then + data[ivm] = node['default:stone'] + write = true + elseif dist2 < 35 ^ 2 then + data[ivm] = node['fun_caves:asteroid_water'] + write = true + else + data[ivm] = node['fun_caves:vacuum'] + write = true + end + end + + ivm = ivm + area.ystride + index3d = index3d + csize.x + end + end + end + + return write +end diff --git a/mapgen.lua b/mapgen.lua index ecceee6..316327c 100644 --- a/mapgen.lua +++ b/mapgen.lua @@ -369,8 +369,12 @@ local function generate(p_minp, p_maxp, seed) end end - if minp.y > 12800 then + local aster = false + if minp.y > 17200 then -- nop + elseif minp.y > 11000 then + write = fun_caves.asteroids(minp, maxp, data, p2data, area, node) + aster = true elseif minp.y > 8400 then write = fun_caves.skysea(minp, maxp, data, p2data, area, node) elseif minp.y > 4000 then @@ -400,7 +404,7 @@ local function generate(p_minp, p_maxp, seed) -- set_lighting causes lighting artifacts, -- but corrects the light inside trees. vm:set_lighting({day = 0, night = 0}, minp, maxp) - vm:calc_lighting(minp, maxp) + vm:calc_lighting(minp, maxp, not aster) -- Does not work: --vm:calc_lighting({x=minp.x,y=emin.y,z=minp.z}, maxp) end @@ -418,6 +422,7 @@ local function generate(p_minp, p_maxp, seed) end +dofile(fun_caves.path .. "/asteroids.lua") dofile(fun_caves.path .. "/cavegen.lua") dofile(fun_caves.path .. "/cloudgen.lua") dofile(fun_caves.path .. "/decogen.lua") diff --git a/skyseagen.lua b/skyseagen.lua index 1bed6a1..4c23975 100644 --- a/skyseagen.lua +++ b/skyseagen.lua @@ -8,7 +8,7 @@ newnode.sunlight_propagates = true newnode.use_texture_alpha = true newnode.light_source = 14 newnode.walkable = false -newnode.buildable_to = true +newnode.buildable_to = false newnode.pointable = false minetest.register_node("fun_caves:airy", newnode) @@ -22,8 +22,6 @@ fun_caves.skysea = function(minp, maxp, data, p2data, area, node) end local csize = vector.add(vector.subtract(maxp, minp), 1) - local map_max = {x = csize.x, y = csize.y, z = csize.z} - local map_min = {x = minp.x, y = minp.y, z = minp.z} local terrain_1 = minetest.get_perlin_map(terrain_noise_1, {x=csize.x, y=csize.z}):get2dMap_flat({x=minp.x, y=minp.z}) local plant_n = minetest.get_perlin_map(plant_noise, {x=csize.x, y=csize.z}):get2dMap_flat({x=minp.x, y=minp.z}) diff --git a/treegen.lua b/treegen.lua index d6f18cf..ca2e2ff 100644 --- a/treegen.lua +++ b/treegen.lua @@ -58,7 +58,7 @@ minetest.register_node("fun_caves:leaves_special", newnode) newnode = fun_caves.clone_node("default:water_source") newnode.description = "Water" newnode.liquid_range = 0 -newnode.liquid_viscosity = 7 +newnode.liquid_viscosity = 1 newnode.liquid_renewable = false newnode.liquid_alternative_flowing = "fun_caves:weightless_water" newnode.liquid_alternative_source = "fun_caves:weightless_water"