diff --git a/LICENSE.txt b/LICENSE.txt index 293aacf..ffba6f0 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1498,6 +1498,11 @@ https://freesound.org/people/Rudmer_Rotteveel/sounds/590950/ - everness_water_geyser.1.ogg +**CC0-1.0, by Fission9**, https://freesound.org/people/Fission9/sounds/474850/ + +- everness_lava.1.ogg +- everness_lava.2.ogg + ### Models **CC-BY-SA-4.0, by SaKeL** diff --git a/api.lua b/api.lua index 108cd2f..75a95bc 100644 --- a/api.lua +++ b/api.lua @@ -969,6 +969,8 @@ end function Everness.register_ore(self, def) local _def = table.copy(def) + -- @TOTO using `ore` as name here will override the entry when there are multiple ore registrations for the same ore (different noise) + -- using indexed table would be more appropriate here local _name = _def.ore self.registered_ores[_name] = _def @@ -2154,3 +2156,20 @@ function Everness.add_to_queue_on_generated(self, def) table.insert(self.on_generated_queue, def) end + +function Everness.find_irecursive(table, c_id) + local found = false + + for i, v in ipairs(table) do + if type(v) == 'table' then + Everness.find_irecursive(v, c_id) + end + + if c_id == v then + found = true + break + end + end + + return found +end diff --git a/functions.lua b/functions.lua index 6ce9d85..08bcb2a 100644 --- a/functions.lua +++ b/functions.lua @@ -922,6 +922,144 @@ Everness:register_abm({ end }) +-- Lava spitting +Everness:register_abm({ + label = 'everness:lava_spitting', + description = 'Lava bursts in to air.', + nodenames = { 'everness:lava_source' }, + neighbors = { 'air' }, + interval = 10, + chance = 200, + catch_up = false, + action = function(pos, node) + local burst_colors = { + '#FF5400', + '#DD2005' + } + local partcile_time = math.random(3, 5) + + -- particles + local particlespawner_def = { + amount = 10, + time = partcile_time, + minpos = vector.new(pos.x - 0.1, pos.y + 0.5, pos.z - 0.1), + maxpos = vector.new(pos.x + 0.1, pos.y + 1, pos.z + 0.1), + minvel = vector.new(0, 1, 0), + maxvel = vector.new(0, 3, 0), + minacc = vector.new(0, -3, 0), + maxacc = vector.new(0, -6, 0), + minexptime = 3, + maxexptime = 5, + minsize = 3, + maxsize = 10, + texture = ('everness_water_geyser_particle.png^[multiply:%s'):format(burst_colors[math.random(1, #burst_colors)]), + vertical = true, + collisiondetection = true, + collision_removal = true + } + local particlespawner_def2 = { + amount = 40, + time = partcile_time, + minpos = vector.new(pos.x, pos.y + 0.5, pos.z), + maxpos = vector.new(pos.x, pos.y + 1, pos.z), + minvel = vector.new(0, 1, 0), + maxvel = vector.new(0, 3, 0), + minacc = vector.new(-1, -3, -1), + maxacc = vector.new(1, -6, 1), + minexptime = 3, + maxexptime = 5, + minsize = 3, + maxsize = 10, + node = node, + vertical = true, + collisiondetection = true, + collision_removal = true + } + + if minetest.has_feature({ dynamic_add_media_table = true, particlespawner_tweenable = true }) then + -- new syntax, above v5.6.0 + particlespawner_def = { + amount = 10, + time = partcile_time, + size = { + min = 1, + max = 2, + }, + exptime = { + min = 3, + max = 5 + }, + pos = { + min = vector.new(pos.x - 0.1, pos.y + 0.5, pos.z - 0.1), + max = vector.new(pos.x + 0.1, pos.y + 1, pos.z + 0.1) + }, + vel = { + min = vector.new(0, 1, 0), + max = vector.new(0, 3, 0) + }, + acc = { + min = vector.new(0, -3, 0), + max = vector.new(0, -6, 0) + }, + texture = { + name = ('everness_water_geyser_particle.png^[multiply:%s'):format(burst_colors[math.random(1, #burst_colors)]), + scale_tween = { + 10, 3, + style = 'fwd', + reps = 1 + } + }, + vertical = true, + collisiondetection = true, + collision_removal = true + } + + particlespawner_def2 = { + amount = 40, + time = partcile_time, + size = { + min = 1, + max = 2, + }, + exptime = { + min = 3, + max = 5 + }, + pos = { + min = vector.new(pos.x, pos.y + 0.5, pos.z), + max = vector.new(pos.x, pos.y + 1, pos.z) + }, + vel = { + min = vector.new(0, 1, 0), + max = vector.new(0, 3, 0) + }, + acc = { + min = vector.new(-1, -3, -1), + max = vector.new(1, -6, 1) + }, + node = node, + vertical = true, + collisiondetection = true, + collision_removal = true + } + end + + if math.random(0, 100) <=50 then + minetest.add_particlespawner(particlespawner_def2) + else + minetest.add_particlespawner(particlespawner_def) + end + + minetest.sound_play({ + name = 'everness_lava', + gain = 1.0 + }, { + pos = pos, + max_hear_distance = 32 + }) + end +}) + -- Generate bamboo tops after mineral waters biome generates decorations Everness:register_lbm({ -- Descriptive label for profiling purposes (optional). diff --git a/init.lua b/init.lua index 12b7dfa..2db322c 100644 --- a/init.lua +++ b/init.lua @@ -35,6 +35,7 @@ dofile(path .. '/bamboo.lua') dofile(path .. '/functions.lua') dofile(path .. '/trees.lua') dofile(path .. '/vines.lua') +dofile(path .. '/vines_wall.lua') dofile(path .. '/chests.lua') dofile(path .. '/torches.lua') diff --git a/mapgen_after.lua b/mapgen_after.lua index 3ae35e4..49f336a 100644 --- a/mapgen_after.lua +++ b/mapgen_after.lua @@ -87,7 +87,7 @@ minetest.register_on_generated(function(minp, maxp, blockseed) for _, def in ipairs(Everness.on_generated_queue) do if def.can_run(biomemap) and def.after_write_to_map then shared_args[def.name] = shared_args[def.name] or {} - def.after_write_to_map(shared_args[def.name], gennotify) + def.after_write_to_map(shared_args[def.name], gennotify, rand) end end diff --git a/mapgen_mineral_waters.lua b/mapgen_mineral_waters.lua index 4e45ce6..bc6599c 100644 --- a/mapgen_mineral_waters.lua +++ b/mapgen_mineral_waters.lua @@ -246,23 +246,6 @@ local size = { x = 7, y = 16, z = 9 } local size_x = math.round(size.x / 2) local size_z = math.round(size.z / 2) -local function find_irecursive(table, c_id) - local found = false - - for i, v in ipairs(table) do - if type(v) == 'table' then - find_irecursive(v, c_id) - end - - if c_id == v then - found = true - break - end - end - - return found -end - local function place_decoration(pos, vm, area, data, deco_id, callback) local deco_def = minetest.registered_decorations[deco_id] @@ -394,14 +377,14 @@ Everness:add_to_queue_on_generated({ -- Check for water and build nodes before replacing, this will make pools connected and will not replace already built walls from another pool near by if hi == 1 and current_c_id ~= c_everness_mineral_water_source - and not find_irecursive(pool_build_nodes, current_c_id) + and not Everness.find_irecursive(pool_build_nodes, current_c_id) then -- build pool floor data[ai_cub] = mineral_stone elseif hi ~= 1 and (wi == 1 or wi == width) and current_c_id ~= c_everness_mineral_water_source - and not find_irecursive(pool_build_nodes, current_c_id) + and not Everness.find_irecursive(pool_build_nodes, current_c_id) then -- build pool wall data[ai_cub] = mineral_stone @@ -409,7 +392,7 @@ Everness:add_to_queue_on_generated({ and (li == 1 or li == length) and (wi ~= 1 or wi ~= width) and current_c_id ~= c_everness_mineral_water_source - and not find_irecursive(pool_build_nodes, current_c_id) + and not Everness.find_irecursive(pool_build_nodes, current_c_id) then -- build pool wall data[ai_cub] = mineral_stone diff --git a/mapgen_mineral_waters_under.lua b/mapgen_mineral_waters_under.lua index e38252a..e2358e0 100644 --- a/mapgen_mineral_waters_under.lua +++ b/mapgen_mineral_waters_under.lua @@ -25,7 +25,10 @@ local y_min = Everness.settings.biomes.everness_mineral_waters_under.y_min Everness:register_biome({ name = 'everness:mineral_waters_under', - node_cave_liquid = 'air', + node_stone = 'everness:mineral_cave_stone', + node_filler = 'everness:mineral_cave_stone', + node_cave_liquid = 'everness:lava_source', + node_water = 'air', node_dungeon = 'everness:mineral_stone_brick', node_dungeon_alt = 'everness:mineral_stone_brick_with_growth', node_dungeon_stair = 'stairs:stair_mineral_stone_brick', @@ -40,13 +43,40 @@ Everness:register_biome({ -- Ores -- +minetest.register_on_mods_loaded(function() + local c_mapgen_stone = minetest.get_content_id('mapgen_stone') + local mapgen_stone_itemstring = minetest.get_name_from_content_id(c_mapgen_stone) + + for name, def in pairs(minetest.registered_ores) do + local wherein = def.wherein + local biomes = def.biomes + + if type(def.wherein) == 'string' then + wherein = { wherein } + end + + -- Register the same ores what are defined for `mapgen_stone` + if + table.indexof(wherein, mapgen_stone_itemstring) > -1 + and not biomes + then + def.wherein = { 'everness:mineral_cave_stone' } + def.biomes = { 'everness:mineral_waters_under' } + def.y_max = y_max + def.y_min = y_min + + Everness:register_ore(def) + end + end +end) + -- Blob ore. -- These before scatter ores to avoid other ores in blobs. Everness:register_ore({ ore_type = 'blob', ore = 'everness:mineral_stone', - wherein = { 'mapgen_stone' }, + wherein = { 'everness:mineral_cave_stone' }, clust_scarcity = 16 * 16 * 16, clust_size = 5, y_max = y_max, @@ -68,9 +98,9 @@ Everness:register_ore({ -- Everness:register_decoration({ - name = 'everness:mineral_water_under_floors', + name = 'everness:mineral_waters_under_floors', deco_type = 'simple', - place_on = { 'default:stone' }, + place_on = { 'everness:mineral_cave_stone' }, sidelen = 16, place_offset_y = -1, fill_ratio = 10, @@ -83,70 +113,130 @@ Everness:register_decoration({ }, }) +Everness:register_decoration({ + name = 'everness:mineral_waters_under_volcanic_spike', + deco_type = 'simple', + place_on = { + 'everness:mineral_lava_stone', + 'everness:mineral_cave_stone' + }, + sidelen = 16, + noise_params = { + offset = -0.03, + scale = 0.09, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:mineral_waters_under' }, + spawn_by = 'air', + check_offset = 0, + num_spawn_by = 1, + decoration = { + 'everness:marker' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_floors', +}) + +Everness:register_decoration({ + name = 'everness:mineral_waters_under_lava_stone_spike', + deco_type = 'simple', + place_on = { + 'everness:mineral_lava_stone', + 'everness:mineral_cave_stone' + }, + sidelen = 16, + noise_params = { + offset = -0.015, + scale = 0.075, + spread = { x = 200, y = 200, z = 200 }, + seed = 329, + octaves = 3, + persist = 0.6 + }, + biomes = { 'everness:mineral_waters_under' }, + decoration = { + 'everness:marker' + }, + y_max = y_max, + y_min = y_min, + flags = 'all_floors', +}) + -- -- On Generated -- -local function find_walls(cpos) - local is_wall = function(node) - return node.name ~= 'air' and node.name ~= 'ignore' - end - - local dirs = { - { x = 1, z = 0 }, - { x = -1, z = 0 }, - { x = 0, z = 1 }, - { x = 0, z = -1 } - } - - local ret = {} - local mindist = { x = 0, z = 0 } - local min = function(a, b) - return a ~= 0 and math.min(a, b) or b - end - - for _, dir in ipairs(dirs) do - for i = 1, 9 do -- 9 = max room size / 2 - local pos = vector.add(cpos, {x=dir.x*i, y=0, z=dir.z*i}) - - -- continue in that direction until we find a wall-like node - local node = minetest.get_node(pos) - if is_wall(node) then - local front_below = vector.subtract(pos, {x=dir.x, y=1, z=dir.z}) - local above = vector.add(pos, {x=0, y=1, z=0}) - - -- check that it: - --- is at least 2 nodes high (not a staircase) - --- has a floor - if is_wall(minetest.get_node(front_below)) and is_wall(minetest.get_node(above)) then - table.insert(ret, {pos = pos, facing = {x=-dir.x, y=0, z=-dir.z}}) - if dir.z == 0 then - mindist.x = min(mindist.x, i-1) - else - mindist.z = min(mindist.z, i-1) - end - end - -- abort even if it wasn't a wall cause something is in the way - break - end - end - end - - return { - walls = ret, - size = { x = mindist.x * 2, z = mindist.z * 2 } - } -end - -local c_everness_pyrite_lantern = minetest.get_content_id('everness:pyrite_lantern') -local c_everness_cursed_pumpkin_lantern = minetest.get_content_id('everness:cursed_pumpkin_lantern') -local c_mapgen_stone = minetest.get_content_id('mapgen_stone') +-- Get the content IDs for the nodes used +local c_everness_wall_vine_cave_cyan = minetest.get_content_id('everness:wall_vine_cave_cyan') +local c_everness_wall_vine_cave_violet = minetest.get_content_id('everness:wall_vine_cave_violet') +local c_everness_wall_vine_cave_blue = minetest.get_content_id('everness:wall_vine_cave_blue') +local c_everness_mineral_lava_stone = minetest.get_content_id('everness:mineral_lava_stone') +local c_everness_mineral_cave_stone = minetest.get_content_id('everness:mineral_cave_stone') +local c_everness_lava_source = minetest.get_content_id('everness:lava_source') +local c_everness_marker = minetest.get_content_id('everness:marker') +local c_everness_volcanic_rock = minetest.get_content_id('everness:volcanic_rock') +local c_everness_volcanic_spike_1 = minetest.get_content_id('everness:volcanic_spike_1') +local c_everness_volcanic_spike_2 = minetest.get_content_id('everness:volcanic_spike_2') +local c_everness_volcanic_spike_3 = minetest.get_content_id('everness:volcanic_spike_3') +local c_everness_volcanic_spike_4 = minetest.get_content_id('everness:volcanic_spike_4') +local c_everness_volcanic_spike_5 = minetest.get_content_id('everness:volcanic_spike_5') +local c_everness_volcanic_spike_6 = minetest.get_content_id('everness:volcanic_spike_6') +local c_everness_volcanic_spike_7 = minetest.get_content_id('everness:volcanic_spike_7') +local c_everness_mineral_cave_stone_spike_1 = minetest.get_content_id('everness:mineral_cave_stone_spike_1') +local c_everness_mineral_cave_stone_spike_2 = minetest.get_content_id('everness:mineral_cave_stone_spike_2') +local c_everness_mineral_cave_stone_spike_3 = minetest.get_content_id('everness:mineral_cave_stone_spike_3') +local c_everness_mineral_cave_stone_spike_4 = minetest.get_content_id('everness:mineral_cave_stone_spike_4') +local c_everness_mineral_cave_stone_spike_5 = minetest.get_content_id('everness:mineral_cave_stone_spike_5') +local c_everness_mineral_cave_stone_spike_6 = minetest.get_content_id('everness:mineral_cave_stone_spike_6') +local c_everness_mineral_cave_stone_spike_7 = minetest.get_content_id('everness:mineral_cave_stone_spike_7') +-- Biome IDs local biome_id_everness_mineral_waters_under = minetest.get_biome_id('everness:mineral_waters_under') +-- Decoration IDs +local d_everness_mineral_waters_under_volcanic_spike = minetest.get_decoration_id('everness:mineral_waters_under_volcanic_spike') +local d_everness_mineral_waters_under_lava_stone_spike = minetest.get_decoration_id('everness:mineral_waters_under_lava_stone_spike') --- minetest.set_gen_notify({ --- large_cave_begin = true, --- large_cave_end = true --- }) +local volcanic_spike_place_on = minetest.registered_decorations['everness:mineral_waters_under_volcanic_spike'].place_on +volcanic_spike_place_on = type(volcanic_spike_place_on) == 'string' and { volcanic_spike_place_on } or volcanic_spike_place_on +local lava_stone_spike_place_on = minetest.registered_decorations['everness:mineral_waters_under_lava_stone_spike'].place_on +lava_stone_spike_place_on = type(lava_stone_spike_place_on) == 'string' and { lava_stone_spike_place_on } or lava_stone_spike_place_on + + +local wall_vines = { + c_everness_wall_vine_cave_cyan, + c_everness_wall_vine_cave_violet, + c_everness_wall_vine_cave_blue +} + +local volcanic_spike_map = { + c_everness_volcanic_rock, + c_everness_volcanic_spike_1, + c_everness_volcanic_spike_2, + c_everness_volcanic_spike_3, + c_everness_volcanic_spike_4, + c_everness_volcanic_spike_5, + c_everness_volcanic_spike_6, + c_everness_volcanic_spike_7 +} + +local lava_stone_spike_map = { + c_everness_mineral_cave_stone, + c_everness_mineral_cave_stone_spike_1, + c_everness_mineral_cave_stone_spike_2, + c_everness_mineral_cave_stone_spike_3, + c_everness_mineral_cave_stone_spike_4, + c_everness_mineral_cave_stone_spike_5, + c_everness_mineral_cave_stone_spike_6, + c_everness_mineral_cave_stone_spike_7 +} + +minetest.set_gen_notify({ decoration = true }, { + d_everness_mineral_waters_under_volcanic_spike, + d_everness_mineral_waters_under_lava_stone_spike +}) Everness:add_to_queue_on_generated({ name = 'everness:mineral_waters_under', @@ -156,7 +246,100 @@ Everness:add_to_queue_on_generated({ -- read/write to `data` what will be eventually saved (set_data) -- used for voxelmanip `data` manipulation on_data = function(minp, maxp, area, data, p2data, gennotify, rand, shared_args) + -- + -- Lakes + -- + for z = minp.z, maxp.z do + for y = minp.y, maxp.y do + for x = minp.x, maxp.x do + local ai = area:index(x, y, z) + local c_current = data[ai] + -- +Y, -Y, +X, -X, +Z, -Z + -- top, bottom, right, left, front, back + -- right + local c_right = data[ai + 1] + -- left + local c_left = data[ai - 1] + -- front + local c_front = data[ai + area.zstride] + -- back + local c_back = data[ai - area.zstride] + + local keep_going = true + local while_count = 1 + local max_dig_depth = 11 + + if + c_current == c_everness_mineral_lava_stone + and ( + c_right == c_everness_mineral_lava_stone + or c_right == c_everness_mineral_cave_stone + or c_right == c_everness_lava_source + ) + and ( + c_left == c_everness_mineral_lava_stone + or c_left == c_everness_mineral_cave_stone + or c_left == c_everness_lava_source + ) + and ( + c_front == c_everness_mineral_lava_stone + or c_front == c_everness_mineral_cave_stone + or c_front == c_everness_lava_source + ) + and ( + c_back == c_everness_mineral_lava_stone + or c_back == c_everness_mineral_cave_stone + or c_back == c_everness_lava_source + ) + then + -- dig below + while keep_going and while_count <= max_dig_depth do + local while_index = ai - area.ystride * while_count + + if + -- below + data[while_index] == c_everness_mineral_cave_stone + and ( + -- right + data[while_index + 1 + area.ystride] == c_everness_mineral_lava_stone + or data[while_index + 1 + area.ystride] == c_everness_lava_source + or data[while_index + 1 + area.ystride] == c_everness_mineral_cave_stone + ) + and ( + -- left + data[while_index - 1 + area.ystride] == c_everness_mineral_lava_stone + or data[while_index - 1 + area.ystride] == c_everness_lava_source + or data[while_index - 1 + area.ystride] == c_everness_mineral_cave_stone + ) + and ( + -- front + data[while_index + area.zstride + area.ystride] == c_everness_mineral_lava_stone + or data[while_index + area.zstride + area.ystride] == c_everness_lava_source + or data[while_index + area.zstride + area.ystride] == c_everness_mineral_cave_stone + ) + and ( + -- back + data[while_index - area.zstride + area.ystride] == c_everness_mineral_lava_stone + or data[while_index - area.zstride + area.ystride] == c_everness_lava_source + or data[while_index - area.zstride + area.ystride] == c_everness_mineral_cave_stone + ) + then + data[while_index + area.ystride] = c_everness_lava_source + else + keep_going = false + end + + while_count = while_count + 1 + end + end + end + end + end + + -- + -- Decorations + -- for y = minp.y, maxp.y do for z = minp.z, maxp.z do for x = minp.x, maxp.x do @@ -165,47 +348,116 @@ Everness:add_to_queue_on_generated({ if data[vi] == minetest.CONTENT_AIR and ( - data[vi + 1] == c_mapgen_stone - or data[vi - 1] == c_mapgen_stone - or data[vi + area.zstride] == c_mapgen_stone - or data[vi - area.zstride] == c_mapgen_stone + data[vi + 1] == c_everness_mineral_cave_stone + or data[vi - 1] == c_everness_mineral_cave_stone + or data[vi + area.zstride] == c_everness_mineral_cave_stone + or data[vi - area.zstride] == c_everness_mineral_cave_stone ) - and rand:next(0, 100) == 75 + and rand:next(0, 100) <= 25 then - local rand_c_node = rand:next(1, 2) == 1 and c_everness_pyrite_lantern or c_everness_cursed_pumpkin_lantern - data[vi] = rand_c_node + -- Decorate Walls + local dir = vector.zero() + + if data[vi + 1] == c_everness_mineral_cave_stone then + dir.x = 1 + end + + if data[vi - 1] == c_everness_mineral_cave_stone then + dir.x = -1 + end + + if data[vi + area.zstride] == c_everness_mineral_cave_stone then + dir.z = 1 + end + + if data[vi - area.zstride] == c_everness_mineral_cave_stone then + dir.z = -1 + end + + local rand_wall_vine = wall_vines[rand:next(1, #wall_vines)] + data[vi] = rand_wall_vine + p2data[vi] = minetest.dir_to_wallmounted(dir) end end end end - -- for _, p in ipairs(gennotify['large_cave_end'] or {}) do - -- data[area:indexp(p)] = c_everness_cursed_pumpkin_lantern - -- data[area:indexp(p)] = c_everness_cursed_pumpkin_lantern + -- + -- Spikes + -- + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_mineral_waters_under_volcanic_spike or '')] or {}) do + local idx = area:indexp(pos) + local idx_marker = idx + area.ystride + local place_on_node_name = minetest.get_name_from_content_id(data[idx]) - -- local minpos = vector.subtract(p, { x = 9, y = 9, z = 9 }) - -- local maxpos = vector.add(p, { x = 9, y = 9, z = 9 }) + if data[idx_marker] == c_everness_marker then + -- remove marker + data[idx_marker] = minetest.CONTENT_AIR - -- for y = minpos.y, maxpos.y do - -- for z = minpos.z, maxpos.z do - -- for x = minpos.x, maxpos.x do - -- local vi = area:index(x, y, z) + if table.indexof(volcanic_spike_place_on, place_on_node_name) ~= -1 then + local min_height = 3 + local max_height = 8 + local indexes = Everness.find_content_in_vm_area( + vector.new(pos.x, pos.y + 1, pos.z), + vector.new(pos.x, pos.y + max_height, pos.z), + { + minetest.CONTENT_AIR + }, + data, + area + ) - -- if - -- data[vi] == minetest.CONTENT_AIR - -- and ( - -- data[vi + 1] == c_mapgen_stone - -- or data[vi - 1] == c_mapgen_stone - -- or data[vi + area.zstride] == c_mapgen_stone - -- or data[vi - area.zstride] == c_mapgen_stone - -- ) - -- then - -- data[vi] = minetest.get_content_id('default:apple') - -- end - -- end - -- end - -- end - -- end + -- For smallest spike we need space above at least 3) + if #indexes > min_height then + local height = rand:next(min_height, #indexes) + local start_index = #volcanic_spike_map - height + 1 + local count = 0 + + for i = start_index, #volcanic_spike_map do + data[idx_marker + area.ystride * count] = volcanic_spike_map[i] + count = count + 1 + end + end + end + end + end + + for _, pos in ipairs(gennotify['decoration#' .. (d_everness_mineral_waters_under_lava_stone_spike or '')] or {}) do + local idx = area:indexp(pos) + local idx_marker = idx + area.ystride + local place_on_node_name = minetest.get_name_from_content_id(data[idx]) + + if data[idx_marker] == c_everness_marker then + -- remove marker + data[idx_marker] = minetest.CONTENT_AIR + + if table.indexof(lava_stone_spike_place_on, place_on_node_name) ~= -1 then + local min_height = 3 + local max_height = 8 + local indexes = Everness.find_content_in_vm_area( + vector.new(pos.x, pos.y + 1, pos.z), + vector.new(pos.x, pos.y + max_height, pos.z), + { + minetest.CONTENT_AIR + }, + data, + area + ) + + -- For smallest spike we need space above at least 3) + if #indexes > min_height then + local height = rand:next(min_height, #indexes) + local start_index = #lava_stone_spike_map - height + 1 + local count = 0 + + for i = start_index, #lava_stone_spike_map do + data[idx_marker + area.ystride * count] = lava_stone_spike_map[i] + count = count + 1 + end + end + end + end + end end, -- read-only (but cant and should not manipulate) voxelmanip `data` -- used for `place_schematic_on_vmanip` which will invalidate `data` @@ -216,6 +468,6 @@ Everness:add_to_queue_on_generated({ -- Used for direct manipulation of the world chunk nodes where the -- definitions of nodes are available and node callback can be executed -- or e.g. for `minetest.fix_light` - after_write_to_map = function(shared_args, gennotify) + after_write_to_map = function(shared_args, gennotify, rand) end }) diff --git a/models/everness_vine_wall.obj b/models/everness_vine_wall.obj new file mode 100644 index 0000000..a099a6a --- /dev/null +++ b/models/everness_vine_wall.obj @@ -0,0 +1,109 @@ +# Blender v2.83.20 OBJ File: 'everness_better_vine_1.blend' +# www.blender.org +mtllib everness_vine_wall.mtl +o Plane +v 0.470000 -0.490000 -0.470000 +v -0.470000 -0.490000 -0.470000 +v 0.470000 -0.490000 0.470000 +v -0.470000 -0.490000 0.470000 +v -0.752156 -0.490000 0.461451 +v 0.751842 -0.492615 0.461221 +v -0.751842 -0.272978 0.044555 +v 0.752156 -0.275593 0.044326 +v 0.752156 -0.275593 -0.073174 +v -0.751842 -0.272978 -0.072945 +v 0.751842 -0.492615 0.343721 +v -0.752156 -0.490000 0.343951 +v -0.752156 -0.490000 0.226451 +v 0.751842 -0.492615 0.226221 +v -0.751842 -0.272978 -0.190445 +v 0.752156 -0.275593 -0.190674 +v 0.752156 -0.275593 -0.308174 +v -0.751842 -0.272978 -0.307945 +v 0.751842 -0.492615 0.108721 +v -0.752156 -0.490000 0.108951 +v -0.752156 -0.490000 -0.008549 +v 0.751842 -0.492615 -0.008779 +v -0.751842 -0.272978 -0.425445 +v 0.752156 -0.275593 -0.425674 +v 0.752156 -0.275593 -0.543174 +v -0.751842 -0.272978 -0.542945 +v 0.751842 -0.492615 -0.126279 +v -0.752156 -0.490000 -0.126049 +v -0.752156 -0.490000 -0.243549 +v 0.751842 -0.492615 -0.243779 +v -0.751842 -0.272978 -0.660445 +v 0.752156 -0.275593 -0.660674 +v 0.752156 -0.275593 -0.778174 +v -0.751842 -0.272978 -0.777945 +v 0.751842 -0.492615 -0.361279 +v -0.752156 -0.490000 -0.361050 +v 0.752149 -0.315254 -0.905760 +v -0.751849 -0.312629 -0.905760 +v 0.751848 -0.487510 -0.468464 +v -0.752149 -0.484885 -0.468463 +vt -0.000000 0.727273 +vt 1.000000 0.818182 +vt -0.000000 0.818182 +vt 1.000000 0.636364 +vt 0.000000 0.727273 +vt 0.000000 0.636364 +vt 1.000000 0.545455 +vt 0.000000 0.636364 +vt 0.000000 0.545455 +vt 1.000000 0.454546 +vt 0.000000 0.545455 +vt 0.000000 0.454546 +vt 0.000000 0.363636 +vt 1.000000 0.454546 +vt 0.000000 0.454546 +vt 0.000000 0.272727 +vt 1.000000 0.363636 +vt 0.000000 0.363636 +vt 1.000000 0.181818 +vt 0.000000 0.272727 +vt 0.000000 0.181818 +vt 1.000000 0.090909 +vt 0.000000 0.181818 +vt 0.000000 0.090909 +vt 0.000000 -0.000000 +vt 1.000000 0.090909 +vt 0.000000 0.090909 +vt 0.166667 0.818182 +vt 0.833333 1.000000 +vt 0.833333 0.818182 +vt 1.000000 0.727273 +vt 1.000000 0.727273 +vt 1.000000 0.636364 +vt 1.000000 0.545455 +vt 1.000000 0.363636 +vt 1.000000 0.272727 +vt 1.000000 0.272727 +vt 1.000000 0.181818 +vt 1.000000 0.000000 +vt 0.166667 1.000000 +vn 0.0016 0.8870 0.4617 +vn 0.0016 0.9304 0.3665 +vn 0.0000 1.0000 -0.0000 +usemtl leaves +s off +f 8/1/1 5/2/1 6/3/1 +f 10/4/1 11/5/1 9/6/1 +f 15/7/1 14/8/1 16/9/1 +f 18/10/1 19/11/1 17/12/1 +f 24/13/1 21/14/1 22/15/1 +f 25/16/1 28/17/1 27/18/1 +f 31/19/1 30/20/1 32/21/1 +f 34/22/1 35/23/1 33/24/1 +f 37/25/2 40/26/2 39/27/2 +f 3/28/3 2/29/3 4/30/3 +f 8/1/1 7/31/1 5/2/1 +f 10/4/1 12/32/1 11/5/1 +f 15/7/1 13/33/1 14/8/1 +f 18/10/1 20/34/1 19/11/1 +f 24/13/1 23/35/1 21/14/1 +f 25/16/1 26/36/1 28/17/1 +f 31/19/1 29/37/1 30/20/1 +f 34/22/1 36/38/1 35/23/1 +f 37/25/2 38/39/2 40/26/2 +f 3/28/3 1/40/3 2/29/3 diff --git a/nodes.lua b/nodes.lua index d19494e..97650e5 100644 --- a/nodes.lua +++ b/nodes.lua @@ -2625,7 +2625,7 @@ Everness:register_node('everness:flame_permanent_blue', { -- Mapgen Marker Everness:register_node('everness:marker', { - drawtype = 'airlike', + -- drawtype = 'airlike', description = 'Marker for mapgen', tiles = { 'everness_lootchest_marker_top.png', 'everness_lootchest_marker_side.png' }, groups = { dig_immediate = 3, not_in_creative_inventory = 1 }, @@ -11478,6 +11478,121 @@ Everness:register_node('everness:mineral_water_flowing', { sounds = Everness.node_sound_water_defaults(), }) +minetest.register_node('everness:lava_source', { + description = S('Lava Source'), + drawtype = 'liquid', + tiles = { + { + name = 'everness_lava_source_animated.png', + backface_culling = false, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6, + }, + align_style = 'world', + scale = 2 + }, + { + name = 'everness_lava_source_animated.png', + backface_culling = true, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6, + }, + align_style = 'world', + scale = 2 + }, + }, + paramtype = 'light', + light_source = 13, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = '', + drowning = 1, + liquidtype = 'source', + liquid_alternative_flowing = 'everness:lava_flowing', + liquid_alternative_source = 'everness:lava_source', + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = { a = 191, r = 255, g = 64, b = 0 }, + groups = { + lava = 3, + liquid = 2, + igniter = 1 + }, + liquid_range = 2, +}) + +minetest.register_node('everness:lava_flowing', { + description = S('Flowing Lava'), + drawtype = 'flowingliquid', + tiles = { + { + name = 'everness_lava_source_animated.png', + align_style = 'world', + scale = 2 + } + }, + special_tiles = { + { + name = 'everness_lava_flowing_animated.png', + backface_culling = false, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + align_style = 'world', + scale = 2 + }, + { + name = 'everness_lava_flowing_animated.png', + backface_culling = true, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + align_style = 'world', + scale = 2 + }, + }, + paramtype = 'light', + paramtype2 = 'flowingliquid', + light_source = 13, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = '', + drowning = 1, + liquidtype = 'flowing', + liquid_alternative_flowing = 'everness:lava_flowing', + liquid_alternative_source = 'everness:lava_source', + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = { a = 191, r = 255, g = 64, b = 0 }, + groups = { + lava = 3, + liquid = 2, + igniter = 1, + not_in_creative_inventory = 1 + }, + liquid_range = 2, +}) + Everness:register_node('everness:water_geyser', { description = S('Water') .. ' ' .. S('Geyser'), drawtype = 'mesh', diff --git a/nodes_mineral_waters_under.lua b/nodes_mineral_waters_under.lua index 25270af..2922f49 100644 --- a/nodes_mineral_waters_under.lua +++ b/nodes_mineral_waters_under.lua @@ -16,17 +16,86 @@ local S = minetest.get_translator(minetest.get_current_modname()) -Everness:register_node('everness:mineral_lava_stone', { - description = S('Mineral Lava Stone'), - -- Textures of node; +Y, -Y, +X, -X, +Z, -Z +Everness:register_node('everness:mineral_cave_stone', { + description = S('Mineral Cave Stone'), tiles = { { - name = 'everness_mineral_lava_stone.png', + name = 'everness_mineral_stone_under_top.png', align_style = 'world', scale = 2 }, { - name = 'everness_mineral_lava_stone.png', + name = 'everness_mineral_stone_under_top.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_stone_under.png', + align_style = 'world', + scale = 2 + } + }, + drop = 'everness:mineral_cave_cobblestone', + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_cave_cobblestone', { + description = S('Mineral Cave Cobblestone'), + is_ground_content = false, + tiles = { + { + name = 'everness_mineral_cobblestone_under.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 2, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +Everness:register_node('everness:mineral_lava_stone', { + description = S('Mineral Lava Stone with lava'), + is_ground_content = false, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_lava_stone_animated.png', + align_style = 'world', + scale = 2, + animation = { + type = 'vertical_frames', + aspect_w = 16, + aspect_h = 16, + length = 6.4, + }, + }, + { + name = 'everness_mineral_lava_stone_bottom.png', align_style = 'world', scale = 2 }, @@ -36,7 +105,7 @@ Everness:register_node('everness:mineral_lava_stone', { scale = 2 } }, - -- drop = 'everness:coral_desert_cobble', + drop = 'everness:mineral_lava_stone_dry', groups = { -- MTG cracky = 3, @@ -53,3 +122,162 @@ Everness:register_node('everness:mineral_lava_stone', { light_source = 3, sounds = Everness.node_sound_stone_defaults(), }) + +Everness:register_node('everness:mineral_lava_stone_dry', { + description = S('Mineral Lava Stone without lava'), + is_ground_content = false, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_lava_stone_bottom.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), +}) + +for i = 1, 7 do + Everness:register_node('everness:volcanic_spike_' .. i, { + description = S('Volcanic Spike') .. ' ' .. i, + tiles = { 'everness_volcanic_rock.png' }, + sounds = Everness.node_sound_stone_defaults(), + drawtype = 'nodebox', + groups = { + -- MTG + cracky = 1, + level = 2, + stone = 1, + -- MCL + pickaxey = 5, + building_block = 1, + material_stone = 1 + }, + _mcl_blast_resistance = 1200, + _mcl_hardness = 50, + is_ground_content = false, + node_box = { + type = 'fixed', + fixed = { + { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + } + } + }, + selection_box = { + type = 'fixed', + fixed = { + (-8 + i - 1) / 16, + -8 / 16, + (-8 + i - 1) / 16, + (8 - i + 1) / 16, + 8 / 16, + (8 - i + 1) / 16 + } + }, + collision_box = { + type = 'fixed', + fixed = { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + }, + }, + }) +end + +for i = 1, 7 do + Everness:register_node('everness:mineral_cave_stone_spike_' .. i, { + description = S('Mineral Lava Stone Spike') .. ' ' .. i, + -- Textures of node; +Y, -Y, +X, -X, +Z, -Z + tiles = { + { + name = 'everness_mineral_stone_under_top.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_stone_under_top.png', + align_style = 'world', + scale = 2 + }, + { + name = 'everness_mineral_stone_under.png', + align_style = 'world', + scale = 2 + } + }, + groups = { + -- MTG + cracky = 3, + -- MCL + pickaxey = 1, + building_block = 1, + material_stone = 1, + -- ALL + stone = 1, + }, + _mcl_blast_resistance = 6, + _mcl_hardness = 1.5, + _mcl_silk_touch_drop = true, + sounds = Everness.node_sound_stone_defaults(), + drawtype = 'nodebox', + is_ground_content = false, + node_box = { + type = 'fixed', + fixed = { + { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + } + } + }, + selection_box = { + type = 'fixed', + fixed = { + (-8 + i - 1) / 16, + -8 / 16, + (-8 + i - 1) / 16, + (8 - i + 1) / 16, + 8 / 16, + (8 - i + 1) / 16 + } + }, + collision_box = { + type = 'fixed', + fixed = { + (-8 + i) / 16, + -8 / 16, + (-8 + i) / 16, + (8 - i) / 16, + 8 / 16, + (8 - i) / 16 + }, + }, + }) +end diff --git a/skybox.lua b/skybox.lua index 6acb7db..6fa93c3 100644 --- a/skybox.lua +++ b/skybox.lua @@ -729,6 +729,21 @@ local skybox_defs = { scale = 0.5 }, }, + ['everness:mineral_waters_under'] = { + sky_parameters = { + type = 'regular', + sky_color = { + day_sky = '#8B1408', + day_horizon = '#b2380a', + dawn_sky = '#8B1408', + dawn_horizon = '#b2380a', + night_sky = '#A3609E', + night_horizon = '#C7A8D9', + fog_sun_tint = '#8B1408', + fog_moon_tint = '#520E49' + } + } + }, } local function should_flip(player) diff --git a/sounds/everness_lava.1.ogg b/sounds/everness_lava.1.ogg new file mode 100644 index 0000000..6e8185e Binary files /dev/null and b/sounds/everness_lava.1.ogg differ diff --git a/sounds/everness_lava.2.ogg b/sounds/everness_lava.2.ogg new file mode 100644 index 0000000..7993d79 Binary files /dev/null and b/sounds/everness_lava.2.ogg differ diff --git a/textures/everness_lava_flowing_animated.png b/textures/everness_lava_flowing_animated.png new file mode 100644 index 0000000..aaef22e Binary files /dev/null and b/textures/everness_lava_flowing_animated.png differ diff --git a/textures/everness_lava_source_animated.png b/textures/everness_lava_source_animated.png new file mode 100644 index 0000000..9b02ec3 Binary files /dev/null and b/textures/everness_lava_source_animated.png differ diff --git a/textures/everness_mineral_cobblestone_under.png b/textures/everness_mineral_cobblestone_under.png new file mode 100644 index 0000000..f555844 Binary files /dev/null and b/textures/everness_mineral_cobblestone_under.png differ diff --git a/textures/everness_mineral_lava_stone.png b/textures/everness_mineral_lava_stone.png deleted file mode 100644 index 861a967..0000000 Binary files a/textures/everness_mineral_lava_stone.png and /dev/null differ diff --git a/textures/everness_mineral_lava_stone_animated.png b/textures/everness_mineral_lava_stone_animated.png new file mode 100644 index 0000000..8fd6416 Binary files /dev/null and b/textures/everness_mineral_lava_stone_animated.png differ diff --git a/textures/everness_mineral_lava_stone_bottom.png b/textures/everness_mineral_lava_stone_bottom.png new file mode 100644 index 0000000..7daef6c Binary files /dev/null and b/textures/everness_mineral_lava_stone_bottom.png differ diff --git a/textures/everness_mineral_lava_stone_side.png b/textures/everness_mineral_lava_stone_side.png index 4394f73..4964dac 100644 Binary files a/textures/everness_mineral_lava_stone_side.png and b/textures/everness_mineral_lava_stone_side.png differ diff --git a/textures/everness_mineral_stone_under.png b/textures/everness_mineral_stone_under.png new file mode 100644 index 0000000..49bb611 Binary files /dev/null and b/textures/everness_mineral_stone_under.png differ diff --git a/textures/everness_mineral_stone_under_top.png b/textures/everness_mineral_stone_under_top.png new file mode 100644 index 0000000..2ed666d Binary files /dev/null and b/textures/everness_mineral_stone_under_top.png differ diff --git a/textures/everness_wall_vine_cave_blue.png b/textures/everness_wall_vine_cave_blue.png new file mode 100644 index 0000000..39df69f Binary files /dev/null and b/textures/everness_wall_vine_cave_blue.png differ diff --git a/textures/everness_wall_vine_cave_cyan.png b/textures/everness_wall_vine_cave_cyan.png new file mode 100644 index 0000000..0e8e79c Binary files /dev/null and b/textures/everness_wall_vine_cave_cyan.png differ diff --git a/textures/everness_wall_vine_cave_green.png b/textures/everness_wall_vine_cave_green.png new file mode 100644 index 0000000..e42458f Binary files /dev/null and b/textures/everness_wall_vine_cave_green.png differ diff --git a/textures/everness_wall_vine_cave_violet.png b/textures/everness_wall_vine_cave_violet.png new file mode 100644 index 0000000..856ab75 Binary files /dev/null and b/textures/everness_wall_vine_cave_violet.png differ diff --git a/vines_wall.lua b/vines_wall.lua new file mode 100644 index 0000000..73b42bb --- /dev/null +++ b/vines_wall.lua @@ -0,0 +1,111 @@ +--[[ + Everness. Never ending discovery in Everness mapgen. + Copyright (C) 2024 SaKeL + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + +--]] + +local S = minetest.get_translator(minetest.get_current_modname()) + +local function register_vine_wall(name, def, overrides) + local _def = table.copy(def) + local _name = name + + _def.short_description = _def.short_description or _def.description + _def.drawtype = 'mesh' + _def.tiles = _def.tiles or { + { name = 'everness_' .. _name .. '.png' } + } + _def.mesh = 'everness_vine_wall.obj' + _def.use_texture_alpha = 'clip' + _def.paramtype = 'light' + _def.paramtype2 = 'wallmounted' + _def.sunlight_propagates = true + _def.walkable = false + _def.climbable = true + _def.buildable_to = false + _def.sounds = Everness.node_sound_leaves_defaults() + _def.groups = { + -- MTG + vine = 1, + snappy = 3, + -- Everness + falling_vines = 1, + no_silktouch = 1, + -- X Farming + compost = 30, + -- MCL + handy = 1, + axey = 1, + shearsy = 1, + swordy = 1, + deco_block = 1, + dig_by_piston = 1, + destroy_by_lava_flow = 1, + compostability = 30, + fire_encouragement = 15, + fire_flammability = 100, + -- ALL + flammable = 2, + attached_node = 1, + } + _def._mcl_blast_resistance = 0.2 + _def._mcl_hardness = 0.2 + _def.selection_box = { + type = 'fixed', + fixed = { + -8 / 16, + -8 / 16, + -8 / 16, + 8 / 16, + -5 / 16, + 8 / 16 + } + } + _def.collision_box = { + type = 'fixed', + fixed = { + -8 / 16, + -8 / 16, + -8 / 16, + 8 / 16, + -5 / 16, + 8 / 16 + } + } + _def.waving = 3 + _def.light_source = _def.light_source or 4 + + _def.on_rotate = function() + return false + end + + Everness:register_node('everness:' .. _name, _def) +end + +-- Cave vine + +register_vine_wall('wall_vine_cave_green', { + description = S('Wall Cave Vine Green'), +}) + +register_vine_wall('wall_vine_cave_blue', { + description = S('Wall Cave Vine Blue'), +}) + +register_vine_wall('wall_vine_cave_cyan', { + description = S('Wall Cave Vine Cyan'), +}) + +register_vine_wall('wall_vine_cave_violet', { + description = S('Wall Cave Vine Violet'), +})